From feb8c149e1dc574bf7166ddb808141b93685221a Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 22 Feb 2024 14:17:12 +0800 Subject: [PATCH 01/40] scratch_slots reservation: - allow module constants args, and in args to urange within - handle negatives - check for third arg to urange being non-zero to avoid crash - allow just a single urange call - allow list exprs - add tests for the above and tests for failure cases start on state reservation add stubs for state key & descriptions --- examples/sizes.txt | 1 + src/puya/awst_build/main.py | 13 +- src/puya/awst_build/module.py | 121 +++++++++------ src/puyapy-stubs/_contract.pyi | 52 ++++++- src/puyapy-stubs/_state.pyi | 34 +++- test_cases/scratch_slots/contract.py | 5 +- test_cases/scratch_slots/contract2.py | 3 +- test_cases/scratch_slots/contract3.py | 9 ++ .../scratch_slots/out/MyContract.approval.mir | 94 +++++------ .../out/MyContract.approval.teal | 20 +-- .../scratch_slots/out/MyContract.clear.mir | 4 +- .../scratch_slots/out/MyContract.clear.teal | 2 +- .../out/MyContract.destructured.ir | 10 +- .../scratch_slots/out/MyContract.ssa.ir | 14 +- .../out/MyContract.ssa.opt_pass_1.ir | 10 +- .../out/MyContract2.approval.mir | 94 +++++------ .../out/MyContract2.approval.teal | 20 +-- .../scratch_slots/out/MyContract2.clear.mir | 4 +- .../scratch_slots/out/MyContract2.clear.teal | 2 +- .../out/MyContract2.destructured.ir | 10 +- .../scratch_slots/out/MyContract2.ssa.ir | 14 +- .../out/MyContract2.ssa.opt_pass_1.ir | 10 +- .../out/MyOtherContract.approval.mir | 9 ++ .../out/MyOtherContract.approval.teal | 7 + .../out/MyOtherContract.clear.mir | 9 ++ .../out/MyOtherContract.clear.teal | 7 + .../out/MyOtherContract.destructured.ir | 10 ++ .../scratch_slots/out/MyOtherContract.ssa.ir | 10 ++ test_cases/scratch_slots/out/contract.awst | 3 + test_cases/scratch_slots/out/contract3.awst | 16 ++ .../out_O2/MyContract.destructured.ir | 10 +- .../out_O2/MyContract2.destructured.ir | 10 +- .../out_O2/MyOtherContract.approval.teal | 5 + .../out_O2/MyOtherContract.clear.teal | 5 + .../out_O2/MyOtherContract.destructured.ir | 10 ++ .../out_unoptimized/MyContract.approval.teal | 20 +-- .../out_unoptimized/MyContract.clear.teal | 2 +- .../MyContract.destructured.ir | 14 +- .../out_unoptimized/MyContract2.approval.teal | 20 +-- .../out_unoptimized/MyContract2.clear.teal | 2 +- .../MyContract2.destructured.ir | 14 +- .../MyOtherContract.approval.teal | 7 + .../MyOtherContract.clear.teal | 7 + .../MyOtherContract.destructured.ir | 10 ++ test_cases/scratch_slots/puya.log | 146 ++++++++++++------ .../scratch_slot_reservations.test | 60 +++++++ 46 files changed, 639 insertions(+), 320 deletions(-) create mode 100644 test_cases/scratch_slots/contract3.py create mode 100644 test_cases/scratch_slots/out/MyOtherContract.approval.mir create mode 100644 test_cases/scratch_slots/out/MyOtherContract.approval.teal create mode 100644 test_cases/scratch_slots/out/MyOtherContract.clear.mir create mode 100644 test_cases/scratch_slots/out/MyOtherContract.clear.teal create mode 100644 test_cases/scratch_slots/out/MyOtherContract.destructured.ir create mode 100644 test_cases/scratch_slots/out/MyOtherContract.ssa.ir create mode 100644 test_cases/scratch_slots/out/contract3.awst create mode 100644 test_cases/scratch_slots/out_O2/MyOtherContract.approval.teal create mode 100644 test_cases/scratch_slots/out_O2/MyOtherContract.clear.teal create mode 100644 test_cases/scratch_slots/out_O2/MyOtherContract.destructured.ir create mode 100644 test_cases/scratch_slots/out_unoptimized/MyOtherContract.approval.teal create mode 100644 test_cases/scratch_slots/out_unoptimized/MyOtherContract.clear.teal create mode 100644 test_cases/scratch_slots/out_unoptimized/MyOtherContract.destructured.ir create mode 100644 tests/test_expected_output/scratch_slot_reservations.test diff --git a/examples/sizes.txt b/examples/sizes.txt index 748946002f..0b35cbf393 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -47,6 +47,7 @@ nested_loops/Nested 243 201 201 reversed_iteration 768 585 585 scratch_slots 70 67 67 scratch_slots/2 70 67 67 +scratch_slots/MyOther 8 8 8 simple 81 29 29 simplish/Simplish 747 719 720 ssa 286 230 230 diff --git a/src/puya/awst_build/main.py b/src/puya/awst_build/main.py index 52268e0f42..4a0fb40f9d 100644 --- a/src/puya/awst_build/main.py +++ b/src/puya/awst_build/main.py @@ -22,9 +22,7 @@ def transform_ast(compile_context: CompileContext) -> dict[str, Module]: # (from a type-checkers perspective, anyway) result = dict[str, Module]() ctx: ASTConversionContext = attrs_extend( - ASTConversionContext, - compile_context, - module_asts=result, + ASTConversionContext, compile_context, module_asts=result ) user_modules = {} for scc_module_names in mypy.build.sorted_components(ctx.parse_result.graph): @@ -49,15 +47,18 @@ def transform_ast(compile_context: CompileContext) -> dict[str, Module]: elif embedded_src := EMBEDDED_MODULES.get(module.name): logger.debug(f"Building AWST for embedded puyapy lib at {module_rel_path}") module._fullname = embedded_src.puya_module_name # noqa: SLF001 - result[module.name] = ModuleASTConverter.convert(ctx, module) + result[embedded_src.puya_module_name] = ModuleASTConverter.convert(ctx, module) else: user_modules[module_name] = module + for _, _ in user_modules.items(): + # TODO: pre-parse step: extract state info, constants, etc + pass for module_name, module in user_modules.items(): logger.debug(f"Building AWST for module {module_name}") - errors_before_module = compile_context.errors.num_errors + errors_before_module = ctx.errors.num_errors module_awst = ModuleASTConverter.convert(ctx, module) validate_awst(ctx, module_awst) - had_errors = compile_context.errors.num_errors != errors_before_module + had_errors = ctx.errors.num_errors > errors_before_module if ctx.options.output_awst and not had_errors: output_awst(module_awst, ctx.options) result[module_name] = module_awst diff --git a/src/puya/awst_build/module.py b/src/puya/awst_build/module.py index 4987851cc6..11ae2013a3 100644 --- a/src/puya/awst_build/module.py +++ b/src/puya/awst_build/module.py @@ -1,5 +1,4 @@ import typing as t -from collections.abc import Iterable import mypy.nodes import mypy.types @@ -18,7 +17,7 @@ ) from puya.awst_build import constants from puya.awst_build.base_mypy_visitor import BaseMyPyVisitor -from puya.awst_build.context import ASTConversionContext +from puya.awst_build.context import ASTConversionContext, ASTConversionModuleContext from puya.awst_build.contract import ContractASTConverter, ContractClassOptions from puya.awst_build.exceptions import UnsupportedASTError from puya.awst_build.subroutine import FunctionASTConverter @@ -30,7 +29,6 @@ get_unaliased_fullname, ) from puya.errors import CodeError, InternalError -from puya.parse import SourceLocation from puya.utils import StableSet logger = structlog.get_logger() @@ -180,17 +178,23 @@ def _process_contract_class_options(self, cdef: mypy.nodes.ClassDef) -> Contract else: self._error("Invalid type for name=", kw_expr) case "scratch_slots": - if not isinstance(kw_expr, mypy.nodes.TupleExpr): - self._error( - "scratch_slots should be a tuple of slot numbers or " - "slot number ranges", - kw_expr, - ) + if isinstance(kw_expr, mypy.nodes.TupleExpr | mypy.nodes.ListExpr): + slot_items = kw_expr.items else: - for item in kw_expr.items: - scratch_slot_reservations |= _map_scratch_space_reservation( - item, self._location(item) + slot_items = [kw_expr] + for item_expr in slot_items: + slots = _map_scratch_space_reservation(self.context, item_expr) + if not slots: + self._error("Slot range is empty", item_expr) + elif (min(slots) < 0) or (max(slots) > MAX_SCRATCH_SLOT_NUMBER): + self._error( + f"Invalid scratch slot reservation." + f" Reserved range must fall entirely between 0" + f" and {MAX_SCRATCH_SLOT_NUMBER}", + item_expr, ) + else: + scratch_slot_reservations |= slots case _: self._error("Unrecognised class keyword", kw_expr) for base in cdef.info.bases: @@ -597,47 +601,66 @@ def visit_lambda_expr(self, expr: mypy.nodes.LambdaExpr) -> ConstantValue: return self._unsupported(expr) -def _map_scratch_space_reservation( - expr: mypy.nodes.Expression, source_location: SourceLocation -) -> Iterable[int]: - def check_slot_is_in_range(slot: int) -> None: - if not (0 <= slot <= MAX_SCRATCH_SLOT_NUMBER): +def _get_int_arg( + context: ASTConversionModuleContext, arg_expr: mypy.nodes.Expression, *, error_msg: str +) -> int: + if isinstance(arg_expr, mypy.nodes.UnaryExpr): + if arg_expr.op == "-": + return -_get_int_arg(context, arg_expr.expr, error_msg=error_msg) + elif isinstance(arg_expr, mypy.nodes.IntExpr): + return arg_expr.value + elif ( + isinstance(arg_expr, mypy.nodes.NameExpr) + and arg_expr.kind == mypy.nodes.GDEF + and isinstance(arg_expr.node, mypy.nodes.Var) + ): + const_value = context.constants.get(arg_expr.fullname) + if isinstance(const_value, int): + return const_value + if const_value is None: raise CodeError( - f"Invalid scratch slot {slot}. Reserved range must fall entirely between " - f"0 and {MAX_SCRATCH_SLOT_NUMBER}", - source_location, + f"not a known constant value: {arg_expr.name}" + f" (qualified source name: {arg_expr.fullname})", + context.node_location(arg_expr), ) + # other types: fall through to default error message + raise CodeError(error_msg, context.node_location(arg_expr)) - def map_urange_args(args: list[mypy.nodes.Expression]) -> range: - match args: - case [mypy.nodes.IntExpr(value=stop)]: - check_slot_is_in_range(stop - 1) - return range(stop) - case [mypy.nodes.IntExpr(value=start), mypy.nodes.IntExpr(value=stop)]: - check_slot_is_in_range(start) - check_slot_is_in_range(stop - 1) - return range(start, stop) - case [ - mypy.nodes.IntExpr(value=start), - mypy.nodes.IntExpr(value=stop), - mypy.nodes.IntExpr(value=step), - ]: - the_range = range(start, stop, step) - for slot in the_range: - check_slot_is_in_range(slot) - return the_range - case _: - raise CodeError("Unexpected arguments for urange", source_location) +def _map_scratch_space_reservation( + context: ASTConversionModuleContext, expr: mypy.nodes.Expression +) -> list[int]: + expr_loc = context.node_location(expr) match expr: - case mypy.nodes.IntExpr(value): - check_slot_is_in_range(value) - return [value] case mypy.nodes.CallExpr( - callee=mypy.nodes.RefExpr() as expr, args=args - ) if get_unaliased_fullname(expr) == constants.URANGE: - return map_urange_args(args) + callee=mypy.nodes.RefExpr() as callee, args=args + ) if get_unaliased_fullname(callee) == constants.URANGE: + if not args: + raise CodeError("Expected at least one argument to urange", expr_loc) + if len(args) > 3: + raise CodeError("Expected at most three arguments to urange", expr_loc) + int_args = [ + _get_int_arg( + context, + arg_expr, + error_msg=( + "Unexpected argument for urange:" + " expected an in integer literal or module constant reference" + ), + ) + for arg_expr in args + ] + if len(int_args) == 3 and int_args[-1] == 0: + raise CodeError("urange arg 3 must not be zero", context.node_location(args[-1])) + return list(range(*int_args)) case _: - raise CodeError( - "Unexpected value: Expected int literal or urange expression", source_location - ) + return [ + _get_int_arg( + context, + expr, + error_msg=( + "Unexpected value:" + " Expected int literal, module constant reference, or urange expression" + ), + ) + ] diff --git a/src/puyapy-stubs/_contract.pyi b/src/puyapy-stubs/_contract.pyi index 260be1e1aa..27ed6e4a14 100644 --- a/src/puyapy-stubs/_contract.pyi +++ b/src/puyapy-stubs/_contract.pyi @@ -1,5 +1,6 @@ import abc -from collections.abc import Sequence +import dataclasses +import typing from puyapy import UInt64, urange @@ -7,8 +8,44 @@ class Contract(abc.ABC): """Base class for an Algorand Smart Contract""" def __init_subclass__( - cls, name: str | None = None, scratch_slots: Sequence[int | urange] = (), **kwargs: object - ): ... + cls, + *, + name: typing.LiteralString | None = None, + scratch_slots: urange | tuple[int | urange, ...] | list[int | urange] = (), + reserve_state: ReserveState = ReserveState(), + **kwargs: object, + ): + """ + When declaring a Contract subclass, options and configuration are passed in + the base class list: + + ```python + class MyContract(puyapy.Contract, name="CustomName"): + ... + ``` + + :param name: will affect the output TEAL file name if there are multiple non-abstract contracts + in the same file. + If the contract is a subclass of puyapy.ARC4Contract, `name` will also be used as the + contract name in the ARC-32 application.json, instead of the class name. + + :param scratch_slots: allows you to mark a slot ID or range of slot IDs as "off limits" to Puya. + These slot ID(s) will never be written to or otherwise manipulating by the compiler itself. + This is particularly useful in combination with `puyapy.op.gload_bytes` / `puyapy.op.gload_uint64` + which lets a contract in a group transaction read from the scratch slots of another contract + that occurs earlier in the transaction group. + + In the case of inheritance, scratch slots reserved become cumulative. It is not an error + to have overlapping ranges or values either, so if a base class contract reserves slots + 0-5 inclusive and the derived contract reserves 5-10 inclusive, then within the derived + contract all slots 0-10 will be marked as reserved. + + :param reserve_state: when using global or local state through one of the provided PuyaPy + abstractions (i.e. assigning to `self.`, either as a raw value for global state or with + puyapy.GlobalState or puyapy.LocalState), these are tallied up and automatically counted + to put the correct + """ + # TODO: finish the above docstring @abc.abstractmethod def approval_program(self) -> UInt64 | bool: """Represents the program called for all transactions @@ -16,3 +53,12 @@ class Contract(abc.ABC): @abc.abstractmethod def clear_state_program(self) -> UInt64 | bool: """Represents the program called when `OnCompletion` == `ClearState`""" + +@dataclasses.dataclass(frozen=True) +class ReserveState: + """Optionally reserve""" + + global_uint64: int | None = None + global_bytes: int | None = None + local_uint64: int | None = None + local_bytes: int | None = None diff --git a/src/puyapy-stubs/_state.pyi b/src/puyapy-stubs/_state.pyi index 75d6f2d54c..4ae45e5d24 100644 --- a/src/puyapy-stubs/_state.pyi +++ b/src/puyapy-stubs/_state.pyi @@ -1,14 +1,20 @@ import typing -from puyapy import Account, UInt64 +from puyapy import Account, UInt64, Bytes, BytesBacked -_T = typing.TypeVar("_T") +_T = typing.TypeVar("_T", bound=UInt64 | Bytes | BytesBacked) class LocalState(typing.Generic[_T]): """Local state associated with the application and an account""" - def __init__(self, type_: type[_T], /) -> None: - """Must be initialized with the type that will be stored + def __init__( + self, + type_: type[_T], + /, + key: typing.LiteralString | bytes | None = None, + description: typing.LiteralString | None = None, + ) -> None: + """Declare the local state key and it's associated type ```python self.names = LocalState(puyapy.Bytes) @@ -74,11 +80,23 @@ class GlobalState(typing.Generic[_T]): """ @typing.overload - def __init__(self, type_: type[_T], /) -> None: - """Can be initialized with the type of the value to store, with the value unset""" + def __init__( + self, + type_: type[_T], + /, + key: typing.LiteralString | bytes | None = None, + description: typing.LiteralString | None = None, + ) -> None: + """Declare the global state key and its type without initializing its value""" @typing.overload - def __init__(self, initial_value: _T, /) -> None: - """Can be initialized with an initial value""" + def __init__( + self, + initial_value: _T, + /, + key: typing.LiteralString | bytes | None = None, + description: typing.LiteralString | None = None, + ) -> None: + """Declare the global state key and initialize its value""" @property def value(self) -> _T: """Returns the value or and error if the value is not set diff --git a/test_cases/scratch_slots/contract.py b/test_cases/scratch_slots/contract.py index d63b9ea4c8..be64b73cc7 100644 --- a/test_cases/scratch_slots/contract.py +++ b/test_cases/scratch_slots/contract.py @@ -1,7 +1,10 @@ from puyapy import Bytes, Contract, UInt64, op, urange +TWO = 2 +TWENTY = 20 -class MyContract(Contract, scratch_slots=(1, 2, urange(3, 20))): + +class MyContract(Contract, scratch_slots=(1, TWO, urange(3, TWENTY))): def approval_program(self) -> bool: op.Scratch.store(1, UInt64(5)) diff --git a/test_cases/scratch_slots/contract2.py b/test_cases/scratch_slots/contract2.py index dede4f1da8..599f17f8a9 100644 --- a/test_cases/scratch_slots/contract2.py +++ b/test_cases/scratch_slots/contract2.py @@ -2,7 +2,6 @@ import puyapy from puyapy import Bytes, UInt64, op, subroutine, urange - from test_cases.scratch_slots.contract import MyContract RenamedURange: typing.TypeAlias = urange @@ -10,7 +9,7 @@ class MyContract2( MyContract, - scratch_slots=(5, 25, urange(50, 53, 2), RenamedURange(100, 105), puyapy.urange(110, 115)), + scratch_slots=[5, 25, urange(50, 53, 2), RenamedURange(100, 105), puyapy.urange(110, 115)], ): @subroutine def my_sub(self) -> None: diff --git a/test_cases/scratch_slots/contract3.py b/test_cases/scratch_slots/contract3.py new file mode 100644 index 0000000000..be96da912a --- /dev/null +++ b/test_cases/scratch_slots/contract3.py @@ -0,0 +1,9 @@ +from puyapy import Contract, urange + + +class MyOtherContract(Contract, scratch_slots=urange(0, -1, -1)): + def approval_program(self) -> bool: + return True + + def clear_state_program(self) -> bool: + return True diff --git a/test_cases/scratch_slots/out/MyContract.approval.mir b/test_cases/scratch_slots/out/MyContract.approval.mir index 9aa7215d1f..5b6f9a0c94 100644 --- a/test_cases/scratch_slots/out/MyContract.approval.mir +++ b/test_cases/scratch_slots/out/MyContract.approval.mir @@ -4,63 +4,63 @@ // test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: main_block@0: - int 5 // 5 5 scratch_slots/contract.py:6 - store 1 // op.Scratch.store(1, UInt64(5)) scratch_slots/contract.py:6 - byte "Hello World" // "Hello World" b"Hello World" scratch_slots/contract.py:8 - store 2 // op.Scratch.store(2, Bytes(b"Hello World")) scratch_slots/contract.py:8 - int 3 // 3 3 scratch_slots/contract.py:10 - // virtual: store range_item%0#0 to l-stack (no copy) range_item%0#0 i scratch_slots/contract.py:10 + int 5 // 5 5 scratch_slots/contract.py:9 + store 1 // op.Scratch.store(1, UInt64(5)) scratch_slots/contract.py:9 + byte "Hello World" // "Hello World" b"Hello World" scratch_slots/contract.py:11 + store 2 // op.Scratch.store(2, Bytes(b"Hello World")) scratch_slots/contract.py:11 + int 3 // 3 3 scratch_slots/contract.py:13 + // virtual: store range_item%0#0 to l-stack (no copy) range_item%0#0 i scratch_slots/contract.py:13 // virtual: load range_item%0#0 from l-stack (no copy) range_item%0#0 // virtual: store i#0 to f-stack (𝕗) i#0 | // Implicit fall through to main_for_header@1 // (𝕗) i#0 | main_for_header@1: - dup // load i#0 from f-stack (𝕗) i#0 | i#0 urange(3, 20) scratch_slots/contract.py:10 - int 20 // (𝕗) i#0 | i#0,20 20 scratch_slots/contract.py:10 - < // (𝕗) i#0 | {<} urange(3, 20) scratch_slots/contract.py:10 - // virtual: store continue_looping%1#0 to l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 urange(3, 20) scratch_slots/contract.py:10 - // virtual: load continue_looping%1#0 from l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 for i in urange(3, 20): scratch_slots/contract.py:10 - bz main_after_for@5 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:10 - // Implicit fall through to main_for_body@2 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:10 + dup // load i#0 from f-stack (𝕗) i#0 | i#0 urange(3, 20) scratch_slots/contract.py:13 + int 20 // (𝕗) i#0 | i#0,20 20 scratch_slots/contract.py:13 + < // (𝕗) i#0 | {<} urange(3, 20) scratch_slots/contract.py:13 + // virtual: store continue_looping%1#0 to l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 urange(3, 20) scratch_slots/contract.py:13 + // virtual: load continue_looping%1#0 from l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 for i in urange(3, 20): scratch_slots/contract.py:13 + bz main_after_for@5 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:13 + // Implicit fall through to main_for_body@2 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:13 main_for_body@2: - dup // load i#0 from f-stack (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - dup // store i#0 to l-stack (copy) (𝕗) i#0 | i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - dig 1 // load i#0 from l-stack (copy) (𝕗) i#0 | i#0,i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - stores // (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - // virtual: load i#0 from l-stack (no copy) (𝕗) i#0 | i#0 for i in urange(3, 20): scratch_slots/contract.py:10 - int 1 // (𝕗) i#0 | i#0,1 urange(3, 20) scratch_slots/contract.py:10 - + // (𝕗) i#0 | {+} urange(3, 20) scratch_slots/contract.py:10 - // virtual: store range_item%0#0 to l-stack (no copy) (𝕗) i#0 | range_item%0#0 for i in urange(3, 20): scratch_slots/contract.py:10 + dup // load i#0 from f-stack (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + dup // store i#0 to l-stack (copy) (𝕗) i#0 | i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + dig 1 // load i#0 from l-stack (copy) (𝕗) i#0 | i#0,i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + stores // (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + // virtual: load i#0 from l-stack (no copy) (𝕗) i#0 | i#0 for i in urange(3, 20): scratch_slots/contract.py:13 + int 1 // (𝕗) i#0 | i#0,1 urange(3, 20) scratch_slots/contract.py:13 + + // (𝕗) i#0 | {+} urange(3, 20) scratch_slots/contract.py:13 + // virtual: store range_item%0#0 to l-stack (no copy) (𝕗) i#0 | range_item%0#0 for i in urange(3, 20): scratch_slots/contract.py:13 // virtual: load range_item%0#0 from l-stack (no copy) (𝕗) i#0 | range_item%0#0 bury 1 // store i#0 to f-stack (𝕗) i#0 | b main_for_header@1 // (𝕗) i#0 | main_after_for@5: - load 1 // (𝕗) i#0 | {load} op.Scratch.load_uint64(1) scratch_slots/contract.py:13 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) scratch_slots/contract.py:13 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - int 5 // (𝕗) i#0 | tmp%2#0,5 5 scratch_slots/contract.py:13 - == // (𝕗) i#0 | {==} op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) i#0 | tmp%3#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) i#0 | tmp%3#0 assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - assert // (𝕗) i#0 | assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - load 2 // (𝕗) i#0 | {load} op.Scratch.load_bytes(2) scratch_slots/contract.py:15 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) scratch_slots/contract.py:15 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - byte "Hello World" // (𝕗) i#0 | tmp%4#0,"Hello World" b"Hello World" scratch_slots/contract.py:15 - == // (𝕗) i#0 | {==} op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) i#0 | tmp%5#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) i#0 | tmp%5#0 assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - assert // (𝕗) i#0 | assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - load 5 // (𝕗) i#0 | {load} op.Scratch.load_uint64(5) scratch_slots/contract.py:17 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) scratch_slots/contract.py:17 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - int 5 // (𝕗) i#0 | tmp%6#0,5 5 scratch_slots/contract.py:17 - == // (𝕗) i#0 | {==} op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) i#0 | tmp%7#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) i#0 | tmp%7#0 assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - assert // (𝕗) i#0 | assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - int 1 // (𝕗) i#0 | 1 True scratch_slots/contract.py:18 - return // (𝕗) i#0 | return True scratch_slots/contract.py:18 + load 1 // (𝕗) i#0 | {load} op.Scratch.load_uint64(1) scratch_slots/contract.py:16 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) scratch_slots/contract.py:16 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + int 5 // (𝕗) i#0 | tmp%2#0,5 5 scratch_slots/contract.py:16 + == // (𝕗) i#0 | {==} op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) i#0 | tmp%3#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) i#0 | tmp%3#0 assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + assert // (𝕗) i#0 | assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + load 2 // (𝕗) i#0 | {load} op.Scratch.load_bytes(2) scratch_slots/contract.py:18 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) scratch_slots/contract.py:18 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + byte "Hello World" // (𝕗) i#0 | tmp%4#0,"Hello World" b"Hello World" scratch_slots/contract.py:18 + == // (𝕗) i#0 | {==} op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) i#0 | tmp%5#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) i#0 | tmp%5#0 assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + assert // (𝕗) i#0 | assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + load 5 // (𝕗) i#0 | {load} op.Scratch.load_uint64(5) scratch_slots/contract.py:20 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) scratch_slots/contract.py:20 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + int 5 // (𝕗) i#0 | tmp%6#0,5 5 scratch_slots/contract.py:20 + == // (𝕗) i#0 | {==} op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) i#0 | tmp%7#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) i#0 | tmp%7#0 assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + assert // (𝕗) i#0 | assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + int 1 // (𝕗) i#0 | 1 True scratch_slots/contract.py:21 + return // (𝕗) i#0 | return True scratch_slots/contract.py:21 diff --git a/test_cases/scratch_slots/out/MyContract.approval.teal b/test_cases/scratch_slots/out/MyContract.approval.teal index 647622b2e8..0229b8a8b3 100644 --- a/test_cases/scratch_slots/out/MyContract.approval.teal +++ b/test_cases/scratch_slots/out/MyContract.approval.teal @@ -1,31 +1,31 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.approval_program: - // scratch_slots/contract.py:6 + // scratch_slots/contract.py:9 // op.Scratch.store(1, UInt64(5)) int 5 store 1 - // scratch_slots/contract.py:8 + // scratch_slots/contract.py:11 // op.Scratch.store(2, Bytes(b"Hello World")) byte "Hello World" store 2 - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): int 3 main_for_header@1: - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): dup int 20 < bz main_after_for@5 - // scratch_slots/contract.py:11 + // scratch_slots/contract.py:14 // op.Scratch.store(i, i) dupn 2 dig 1 stores - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): int 1 + @@ -33,25 +33,25 @@ main_for_header@1: b main_for_header@1 main_after_for@5: - // scratch_slots/contract.py:13 + // scratch_slots/contract.py:16 // assert op.Scratch.load_uint64(1) == UInt64(5) load 1 int 5 == assert - // scratch_slots/contract.py:15 + // scratch_slots/contract.py:18 // assert op.Scratch.load_bytes(2) == b"Hello World" load 2 byte "Hello World" == assert - // scratch_slots/contract.py:17 + // scratch_slots/contract.py:20 // assert op.Scratch.load_uint64(5) == UInt64(5) load 5 int 5 == assert - // scratch_slots/contract.py:18 + // scratch_slots/contract.py:21 // return True int 1 return diff --git a/test_cases/scratch_slots/out/MyContract.clear.mir b/test_cases/scratch_slots/out/MyContract.clear.mir index fba4de6291..7e278c5fa0 100644 --- a/test_cases/scratch_slots/out/MyContract.clear.mir +++ b/test_cases/scratch_slots/out/MyContract.clear.mir @@ -4,6 +4,6 @@ // test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: main_block@0: - int 1 // 1 True scratch_slots/contract.py:21 - return // return True scratch_slots/contract.py:21 + int 1 // 1 True scratch_slots/contract.py:24 + return // return True scratch_slots/contract.py:24 diff --git a/test_cases/scratch_slots/out/MyContract.clear.teal b/test_cases/scratch_slots/out/MyContract.clear.teal index 989b142031..4ded98937a 100644 --- a/test_cases/scratch_slots/out/MyContract.clear.teal +++ b/test_cases/scratch_slots/out/MyContract.clear.teal @@ -1,7 +1,7 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.clear_state_program: - // scratch_slots/contract.py:21 + // scratch_slots/contract.py:24 // return True int 1 return diff --git a/test_cases/scratch_slots/out/MyContract.destructured.ir b/test_cases/scratch_slots/out/MyContract.destructured.ir index 6fc3e951e5..9b57bb9038 100644 --- a/test_cases/scratch_slots/out/MyContract.destructured.ir +++ b/test_cases/scratch_slots/out/MyContract.destructured.ir @@ -1,21 +1,21 @@ contract test_cases.scratch_slots.contract.MyContract: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 ((store 1) 5u) ((store 2) "Hello World") let range_item%0#0: uint64 = 3u let i#0: uint64 = range_item%0#0 goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let continue_looping%1#0: uint64 = (< i#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 (stores i#0 i#0) let range_item%0#0: uint64 = (+ i#0 1u) let i#0: uint64 = range_item%0#0 goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (load 1) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -29,5 +29,5 @@ contract test_cases.scratch_slots.contract.MyContract: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/MyContract.ssa.ir b/test_cases/scratch_slots/out/MyContract.ssa.ir index 5283f3f1ca..a724392246 100644 --- a/test_cases/scratch_slots/out/MyContract.ssa.ir +++ b/test_cases/scratch_slots/out/MyContract.ssa.ir @@ -1,26 +1,26 @@ contract test_cases.scratch_slots.contract.MyContract: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 (stores 1u 5u) (stores 2u "Hello World") (assert 1u) // Step cannot be zero let range_item%0#0: uint64 = 3u goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@4) let continue_looping%1#0: uint64 = (< range_item%0#1 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 let i#0: uint64 = range_item%0#1 (stores i#0 i#0) goto block@3 - block@3: // for_footer_L10 + block@3: // for_footer_L13 goto block@4 - block@4: // for_increment_L10 + block@4: // for_increment_L13 let range_item%0#3: uint64 = (+ range_item%0#1 1u) goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (loads 1u) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -34,5 +34,5 @@ contract test_cases.scratch_slots.contract.MyContract: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/MyContract.ssa.opt_pass_1.ir b/test_cases/scratch_slots/out/MyContract.ssa.opt_pass_1.ir index 5bb61032b2..c16ed4e173 100644 --- a/test_cases/scratch_slots/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/scratch_slots/out/MyContract.ssa.opt_pass_1.ir @@ -1,20 +1,20 @@ contract test_cases.scratch_slots.contract.MyContract: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 ((store 1) 5u) ((store 2) "Hello World") let range_item%0#0: uint64 = 3u goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let i#0: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@2) let continue_looping%1#0: uint64 = (< i#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 (stores i#0 i#0) let range_item%0#3: uint64 = (+ i#0 1u) goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (load 1) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -28,5 +28,5 @@ contract test_cases.scratch_slots.contract.MyContract: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/MyContract2.approval.mir b/test_cases/scratch_slots/out/MyContract2.approval.mir index 9aa7215d1f..5b6f9a0c94 100644 --- a/test_cases/scratch_slots/out/MyContract2.approval.mir +++ b/test_cases/scratch_slots/out/MyContract2.approval.mir @@ -4,63 +4,63 @@ // test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: main_block@0: - int 5 // 5 5 scratch_slots/contract.py:6 - store 1 // op.Scratch.store(1, UInt64(5)) scratch_slots/contract.py:6 - byte "Hello World" // "Hello World" b"Hello World" scratch_slots/contract.py:8 - store 2 // op.Scratch.store(2, Bytes(b"Hello World")) scratch_slots/contract.py:8 - int 3 // 3 3 scratch_slots/contract.py:10 - // virtual: store range_item%0#0 to l-stack (no copy) range_item%0#0 i scratch_slots/contract.py:10 + int 5 // 5 5 scratch_slots/contract.py:9 + store 1 // op.Scratch.store(1, UInt64(5)) scratch_slots/contract.py:9 + byte "Hello World" // "Hello World" b"Hello World" scratch_slots/contract.py:11 + store 2 // op.Scratch.store(2, Bytes(b"Hello World")) scratch_slots/contract.py:11 + int 3 // 3 3 scratch_slots/contract.py:13 + // virtual: store range_item%0#0 to l-stack (no copy) range_item%0#0 i scratch_slots/contract.py:13 // virtual: load range_item%0#0 from l-stack (no copy) range_item%0#0 // virtual: store i#0 to f-stack (𝕗) i#0 | // Implicit fall through to main_for_header@1 // (𝕗) i#0 | main_for_header@1: - dup // load i#0 from f-stack (𝕗) i#0 | i#0 urange(3, 20) scratch_slots/contract.py:10 - int 20 // (𝕗) i#0 | i#0,20 20 scratch_slots/contract.py:10 - < // (𝕗) i#0 | {<} urange(3, 20) scratch_slots/contract.py:10 - // virtual: store continue_looping%1#0 to l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 urange(3, 20) scratch_slots/contract.py:10 - // virtual: load continue_looping%1#0 from l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 for i in urange(3, 20): scratch_slots/contract.py:10 - bz main_after_for@5 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:10 - // Implicit fall through to main_for_body@2 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:10 + dup // load i#0 from f-stack (𝕗) i#0 | i#0 urange(3, 20) scratch_slots/contract.py:13 + int 20 // (𝕗) i#0 | i#0,20 20 scratch_slots/contract.py:13 + < // (𝕗) i#0 | {<} urange(3, 20) scratch_slots/contract.py:13 + // virtual: store continue_looping%1#0 to l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 urange(3, 20) scratch_slots/contract.py:13 + // virtual: load continue_looping%1#0 from l-stack (no copy) (𝕗) i#0 | continue_looping%1#0 for i in urange(3, 20): scratch_slots/contract.py:13 + bz main_after_for@5 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:13 + // Implicit fall through to main_for_body@2 // (𝕗) i#0 | for i in urange(3, 20): scratch_slots/contract.py:13 main_for_body@2: - dup // load i#0 from f-stack (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - dup // store i#0 to l-stack (copy) (𝕗) i#0 | i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - dig 1 // load i#0 from l-stack (copy) (𝕗) i#0 | i#0,i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - stores // (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:11 - // virtual: load i#0 from l-stack (no copy) (𝕗) i#0 | i#0 for i in urange(3, 20): scratch_slots/contract.py:10 - int 1 // (𝕗) i#0 | i#0,1 urange(3, 20) scratch_slots/contract.py:10 - + // (𝕗) i#0 | {+} urange(3, 20) scratch_slots/contract.py:10 - // virtual: store range_item%0#0 to l-stack (no copy) (𝕗) i#0 | range_item%0#0 for i in urange(3, 20): scratch_slots/contract.py:10 + dup // load i#0 from f-stack (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + dup // store i#0 to l-stack (copy) (𝕗) i#0 | i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + dig 1 // load i#0 from l-stack (copy) (𝕗) i#0 | i#0,i#0,i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + stores // (𝕗) i#0 | i#0 op.Scratch.store(i, i) scratch_slots/contract.py:14 + // virtual: load i#0 from l-stack (no copy) (𝕗) i#0 | i#0 for i in urange(3, 20): scratch_slots/contract.py:13 + int 1 // (𝕗) i#0 | i#0,1 urange(3, 20) scratch_slots/contract.py:13 + + // (𝕗) i#0 | {+} urange(3, 20) scratch_slots/contract.py:13 + // virtual: store range_item%0#0 to l-stack (no copy) (𝕗) i#0 | range_item%0#0 for i in urange(3, 20): scratch_slots/contract.py:13 // virtual: load range_item%0#0 from l-stack (no copy) (𝕗) i#0 | range_item%0#0 bury 1 // store i#0 to f-stack (𝕗) i#0 | b main_for_header@1 // (𝕗) i#0 | main_after_for@5: - load 1 // (𝕗) i#0 | {load} op.Scratch.load_uint64(1) scratch_slots/contract.py:13 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) scratch_slots/contract.py:13 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - int 5 // (𝕗) i#0 | tmp%2#0,5 5 scratch_slots/contract.py:13 - == // (𝕗) i#0 | {==} op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) i#0 | tmp%3#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) i#0 | tmp%3#0 assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - assert // (𝕗) i#0 | assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:13 - load 2 // (𝕗) i#0 | {load} op.Scratch.load_bytes(2) scratch_slots/contract.py:15 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) scratch_slots/contract.py:15 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - byte "Hello World" // (𝕗) i#0 | tmp%4#0,"Hello World" b"Hello World" scratch_slots/contract.py:15 - == // (𝕗) i#0 | {==} op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) i#0 | tmp%5#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) i#0 | tmp%5#0 assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - assert // (𝕗) i#0 | assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:15 - load 5 // (𝕗) i#0 | {load} op.Scratch.load_uint64(5) scratch_slots/contract.py:17 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) scratch_slots/contract.py:17 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - int 5 // (𝕗) i#0 | tmp%6#0,5 5 scratch_slots/contract.py:17 - == // (𝕗) i#0 | {==} op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) i#0 | tmp%7#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) i#0 | tmp%7#0 assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - assert // (𝕗) i#0 | assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:17 - int 1 // (𝕗) i#0 | 1 True scratch_slots/contract.py:18 - return // (𝕗) i#0 | return True scratch_slots/contract.py:18 + load 1 // (𝕗) i#0 | {load} op.Scratch.load_uint64(1) scratch_slots/contract.py:16 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) scratch_slots/contract.py:16 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) i#0 | tmp%2#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + int 5 // (𝕗) i#0 | tmp%2#0,5 5 scratch_slots/contract.py:16 + == // (𝕗) i#0 | {==} op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) i#0 | tmp%3#0 op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) i#0 | tmp%3#0 assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + assert // (𝕗) i#0 | assert op.Scratch.load_uint64(1) == UInt64(5) scratch_slots/contract.py:16 + load 2 // (𝕗) i#0 | {load} op.Scratch.load_bytes(2) scratch_slots/contract.py:18 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) scratch_slots/contract.py:18 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) i#0 | tmp%4#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + byte "Hello World" // (𝕗) i#0 | tmp%4#0,"Hello World" b"Hello World" scratch_slots/contract.py:18 + == // (𝕗) i#0 | {==} op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) i#0 | tmp%5#0 op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) i#0 | tmp%5#0 assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + assert // (𝕗) i#0 | assert op.Scratch.load_bytes(2) == b"Hello World" scratch_slots/contract.py:18 + load 5 // (𝕗) i#0 | {load} op.Scratch.load_uint64(5) scratch_slots/contract.py:20 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) scratch_slots/contract.py:20 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) i#0 | tmp%6#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + int 5 // (𝕗) i#0 | tmp%6#0,5 5 scratch_slots/contract.py:20 + == // (𝕗) i#0 | {==} op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) i#0 | tmp%7#0 op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) i#0 | tmp%7#0 assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + assert // (𝕗) i#0 | assert op.Scratch.load_uint64(5) == UInt64(5) scratch_slots/contract.py:20 + int 1 // (𝕗) i#0 | 1 True scratch_slots/contract.py:21 + return // (𝕗) i#0 | return True scratch_slots/contract.py:21 diff --git a/test_cases/scratch_slots/out/MyContract2.approval.teal b/test_cases/scratch_slots/out/MyContract2.approval.teal index 647622b2e8..0229b8a8b3 100644 --- a/test_cases/scratch_slots/out/MyContract2.approval.teal +++ b/test_cases/scratch_slots/out/MyContract2.approval.teal @@ -1,31 +1,31 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.approval_program: - // scratch_slots/contract.py:6 + // scratch_slots/contract.py:9 // op.Scratch.store(1, UInt64(5)) int 5 store 1 - // scratch_slots/contract.py:8 + // scratch_slots/contract.py:11 // op.Scratch.store(2, Bytes(b"Hello World")) byte "Hello World" store 2 - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): int 3 main_for_header@1: - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): dup int 20 < bz main_after_for@5 - // scratch_slots/contract.py:11 + // scratch_slots/contract.py:14 // op.Scratch.store(i, i) dupn 2 dig 1 stores - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): int 1 + @@ -33,25 +33,25 @@ main_for_header@1: b main_for_header@1 main_after_for@5: - // scratch_slots/contract.py:13 + // scratch_slots/contract.py:16 // assert op.Scratch.load_uint64(1) == UInt64(5) load 1 int 5 == assert - // scratch_slots/contract.py:15 + // scratch_slots/contract.py:18 // assert op.Scratch.load_bytes(2) == b"Hello World" load 2 byte "Hello World" == assert - // scratch_slots/contract.py:17 + // scratch_slots/contract.py:20 // assert op.Scratch.load_uint64(5) == UInt64(5) load 5 int 5 == assert - // scratch_slots/contract.py:18 + // scratch_slots/contract.py:21 // return True int 1 return diff --git a/test_cases/scratch_slots/out/MyContract2.clear.mir b/test_cases/scratch_slots/out/MyContract2.clear.mir index fba4de6291..7e278c5fa0 100644 --- a/test_cases/scratch_slots/out/MyContract2.clear.mir +++ b/test_cases/scratch_slots/out/MyContract2.clear.mir @@ -4,6 +4,6 @@ // test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: main_block@0: - int 1 // 1 True scratch_slots/contract.py:21 - return // return True scratch_slots/contract.py:21 + int 1 // 1 True scratch_slots/contract.py:24 + return // return True scratch_slots/contract.py:24 diff --git a/test_cases/scratch_slots/out/MyContract2.clear.teal b/test_cases/scratch_slots/out/MyContract2.clear.teal index 989b142031..4ded98937a 100644 --- a/test_cases/scratch_slots/out/MyContract2.clear.teal +++ b/test_cases/scratch_slots/out/MyContract2.clear.teal @@ -1,7 +1,7 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.clear_state_program: - // scratch_slots/contract.py:21 + // scratch_slots/contract.py:24 // return True int 1 return diff --git a/test_cases/scratch_slots/out/MyContract2.destructured.ir b/test_cases/scratch_slots/out/MyContract2.destructured.ir index b2ad905a1c..762b58a86e 100644 --- a/test_cases/scratch_slots/out/MyContract2.destructured.ir +++ b/test_cases/scratch_slots/out/MyContract2.destructured.ir @@ -1,21 +1,21 @@ contract test_cases.scratch_slots.contract2.MyContract2: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 ((store 1) 5u) ((store 2) "Hello World") let range_item%0#0: uint64 = 3u let i#0: uint64 = range_item%0#0 goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let continue_looping%1#0: uint64 = (< i#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 (stores i#0 i#0) let range_item%0#0: uint64 = (+ i#0 1u) let i#0: uint64 = range_item%0#0 goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (load 1) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -29,5 +29,5 @@ contract test_cases.scratch_slots.contract2.MyContract2: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/MyContract2.ssa.ir b/test_cases/scratch_slots/out/MyContract2.ssa.ir index ee46dae2ed..f45e134838 100644 --- a/test_cases/scratch_slots/out/MyContract2.ssa.ir +++ b/test_cases/scratch_slots/out/MyContract2.ssa.ir @@ -1,26 +1,26 @@ contract test_cases.scratch_slots.contract2.MyContract2: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 (stores 1u 5u) (stores 2u "Hello World") (assert 1u) // Step cannot be zero let range_item%0#0: uint64 = 3u goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@4) let continue_looping%1#0: uint64 = (< range_item%0#1 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 let i#0: uint64 = range_item%0#1 (stores i#0 i#0) goto block@3 - block@3: // for_footer_L10 + block@3: // for_footer_L13 goto block@4 - block@4: // for_increment_L10 + block@4: // for_increment_L13 let range_item%0#3: uint64 = (+ range_item%0#1 1u) goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (loads 1u) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -34,5 +34,5 @@ contract test_cases.scratch_slots.contract2.MyContract2: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/MyContract2.ssa.opt_pass_1.ir b/test_cases/scratch_slots/out/MyContract2.ssa.opt_pass_1.ir index 3aacd8cfae..d6bc89dc1b 100644 --- a/test_cases/scratch_slots/out/MyContract2.ssa.opt_pass_1.ir +++ b/test_cases/scratch_slots/out/MyContract2.ssa.opt_pass_1.ir @@ -1,20 +1,20 @@ contract test_cases.scratch_slots.contract2.MyContract2: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 ((store 1) 5u) ((store 2) "Hello World") let range_item%0#0: uint64 = 3u goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let i#0: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@2) let continue_looping%1#0: uint64 = (< i#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 (stores i#0 i#0) let range_item%0#3: uint64 = (+ i#0 1u) goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (load 1) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -28,5 +28,5 @@ contract test_cases.scratch_slots.contract2.MyContract2: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/MyOtherContract.approval.mir b/test_cases/scratch_slots/out/MyOtherContract.approval.mir new file mode 100644 index 0000000000..3ffd49d201 --- /dev/null +++ b/test_cases/scratch_slots/out/MyOtherContract.approval.mir @@ -0,0 +1,9 @@ +// Op // Stack (out) Source code Source line + +#pragma version 10 + +// test_cases.scratch_slots.contract3.MyOtherContract.approval_program() -> uint64: +main_block@0: + int 1 // 1 True scratch_slots/contract3.py:6 + return // return True scratch_slots/contract3.py:6 + diff --git a/test_cases/scratch_slots/out/MyOtherContract.approval.teal b/test_cases/scratch_slots/out/MyOtherContract.approval.teal new file mode 100644 index 0000000000..e561062680 --- /dev/null +++ b/test_cases/scratch_slots/out/MyOtherContract.approval.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.scratch_slots.contract3.MyOtherContract.approval_program: + // scratch_slots/contract3.py:6 + // return True + int 1 + return diff --git a/test_cases/scratch_slots/out/MyOtherContract.clear.mir b/test_cases/scratch_slots/out/MyOtherContract.clear.mir new file mode 100644 index 0000000000..284b7dddc6 --- /dev/null +++ b/test_cases/scratch_slots/out/MyOtherContract.clear.mir @@ -0,0 +1,9 @@ +// Op // Stack (out) Source code Source line + +#pragma version 10 + +// test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program() -> uint64: +main_block@0: + int 1 // 1 True scratch_slots/contract3.py:9 + return // return True scratch_slots/contract3.py:9 + diff --git a/test_cases/scratch_slots/out/MyOtherContract.clear.teal b/test_cases/scratch_slots/out/MyOtherContract.clear.teal new file mode 100644 index 0000000000..7510cc37bd --- /dev/null +++ b/test_cases/scratch_slots/out/MyOtherContract.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program: + // scratch_slots/contract3.py:9 + // return True + int 1 + return diff --git a/test_cases/scratch_slots/out/MyOtherContract.destructured.ir b/test_cases/scratch_slots/out/MyOtherContract.destructured.ir new file mode 100644 index 0000000000..6ecf2dfdda --- /dev/null +++ b/test_cases/scratch_slots/out/MyOtherContract.destructured.ir @@ -0,0 +1,10 @@ +contract test_cases.scratch_slots.contract3.MyOtherContract: + program approval: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.approval_program() -> uint64: + block@0: // L5 + return 1u + + program clear-state: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program() -> uint64: + block@0: // L8 + return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/MyOtherContract.ssa.ir b/test_cases/scratch_slots/out/MyOtherContract.ssa.ir new file mode 100644 index 0000000000..6ecf2dfdda --- /dev/null +++ b/test_cases/scratch_slots/out/MyOtherContract.ssa.ir @@ -0,0 +1,10 @@ +contract test_cases.scratch_slots.contract3.MyOtherContract: + program approval: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.approval_program() -> uint64: + block@0: // L5 + return 1u + + program clear-state: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program() -> uint64: + block@0: // L8 + return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out/contract.awst b/test_cases/scratch_slots/out/contract.awst index c8d4659dbc..ab9416705d 100644 --- a/test_cases/scratch_slots/out/contract.awst +++ b/test_cases/scratch_slots/out/contract.awst @@ -1,3 +1,6 @@ +TWO = 2 +TWENTY = 20 + contract MyContract { reserved_scratch_space { diff --git a/test_cases/scratch_slots/out/contract3.awst b/test_cases/scratch_slots/out/contract3.awst new file mode 100644 index 0000000000..8416961c51 --- /dev/null +++ b/test_cases/scratch_slots/out/contract3.awst @@ -0,0 +1,16 @@ +contract MyOtherContract +{ + reserved_scratch_space { + 0 + } + + approval_program(): bool + { + return true + } + + clear_state_program(): bool + { + return true + } +} \ No newline at end of file diff --git a/test_cases/scratch_slots/out_O2/MyContract.destructured.ir b/test_cases/scratch_slots/out_O2/MyContract.destructured.ir index 6fc3e951e5..9b57bb9038 100644 --- a/test_cases/scratch_slots/out_O2/MyContract.destructured.ir +++ b/test_cases/scratch_slots/out_O2/MyContract.destructured.ir @@ -1,21 +1,21 @@ contract test_cases.scratch_slots.contract.MyContract: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 ((store 1) 5u) ((store 2) "Hello World") let range_item%0#0: uint64 = 3u let i#0: uint64 = range_item%0#0 goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let continue_looping%1#0: uint64 = (< i#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 (stores i#0 i#0) let range_item%0#0: uint64 = (+ i#0 1u) let i#0: uint64 = range_item%0#0 goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (load 1) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -29,5 +29,5 @@ contract test_cases.scratch_slots.contract.MyContract: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out_O2/MyContract2.destructured.ir b/test_cases/scratch_slots/out_O2/MyContract2.destructured.ir index b2ad905a1c..762b58a86e 100644 --- a/test_cases/scratch_slots/out_O2/MyContract2.destructured.ir +++ b/test_cases/scratch_slots/out_O2/MyContract2.destructured.ir @@ -1,21 +1,21 @@ contract test_cases.scratch_slots.contract2.MyContract2: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 ((store 1) 5u) ((store 2) "Hello World") let range_item%0#0: uint64 = 3u let i#0: uint64 = range_item%0#0 goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let continue_looping%1#0: uint64 = (< i#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 (stores i#0 i#0) let range_item%0#0: uint64 = (+ i#0 1u) let i#0: uint64 = range_item%0#0 goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (load 1) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -29,5 +29,5 @@ contract test_cases.scratch_slots.contract2.MyContract2: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out_O2/MyOtherContract.approval.teal b/test_cases/scratch_slots/out_O2/MyOtherContract.approval.teal new file mode 100644 index 0000000000..39b3444af4 --- /dev/null +++ b/test_cases/scratch_slots/out_O2/MyOtherContract.approval.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +test_cases.scratch_slots.contract3.MyOtherContract.approval_program: + int 1 + return diff --git a/test_cases/scratch_slots/out_O2/MyOtherContract.clear.teal b/test_cases/scratch_slots/out_O2/MyOtherContract.clear.teal new file mode 100644 index 0000000000..54a4dc17e8 --- /dev/null +++ b/test_cases/scratch_slots/out_O2/MyOtherContract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program: + int 1 + return diff --git a/test_cases/scratch_slots/out_O2/MyOtherContract.destructured.ir b/test_cases/scratch_slots/out_O2/MyOtherContract.destructured.ir new file mode 100644 index 0000000000..6ecf2dfdda --- /dev/null +++ b/test_cases/scratch_slots/out_O2/MyOtherContract.destructured.ir @@ -0,0 +1,10 @@ +contract test_cases.scratch_slots.contract3.MyOtherContract: + program approval: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.approval_program() -> uint64: + block@0: // L5 + return 1u + + program clear-state: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program() -> uint64: + block@0: // L8 + return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out_unoptimized/MyContract.approval.teal b/test_cases/scratch_slots/out_unoptimized/MyContract.approval.teal index eac0a9cfc1..4964497329 100644 --- a/test_cases/scratch_slots/out_unoptimized/MyContract.approval.teal +++ b/test_cases/scratch_slots/out_unoptimized/MyContract.approval.teal @@ -1,36 +1,36 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.approval_program: - // scratch_slots/contract.py:6 + // scratch_slots/contract.py:9 // op.Scratch.store(1, UInt64(5)) int 1 int 5 stores - // scratch_slots/contract.py:8 + // scratch_slots/contract.py:11 // op.Scratch.store(2, Bytes(b"Hello World")) int 2 byte "Hello World" stores - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): int 1 assert // Step cannot be zero int 3 main_for_header@1: - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): dup int 20 < bz main_after_for@5 dup - // scratch_slots/contract.py:11 + // scratch_slots/contract.py:14 // op.Scratch.store(i, i) dup swap stores - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): dup int 1 @@ -39,28 +39,28 @@ main_for_header@1: b main_for_header@1 main_after_for@5: - // scratch_slots/contract.py:13 + // scratch_slots/contract.py:16 // assert op.Scratch.load_uint64(1) == UInt64(5) int 1 loads int 5 == assert - // scratch_slots/contract.py:15 + // scratch_slots/contract.py:18 // assert op.Scratch.load_bytes(2) == b"Hello World" int 2 loads byte "Hello World" == assert - // scratch_slots/contract.py:17 + // scratch_slots/contract.py:20 // assert op.Scratch.load_uint64(5) == UInt64(5) int 5 loads int 5 == assert - // scratch_slots/contract.py:18 + // scratch_slots/contract.py:21 // return True int 1 return diff --git a/test_cases/scratch_slots/out_unoptimized/MyContract.clear.teal b/test_cases/scratch_slots/out_unoptimized/MyContract.clear.teal index 989b142031..4ded98937a 100644 --- a/test_cases/scratch_slots/out_unoptimized/MyContract.clear.teal +++ b/test_cases/scratch_slots/out_unoptimized/MyContract.clear.teal @@ -1,7 +1,7 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.clear_state_program: - // scratch_slots/contract.py:21 + // scratch_slots/contract.py:24 // return True int 1 return diff --git a/test_cases/scratch_slots/out_unoptimized/MyContract.destructured.ir b/test_cases/scratch_slots/out_unoptimized/MyContract.destructured.ir index a85a13bac0..0a796a4c18 100644 --- a/test_cases/scratch_slots/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/scratch_slots/out_unoptimized/MyContract.destructured.ir @@ -1,25 +1,25 @@ contract test_cases.scratch_slots.contract.MyContract: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 (stores 1u 5u) (stores 2u "Hello World") (assert 1u) // Step cannot be zero let range_item%0#0: uint64 = 3u goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let continue_looping%1#0: uint64 = (< range_item%0#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 let i#0: uint64 = range_item%0#0 (stores i#0 i#0) goto block@3 - block@3: // for_footer_L10 + block@3: // for_footer_L13 goto block@4 - block@4: // for_increment_L10 + block@4: // for_increment_L13 let range_item%0#0: uint64 = (+ range_item%0#0 1u) goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (loads 1u) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -33,5 +33,5 @@ contract test_cases.scratch_slots.contract.MyContract: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out_unoptimized/MyContract2.approval.teal b/test_cases/scratch_slots/out_unoptimized/MyContract2.approval.teal index eac0a9cfc1..4964497329 100644 --- a/test_cases/scratch_slots/out_unoptimized/MyContract2.approval.teal +++ b/test_cases/scratch_slots/out_unoptimized/MyContract2.approval.teal @@ -1,36 +1,36 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.approval_program: - // scratch_slots/contract.py:6 + // scratch_slots/contract.py:9 // op.Scratch.store(1, UInt64(5)) int 1 int 5 stores - // scratch_slots/contract.py:8 + // scratch_slots/contract.py:11 // op.Scratch.store(2, Bytes(b"Hello World")) int 2 byte "Hello World" stores - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): int 1 assert // Step cannot be zero int 3 main_for_header@1: - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): dup int 20 < bz main_after_for@5 dup - // scratch_slots/contract.py:11 + // scratch_slots/contract.py:14 // op.Scratch.store(i, i) dup swap stores - // scratch_slots/contract.py:10 + // scratch_slots/contract.py:13 // for i in urange(3, 20): dup int 1 @@ -39,28 +39,28 @@ main_for_header@1: b main_for_header@1 main_after_for@5: - // scratch_slots/contract.py:13 + // scratch_slots/contract.py:16 // assert op.Scratch.load_uint64(1) == UInt64(5) int 1 loads int 5 == assert - // scratch_slots/contract.py:15 + // scratch_slots/contract.py:18 // assert op.Scratch.load_bytes(2) == b"Hello World" int 2 loads byte "Hello World" == assert - // scratch_slots/contract.py:17 + // scratch_slots/contract.py:20 // assert op.Scratch.load_uint64(5) == UInt64(5) int 5 loads int 5 == assert - // scratch_slots/contract.py:18 + // scratch_slots/contract.py:21 // return True int 1 return diff --git a/test_cases/scratch_slots/out_unoptimized/MyContract2.clear.teal b/test_cases/scratch_slots/out_unoptimized/MyContract2.clear.teal index 989b142031..4ded98937a 100644 --- a/test_cases/scratch_slots/out_unoptimized/MyContract2.clear.teal +++ b/test_cases/scratch_slots/out_unoptimized/MyContract2.clear.teal @@ -1,7 +1,7 @@ #pragma version 10 test_cases.scratch_slots.contract.MyContract.clear_state_program: - // scratch_slots/contract.py:21 + // scratch_slots/contract.py:24 // return True int 1 return diff --git a/test_cases/scratch_slots/out_unoptimized/MyContract2.destructured.ir b/test_cases/scratch_slots/out_unoptimized/MyContract2.destructured.ir index 0bd5e74d6e..f9350764b4 100644 --- a/test_cases/scratch_slots/out_unoptimized/MyContract2.destructured.ir +++ b/test_cases/scratch_slots/out_unoptimized/MyContract2.destructured.ir @@ -1,25 +1,25 @@ contract test_cases.scratch_slots.contract2.MyContract2: program approval: subroutine test_cases.scratch_slots.contract.MyContract.approval_program() -> uint64: - block@0: // L5 + block@0: // L8 (stores 1u 5u) (stores 2u "Hello World") (assert 1u) // Step cannot be zero let range_item%0#0: uint64 = 3u goto block@1 - block@1: // for_header_L10 + block@1: // for_header_L13 let continue_looping%1#0: uint64 = (< range_item%0#0 20u) goto continue_looping%1#0 ? block@2 : block@5 - block@2: // for_body_L10 + block@2: // for_body_L13 let i#0: uint64 = range_item%0#0 (stores i#0 i#0) goto block@3 - block@3: // for_footer_L10 + block@3: // for_footer_L13 goto block@4 - block@4: // for_increment_L10 + block@4: // for_increment_L13 let range_item%0#0: uint64 = (+ range_item%0#0 1u) goto block@1 - block@5: // after_for_L10 + block@5: // after_for_L13 let tmp%2#0: any = (loads 1u) let tmp%3#0: uint64 = (== tmp%2#0 5u) (assert tmp%3#0) @@ -33,5 +33,5 @@ contract test_cases.scratch_slots.contract2.MyContract2: program clear-state: subroutine test_cases.scratch_slots.contract.MyContract.clear_state_program() -> uint64: - block@0: // L20 + block@0: // L23 return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/out_unoptimized/MyOtherContract.approval.teal b/test_cases/scratch_slots/out_unoptimized/MyOtherContract.approval.teal new file mode 100644 index 0000000000..e561062680 --- /dev/null +++ b/test_cases/scratch_slots/out_unoptimized/MyOtherContract.approval.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.scratch_slots.contract3.MyOtherContract.approval_program: + // scratch_slots/contract3.py:6 + // return True + int 1 + return diff --git a/test_cases/scratch_slots/out_unoptimized/MyOtherContract.clear.teal b/test_cases/scratch_slots/out_unoptimized/MyOtherContract.clear.teal new file mode 100644 index 0000000000..7510cc37bd --- /dev/null +++ b/test_cases/scratch_slots/out_unoptimized/MyOtherContract.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program: + // scratch_slots/contract3.py:9 + // return True + int 1 + return diff --git a/test_cases/scratch_slots/out_unoptimized/MyOtherContract.destructured.ir b/test_cases/scratch_slots/out_unoptimized/MyOtherContract.destructured.ir new file mode 100644 index 0000000000..6ecf2dfdda --- /dev/null +++ b/test_cases/scratch_slots/out_unoptimized/MyOtherContract.destructured.ir @@ -0,0 +1,10 @@ +contract test_cases.scratch_slots.contract3.MyOtherContract: + program approval: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.approval_program() -> uint64: + block@0: // L5 + return 1u + + program clear-state: + subroutine test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program() -> uint64: + block@0: // L8 + return 1u \ No newline at end of file diff --git a/test_cases/scratch_slots/puya.log b/test_cases/scratch_slots/puya.log index f9d562ffa0..e81fe967a7 100644 --- a/test_cases/scratch_slots/puya.log +++ b/test_cases/scratch_slots/puya.log @@ -285,54 +285,58 @@ debug: Deleting Phi assignment: let sequence#1: bytes = φ(sequence#0 <- block@0 debug: Replaced trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0 in current definition for 3 blocks debug: Sealing block@None: // after_while_L11 debug: Terminated block@5: // after_while_L11 -debug: Sealing block@0: // L5 -debug: Terminated block@0: // L5 -debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@1: // for_header_L10 -debug: Created Phi assignment: let range_item%0#1: uint64 = undefined while trying to resolve 'range_item%0' in block@1: // for_header_L10 -debug: Terminated block@1: // for_header_L10 -debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@2: // for_body_L10 -debug: Created Phi assignment: let range_item%0#2: uint64 = undefined while trying to resolve 'range_item%0' in block@2: // for_body_L10 -debug: Terminated block@2: // for_body_L10 -debug: Sealing block@3: // for_footer_L10 -debug: Terminated block@3: // for_footer_L10 -debug: Sealing block@4: // for_increment_L10 -debug: Terminated block@4: // for_increment_L10 -debug: Sealing block@1: // for_header_L10 -debug: Added range_item%0#0 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0) in block@0: // L5 -debug: Added range_item%0#3 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@4) in block@4: // for_increment_L10 -debug: Sealing block@2: // for_body_L10 -debug: Added range_item%0#1 to Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) in block@1: // for_header_L10 +debug: Sealing block@0: // L8 +debug: Terminated block@0: // L8 +debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@1: // for_header_L13 +debug: Created Phi assignment: let range_item%0#1: uint64 = undefined while trying to resolve 'range_item%0' in block@1: // for_header_L13 +debug: Terminated block@1: // for_header_L13 +debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@2: // for_body_L13 +debug: Created Phi assignment: let range_item%0#2: uint64 = undefined while trying to resolve 'range_item%0' in block@2: // for_body_L13 +debug: Terminated block@2: // for_body_L13 +debug: Sealing block@3: // for_footer_L13 +debug: Terminated block@3: // for_footer_L13 +debug: Sealing block@4: // for_increment_L13 +debug: Terminated block@4: // for_increment_L13 +debug: Sealing block@1: // for_header_L13 +debug: Added range_item%0#0 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0) in block@0: // L8 +debug: Added range_item%0#3 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@4) in block@4: // for_increment_L13 +debug: Sealing block@2: // for_body_L13 +debug: Added range_item%0#1 to Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) in block@1: // for_header_L13 debug: Replacing trivial Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) (range_item%0#2) with range_item%0#1 debug: Deleting Phi assignment: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) debug: Replaced trivial Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) (range_item%0#2) with range_item%0#1 in current definition for 2 blocks -debug: Sealing block@None: // after_for_L10 -debug: Terminated block@5: // after_for_L10 -debug: Sealing block@0: // L20 -debug: Terminated block@0: // L20 -debug: Sealing block@0: // L5 -debug: Terminated block@0: // L5 -debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@1: // for_header_L10 -debug: Created Phi assignment: let range_item%0#1: uint64 = undefined while trying to resolve 'range_item%0' in block@1: // for_header_L10 -debug: Terminated block@1: // for_header_L10 -debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@2: // for_body_L10 -debug: Created Phi assignment: let range_item%0#2: uint64 = undefined while trying to resolve 'range_item%0' in block@2: // for_body_L10 -debug: Terminated block@2: // for_body_L10 -debug: Sealing block@3: // for_footer_L10 -debug: Terminated block@3: // for_footer_L10 -debug: Sealing block@4: // for_increment_L10 -debug: Terminated block@4: // for_increment_L10 -debug: Sealing block@1: // for_header_L10 -debug: Added range_item%0#0 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0) in block@0: // L5 -debug: Added range_item%0#3 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@4) in block@4: // for_increment_L10 -debug: Sealing block@2: // for_body_L10 -debug: Added range_item%0#1 to Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) in block@1: // for_header_L10 +debug: Sealing block@None: // after_for_L13 +debug: Terminated block@5: // after_for_L13 +debug: Sealing block@0: // L23 +debug: Terminated block@0: // L23 +debug: Sealing block@0: // L8 +debug: Terminated block@0: // L8 +debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@1: // for_header_L13 +debug: Created Phi assignment: let range_item%0#1: uint64 = undefined while trying to resolve 'range_item%0' in block@1: // for_header_L13 +debug: Terminated block@1: // for_header_L13 +debug: Looking for 'range_item%0' in an unsealed block creating an incomplete Phi: block@2: // for_body_L13 +debug: Created Phi assignment: let range_item%0#2: uint64 = undefined while trying to resolve 'range_item%0' in block@2: // for_body_L13 +debug: Terminated block@2: // for_body_L13 +debug: Sealing block@3: // for_footer_L13 +debug: Terminated block@3: // for_footer_L13 +debug: Sealing block@4: // for_increment_L13 +debug: Terminated block@4: // for_increment_L13 +debug: Sealing block@1: // for_header_L13 +debug: Added range_item%0#0 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0) in block@0: // L8 +debug: Added range_item%0#3 to Phi node: let range_item%0#1: uint64 = φ(range_item%0#0 <- block@0, range_item%0#3 <- block@4) in block@4: // for_increment_L13 +debug: Sealing block@2: // for_body_L13 +debug: Added range_item%0#1 to Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) in block@1: // for_header_L13 debug: Replacing trivial Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) (range_item%0#2) with range_item%0#1 debug: Deleting Phi assignment: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) debug: Replaced trivial Phi node: let range_item%0#2: uint64 = φ(range_item%0#1 <- block@1) (range_item%0#2) with range_item%0#1 in current definition for 2 blocks -debug: Sealing block@None: // after_for_L10 -debug: Terminated block@5: // after_for_L10 -debug: Sealing block@0: // L20 -debug: Terminated block@0: // L20 +debug: Sealing block@None: // after_for_L13 +debug: Terminated block@5: // after_for_L13 +debug: Sealing block@0: // L23 +debug: Terminated block@0: // L23 +debug: Sealing block@0: // L5 +debug: Terminated block@0: // L5 +debug: Sealing block@0: // L8 +debug: Terminated block@0: // L8 debug: Output IR to scratch_slots/out/MyContract.ssa.ir info: Optimizing test_cases.scratch_slots.contract.MyContract at level 1 debug: Begin optimization pass 1/100 @@ -347,10 +351,10 @@ debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump -debug: Replaced predecessor block@3: // for_footer_L10 with block@2: // for_body_L10 in block@4: // for_increment_L10 -debug: Merged linear block@3: // for_footer_L10 into block@2: // for_body_L10 -debug: Replaced predecessor block@4: // for_increment_L10 with block@2: // for_body_L10 in block@1: // for_header_L10 -debug: Merged linear block@4: // for_increment_L10 into block@2: // for_body_L10 +debug: Replaced predecessor block@3: // for_footer_L13 with block@2: // for_body_L13 in block@4: // for_increment_L13 +debug: Merged linear block@3: // for_footer_L13 into block@2: // for_body_L13 +debug: Replaced predecessor block@4: // for_increment_L13 with block@2: // for_body_L13 in block@1: // for_header_L13 +debug: Merged linear block@4: // for_increment_L13 into block@2: // for_body_L13 debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination @@ -442,10 +446,10 @@ debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump -debug: Replaced predecessor block@3: // for_footer_L10 with block@2: // for_body_L10 in block@4: // for_increment_L10 -debug: Merged linear block@3: // for_footer_L10 into block@2: // for_body_L10 -debug: Replaced predecessor block@4: // for_increment_L10 with block@2: // for_body_L10 in block@1: // for_header_L10 -debug: Merged linear block@4: // for_increment_L10 into block@2: // for_body_L10 +debug: Replaced predecessor block@3: // for_footer_L13 with block@2: // for_body_L13 in block@4: // for_increment_L13 +debug: Merged linear block@3: // for_footer_L13 into block@2: // for_body_L13 +debug: Replaced predecessor block@4: // for_increment_L13 with block@2: // for_body_L13 in block@1: // for_header_L13 +debug: Merged linear block@4: // for_increment_L13 into block@2: // for_body_L13 debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination @@ -523,7 +527,47 @@ debug: Replaced main_after_for@5.ops[28]: 'load tmp%7#0' with 'load tmp%7#0 from debug: Found 2 edge set/s for test_cases.scratch_slots.contract.MyContract.approval_program debug: test_cases.scratch_slots.contract.MyContract.approval_program f-stack entry: [] debug: test_cases.scratch_slots.contract.MyContract.approval_program f-stack on first store: ['i#0'] +debug: Output IR to scratch_slots/out/MyOtherContract.ssa.ir +info: Optimizing test_cases.scratch_slots.contract3.MyOtherContract at level 1 +debug: Begin optimization pass 1/100 +debug: Optimizing subroutine test_cases.scratch_slots.contract3.MyOtherContract.approval_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: No optimizations performed in pass 1, ending loop +debug: Removing Phis from test_cases.scratch_slots.contract3.MyOtherContract.approval_program +debug: Removing Phis from test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program +debug: Coalescing local variables in test_cases.scratch_slots.contract3.MyOtherContract.approval_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Sequentializing parallel copies in test_cases.scratch_slots.contract3.MyOtherContract.approval_program +debug: Sequentializing parallel copies in test_cases.scratch_slots.contract3.MyOtherContract.clear_state_program +debug: Performing post-SSA optimizations +debug: Output IR to scratch_slots/out/MyOtherContract.destructured.ir info: Writing scratch_slots/out/MyContract.approval.teal info: Writing scratch_slots/out/MyContract.clear.teal info: Writing scratch_slots/out/MyContract2.approval.teal -info: Writing scratch_slots/out/MyContract2.clear.teal \ No newline at end of file +info: Writing scratch_slots/out/MyContract2.clear.teal +info: Writing scratch_slots/out/MyOtherContract.approval.teal +info: Writing scratch_slots/out/MyOtherContract.clear.teal \ No newline at end of file diff --git a/tests/test_expected_output/scratch_slot_reservations.test b/tests/test_expected_output/scratch_slot_reservations.test new file mode 100644 index 0000000000..fcb8b63ee7 --- /dev/null +++ b/tests/test_expected_output/scratch_slot_reservations.test @@ -0,0 +1,60 @@ +## case: negative_scratch_slot_arg +import abc +from puyapy import Contract, urange + +class MyContract( + Contract, + abc.ABC, + scratch_slots=[-1], ## E: Invalid scratch slot reservation. Reserved range must fall entirely between 0 and 255 +): + pass + +class MyContract2( + Contract, + abc.ABC, + scratch_slots=urange(1, -2, -1), ## E: Invalid scratch slot reservation. Reserved range must fall entirely between 0 and 255 +): + pass + + +class MyContract3( + Contract, + abc.ABC, + scratch_slots=[urange(1, -2, -1)], ## E: Invalid scratch slot reservation. Reserved range must fall entirely between 0 and 255 +): + pass + +## case: scratch_slot_too_high +import abc +from puyapy import Contract, urange + +class MyContract( + Contract, + abc.ABC, + scratch_slots=[256], ## E: Invalid scratch slot reservation. Reserved range must fall entirely between 0 and 255 +): + pass + + +## case: scratch_slot_range_empty +import abc +from puyapy import Contract, urange + +class MyContract( + Contract, + abc.ABC, + scratch_slots=urange(0, 1, -1), ## E: Slot range is empty +): + pass + + +## case: scratch_slot_bad_urange_args +import abc +from puyapy import Contract, urange + +class MyContract( + Contract, + abc.ABC, + scratch_slots=urange(0, 2, 0), ## E: urange arg 3 must not be zero +): + pass From c9bc9e8fe1a0feccf9e4e9d9ee38f1f54b6cf4f3 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Mon, 26 Feb 2024 14:33:37 +0800 Subject: [PATCH 02/40] two-phase module AST conversion - note this should also solve the constant ordering issue --- scripts/compile_all_examples.py | 1 + src/puya/awst_build/main.py | 19 +- src/puya/awst_build/module.py | 188 ++++++++++-------- src/puya/awst_build/subroutine.py | 5 +- test_cases/constants/address_constant.py | 5 +- .../out/AddressConstantContract.approval.mir | 30 +-- .../out/AddressConstantContract.approval.teal | 12 +- .../out/AddressConstantContract.clear.mir | 4 +- .../out/AddressConstantContract.clear.teal | 2 +- .../AddressConstantContract.destructured.ir | 4 +- .../out/AddressConstantContract.ssa.ir | 4 +- .../AddressConstantContract.ssa.opt_pass_1.ir | 4 +- .../constants/out/address_constant.awst | 5 +- .../AddressConstantContract.destructured.ir | 4 +- .../AddressConstantContract.approval.teal | 10 +- .../AddressConstantContract.clear.teal | 2 +- .../AddressConstantContract.destructured.ir | 4 +- test_cases/constants/puya.log | 8 +- tests/utils.py | 1 + 19 files changed, 165 insertions(+), 147 deletions(-) diff --git a/scripts/compile_all_examples.py b/scripts/compile_all_examples.py index 0156278c9a..c163602baf 100755 --- a/scripts/compile_all_examples.py +++ b/scripts/compile_all_examples.py @@ -122,6 +122,7 @@ def _stabilise_logs(stdout: str) -> list[str]: "warning: Skipping stub: ", "debug: Skipping stdlib stub ", "debug: Building AWST for ", + "debug: Discovered user module ", ) ) ] diff --git a/src/puya/awst_build/main.py b/src/puya/awst_build/main.py index 4a0fb40f9d..97c2245551 100644 --- a/src/puya/awst_build/main.py +++ b/src/puya/awst_build/main.py @@ -47,21 +47,16 @@ def transform_ast(compile_context: CompileContext) -> dict[str, Module]: elif embedded_src := EMBEDDED_MODULES.get(module.name): logger.debug(f"Building AWST for embedded puyapy lib at {module_rel_path}") module._fullname = embedded_src.puya_module_name # noqa: SLF001 - result[embedded_src.puya_module_name] = ModuleASTConverter.convert(ctx, module) + result[embedded_src.puya_module_name] = ModuleASTConverter(ctx, module).convert() else: - user_modules[module_name] = module - for _, _ in user_modules.items(): - # TODO: pre-parse step: extract state info, constants, etc - pass - for module_name, module in user_modules.items(): + logger.debug(f"Discovered user module {module_name} at {module_rel_path}") + user_modules[module_name] = ModuleASTConverter(ctx, module) + for module_name, converter in user_modules.items(): logger.debug(f"Building AWST for module {module_name}") - errors_before_module = ctx.errors.num_errors - module_awst = ModuleASTConverter.convert(ctx, module) - validate_awst(ctx, module_awst) - had_errors = ctx.errors.num_errors > errors_before_module - if ctx.options.output_awst and not had_errors: - output_awst(module_awst, ctx.options) + module_awst = converter.convert() result[module_name] = module_awst + if ctx.options.output_awst and not converter.has_errors: + output_awst(module_awst, ctx.options) return result diff --git a/src/puya/awst_build/module.py b/src/puya/awst_build/module.py index 11ae2013a3..7ffd0c760f 100644 --- a/src/puya/awst_build/module.py +++ b/src/puya/awst_build/module.py @@ -1,4 +1,5 @@ import typing as t +from collections.abc import Callable import mypy.nodes import mypy.types @@ -28,49 +29,71 @@ get_decorators_by_fullname, get_unaliased_fullname, ) +from puya.awst_build.validation.main import validate_awst from puya.errors import CodeError, InternalError from puya.utils import StableSet logger = structlog.get_logger() -class ModuleASTConverter(BaseMyPyVisitor[None, ConstantValue]): - """This does basic validation, and traversal of valid module scope elements, collecting - and folding constants. +DeferredModuleStatement: t.TypeAlias = Callable[[ASTConversionModuleContext], ModuleStatement] + +StatementResult: t.TypeAlias = list[ModuleStatement | DeferredModuleStatement] - Note that constants must appear before usage, unlike in regular Python. - TODO: maybe collect constants in a pre-processing step? - """ +class ModuleASTConverter(BaseMyPyVisitor[StatementResult, ConstantValue]): + """This does basic validation, and traversal of valid module scope elements, collecting + and folding constants.""" def __init__(self, context: ASTConversionContext, module: mypy.nodes.MypyFile): super().__init__(context=context.for_module(module)) - docstring = extract_docstring(module) + self._mypy_module = module + self._docstring = extract_docstring(module) - self._statements = list[ModuleStatement]() - for node in module.defs: + # pre-parse + errors_start = self.context.errors.num_errors + pre_parse_result = list[tuple[mypy.nodes.Context, StatementResult]]() + for node in self._mypy_module.defs: with self.context.log_exceptions(fallback_location=node): - node.accept(self) - self.result = Module( + items = node.accept(self) + pre_parse_result.append((node, items)) + self._pre_parse_result = pre_parse_result + self._error_count = self.context.errors.num_errors - errors_start + + @property + def has_errors(self) -> bool: + return self._error_count > 0 + + def convert(self) -> Module: + statements = [] + errors_start = self.context.errors.num_errors + for node, items in self._pre_parse_result: + with self.context.log_exceptions(fallback_location=node): + for stmt_or_deferred in items: + if isinstance(stmt_or_deferred, ModuleStatement): + statements.append(stmt_or_deferred) + else: + statements.append(stmt_or_deferred(self.context)) + module = self._mypy_module + result = Module( name=module.name, source_file_path=module.path, - docstring=docstring, - body=self._statements, + docstring=self._docstring, + body=statements, ) - - @classmethod - def convert(cls, context: ASTConversionContext, module: mypy.nodes.MypyFile) -> Module: - return cls(context=context, module=module).result + validate_awst(self.context, result) + self._error_count += self.context.errors.num_errors - errors_start + return result # Supported Statements - def empty_statement(self, _stmt: mypy.nodes.Statement) -> None: - return None + def empty_statement(self, _stmt: mypy.nodes.Statement) -> StatementResult: + return [] def visit_function( self, func_def: mypy.nodes.FuncDef, decorator: mypy.nodes.Decorator | None - ) -> None: + ) -> StatementResult: self._precondition( func_def.abstract_status == mypy.nodes.NOT_ABSTRACT, "module level functions should not be classified as abstract by mypy", @@ -91,10 +114,9 @@ def visit_function( self._error(f'Unsupported function decorator "{dec_fullname}"', dec) source_location = self._location(decorator or func_def) - sub = FunctionASTConverter.convert(self.context, func_def, source_location) - self._statements.append(sub) + return [lambda ctx: FunctionASTConverter.convert(ctx, func_def, source_location)] - def visit_class_def(self, cdef: mypy.nodes.ClassDef) -> None: + def visit_class_def(self, cdef: mypy.nodes.ClassDef) -> StatementResult: self.check_fatal_decorators(cdef.decorators) match cdef.analyzed: case None: @@ -133,13 +155,13 @@ def visit_class_def(self, cdef: mypy.nodes.ClassDef) -> None: "arc4.Struct classes must only inherit directly from arc4.Struct", cdef ) else: - self._process_arc4_struct(cdef) + return [self._process_arc4_struct(cdef)] elif cdef.info.has_base(constants.STRUCT_BASE): if [ti.fullname for ti in cdef.info.direct_base_classes()] != [constants.STRUCT_BASE]: # TODO: allow inheritance of Structs? self._error("Struct classes must only inherit directly from Struct", cdef) else: - self._process_struct(cdef) + return [self._process_struct(cdef)] elif cdef.info.has_base(constants.CONTRACT_BASE): # TODO: mypyc also checks for typing.TypingMeta and typing.GenericMeta equivalently # in a similar check - I can't find many references to these, should we include @@ -155,15 +177,14 @@ def visit_class_def(self, cdef: mypy.nodes.ClassDef) -> None: # TODO: other checks above? else: class_options = self._process_contract_class_options(cdef) - self._statements.append( - ContractASTConverter.convert(self.context, cdef, class_options) - ) + return [lambda ctx: ContractASTConverter.convert(ctx, cdef, class_options)] else: self._error( f"not a subclass of {constants.CONTRACT_BASE_ALIAS}" f" or a direct subclass of {constants.STRUCT_BASE_ALIAS}", location=cdef, ) + return [] def _process_contract_class_options(self, cdef: mypy.nodes.ClassDef) -> ContractClassOptions: name_override: str | None = None @@ -209,7 +230,7 @@ def _process_contract_class_options(self, cdef: mypy.nodes.ClassDef) -> Contract scratch_slot_reservations=scratch_slot_reservations, ) - def _process_arc4_struct(self, cdef: mypy.nodes.ClassDef) -> None: + def _process_arc4_struct(self, cdef: mypy.nodes.ClassDef) -> ModuleStatement: field_types = dict[str, wtypes.WType]() field_decls = list[StructureField]() docstring = extract_docstring(cdef) @@ -245,18 +266,16 @@ def _process_arc4_struct(self, cdef: mypy.nodes.ClassDef) -> None: tuple_wtype = wtypes.ARC4Struct.from_name_and_fields( python_name=cdef.fullname, fields=field_types ) - self._statements.append( - StructureDefinition( - name=cdef.name, - source_location=self._location(cdef), - fields=field_decls, - wtype=tuple_wtype, - docstring=docstring, - ) - ) self.context.type_map[cdef.info.fullname] = tuple_wtype + return StructureDefinition( + name=cdef.name, + source_location=self._location(cdef), + fields=field_decls, + wtype=tuple_wtype, + docstring=docstring, + ) - def _process_struct(self, cdef: mypy.nodes.ClassDef) -> None: + def _process_struct(self, cdef: mypy.nodes.ClassDef) -> ModuleStatement: field_types = dict[str, wtypes.WType]() field_decls = list[StructureField]() docstring = extract_docstring(cdef) @@ -283,38 +302,38 @@ def _process_struct(self, cdef: mypy.nodes.ClassDef) -> None: case _: self._error("Unsupported Struct declaration", stmt) struct_wtype = wtypes.WStructType.from_name_and_fields(cdef.fullname, field_types) - self._statements.append( - StructureDefinition( - name=cdef.name, - source_location=self._location(cdef), - fields=field_decls, - wtype=struct_wtype, - docstring=docstring, - ) - ) self.context.type_map[cdef.info.fullname] = struct_wtype + return StructureDefinition( + name=cdef.name, + source_location=self._location(cdef), + fields=field_decls, + wtype=struct_wtype, + docstring=docstring, + ) - def visit_operator_assignment_stmt(self, stmt: mypy.nodes.OperatorAssignmentStmt) -> None: + def visit_operator_assignment_stmt( + self, stmt: mypy.nodes.OperatorAssignmentStmt + ) -> StatementResult: match stmt.lvalue: case mypy.nodes.NameExpr(name="__all__"): # TODO: this value is technically usable at runtime in Python, # any references to it in the method bodies should fail - pass # skip it + return self.empty_statement(stmt) case _: self._unsupported(stmt) - def visit_if_stmt(self, stmt: mypy.nodes.IfStmt) -> None: + def visit_if_stmt(self, stmt: mypy.nodes.IfStmt) -> StatementResult: for expr, block in zip(stmt.expr, stmt.body, strict=True): if self._evaluate_compile_time_constant_condition(expr): - block.accept(self) - break + return block.accept(self) + # if we didn't return, we end up here, which means the user code + # should evaluate to the else body (if present) + if stmt.else_body: + return stmt.else_body.accept(self) else: - # if we didn't "break", we end up here, which means the user code - # should evaluate to the else body (if present) - if stmt.else_body: - stmt.else_body.accept(self) + return [] - def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> None: + def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> StatementResult: self._precondition( bool(stmt.lvalues), "assignment statements should have at least one lvalue", stmt ) @@ -324,12 +343,12 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> None: stmt, ) if stmt.is_alias_def: # ie is this a typing.TypeAlias - return # skip it + return [] # skip it match stmt.lvalues: case [mypy.nodes.NameExpr(name="__all__")]: # TODO: this value is technically usable at runtime in Python, # any references to it in the method bodies should fail - return # skip it + return [] # skip it # mypy comments here indicate if this is a special form, # it will be a single lvalue of type NameExpr # https://github.com/python/mypy/blob/d2022a0007c0eb176ccaf37a9aa54c958be7fb10/mypy/semanal.py#L3508 @@ -344,7 +363,8 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> None: ): self._unsupported(stmt.rvalue, "unsupported type") case _: - return # skip it + return [] # skip it + const_delcs = StatementResult() rvalue = stmt.rvalue.accept(self) for lvalue in stmt.lvalues: match lvalue: @@ -360,7 +380,7 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> None: lvalue, ) self.context.constants[fullname] = rvalue - self._statements.append( + const_delcs.append( ConstantDeclaration( name=name_expr.name, value=rvalue, @@ -372,10 +392,14 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> None: lvalue, "only straight-forward assignment targets supported at module level", ) + return const_delcs - def visit_block(self, block: mypy.nodes.Block) -> None: + def visit_block(self, block: mypy.nodes.Block) -> StatementResult: + result = StatementResult() for stmt in block.body: - stmt.accept(self) + items = stmt.accept(self) + result.extend(items) + return result # Expressions @@ -537,36 +561,36 @@ def _unsupported( # Unsupported Statements - def visit_expression_stmt(self, stmt: mypy.nodes.ExpressionStmt) -> None: - self._unsupported(stmt) + def visit_expression_stmt(self, stmt: mypy.nodes.ExpressionStmt) -> StatementResult: + return self._unsupported(stmt) - def visit_while_stmt(self, stmt: mypy.nodes.WhileStmt) -> None: - self._unsupported(stmt) + def visit_while_stmt(self, stmt: mypy.nodes.WhileStmt) -> StatementResult: + return self._unsupported(stmt) - def visit_for_stmt(self, stmt: mypy.nodes.ForStmt) -> None: - self._unsupported(stmt) + def visit_for_stmt(self, stmt: mypy.nodes.ForStmt) -> StatementResult: + return self._unsupported(stmt) - def visit_break_stmt(self, stmt: mypy.nodes.BreakStmt) -> None: - self._unsupported(stmt) + def visit_break_stmt(self, stmt: mypy.nodes.BreakStmt) -> StatementResult: + return self._unsupported(stmt) - def visit_continue_stmt(self, stmt: mypy.nodes.ContinueStmt) -> None: - self._unsupported(stmt) + def visit_continue_stmt(self, stmt: mypy.nodes.ContinueStmt) -> StatementResult: + return self._unsupported(stmt) - def visit_assert_stmt(self, stmt: mypy.nodes.AssertStmt) -> None: - self._unsupported(stmt) + def visit_assert_stmt(self, stmt: mypy.nodes.AssertStmt) -> StatementResult: + return self._unsupported(stmt) - def visit_del_stmt(self, stmt: mypy.nodes.DelStmt) -> None: - self._unsupported(stmt) + def visit_del_stmt(self, stmt: mypy.nodes.DelStmt) -> StatementResult: + return self._unsupported(stmt) - def visit_match_stmt(self, stmt: mypy.nodes.MatchStmt) -> None: - self._unsupported(stmt) + def visit_match_stmt(self, stmt: mypy.nodes.MatchStmt) -> StatementResult: + return self._unsupported(stmt) # the remaining statements (below) are invalid at the module lexical scope, # mypy should have caught these errors already - def visit_return_stmt(self, stmt: mypy.nodes.ReturnStmt) -> None: + def visit_return_stmt(self, stmt: mypy.nodes.ReturnStmt) -> StatementResult: raise InternalError("encountered return statement at module level", self._location(stmt)) - def visit_nonlocal_decl(self, stmt: mypy.nodes.NonlocalDecl) -> None: + def visit_nonlocal_decl(self, stmt: mypy.nodes.NonlocalDecl) -> StatementResult: raise InternalError( "encountered nonlocal declaration at module level", self._location(stmt) ) diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index 0d3cd1f012..1cb1a89c5b 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -671,11 +671,8 @@ def _visit_ref_expr_maybe_aliased( try: constant_value = self.context.constants[expr.fullname] except KeyError as ex: - # TODO: allow arbitrary ordering raise CodeError( - "Unable to resolve global constant reference" - " - note that constants must appear before any references to them", - expr_loc, + "Unable to resolve global constant reference", expr_loc ) from ex else: return Literal(source_location=expr_loc, value=constant_value) diff --git a/test_cases/constants/address_constant.py b/test_cases/constants/address_constant.py index 3cc5d5cf76..043e71a642 100644 --- a/test_cases/constants/address_constant.py +++ b/test_cases/constants/address_constant.py @@ -1,7 +1,5 @@ from puyapy import Account, Contract, log, op -SOME_ADDRESS = "VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA" - class AddressConstantContract(Contract): def approval_program(self) -> bool: @@ -17,3 +15,6 @@ def approval_program(self) -> bool: def clear_state_program(self) -> bool: return True + + +SOME_ADDRESS = "VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA" diff --git a/test_cases/constants/out/AddressConstantContract.approval.mir b/test_cases/constants/out/AddressConstantContract.approval.mir index e15d5954eb..84f3bd5d64 100644 --- a/test_cases/constants/out/AddressConstantContract.approval.mir +++ b/test_cases/constants/out/AddressConstantContract.approval.mir @@ -4,19 +4,19 @@ // test_cases.constants.address_constant.AddressConstantContract.approval_program() -> uint64: main_block@0: - txn Sender // {txn} op.Txn.sender constants/address_constant.py:11 - // virtual: store sender#0 to l-stack (no copy) sender#0 sender = op.Txn.sender constants/address_constant.py:11 - // virtual: load sender#0 from l-stack (no copy) sender#0 log(sender_bytes) constants/address_constant.py:13 - log // log(sender_bytes) constants/address_constant.py:13 - txn Sender // {txn} op.Txn.sender constants/address_constant.py:14 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 op.Txn.sender constants/address_constant.py:14 - // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 is_some_address = op.Txn.sender == some_address constants/address_constant.py:14 - addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA // tmp%0#0,VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA SOME_ADDRESS constants/address_constant.py:8 - == // {==} op.Txn.sender == some_address constants/address_constant.py:14 - // virtual: store is_some_address#0 to l-stack (no copy) is_some_address#0 is_some_address = op.Txn.sender == some_address constants/address_constant.py:14 - // virtual: load is_some_address#0 from l-stack (no copy) is_some_address#0 not is_some_address constants/address_constant.py:16 - ! // {!} not is_some_address constants/address_constant.py:16 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 not is_some_address constants/address_constant.py:16 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 return not is_some_address constants/address_constant.py:16 - return // return not is_some_address constants/address_constant.py:16 + txn Sender // {txn} op.Txn.sender constants/address_constant.py:9 + // virtual: store sender#0 to l-stack (no copy) sender#0 sender = op.Txn.sender constants/address_constant.py:9 + // virtual: load sender#0 from l-stack (no copy) sender#0 log(sender_bytes) constants/address_constant.py:11 + log // log(sender_bytes) constants/address_constant.py:11 + txn Sender // {txn} op.Txn.sender constants/address_constant.py:12 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 op.Txn.sender constants/address_constant.py:12 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 is_some_address = op.Txn.sender == some_address constants/address_constant.py:12 + addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA // tmp%0#0,VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA SOME_ADDRESS constants/address_constant.py:6 + == // {==} op.Txn.sender == some_address constants/address_constant.py:12 + // virtual: store is_some_address#0 to l-stack (no copy) is_some_address#0 is_some_address = op.Txn.sender == some_address constants/address_constant.py:12 + // virtual: load is_some_address#0 from l-stack (no copy) is_some_address#0 not is_some_address constants/address_constant.py:14 + ! // {!} not is_some_address constants/address_constant.py:14 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 not is_some_address constants/address_constant.py:14 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 return not is_some_address constants/address_constant.py:14 + return // return not is_some_address constants/address_constant.py:14 diff --git a/test_cases/constants/out/AddressConstantContract.approval.teal b/test_cases/constants/out/AddressConstantContract.approval.teal index e7cf421597..2889316726 100644 --- a/test_cases/constants/out/AddressConstantContract.approval.teal +++ b/test_cases/constants/out/AddressConstantContract.approval.teal @@ -1,22 +1,22 @@ #pragma version 10 test_cases.constants.address_constant.AddressConstantContract.approval_program: - // constants/address_constant.py:11 + // constants/address_constant.py:9 // sender = op.Txn.sender txn Sender - // constants/address_constant.py:13 + // constants/address_constant.py:11 // log(sender_bytes) log - // constants/address_constant.py:14 + // constants/address_constant.py:12 // is_some_address = op.Txn.sender == some_address txn Sender - // constants/address_constant.py:8 + // constants/address_constant.py:6 // some_address = Account(SOME_ADDRESS) addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA - // constants/address_constant.py:14 + // constants/address_constant.py:12 // is_some_address = op.Txn.sender == some_address == - // constants/address_constant.py:16 + // constants/address_constant.py:14 // return not is_some_address ! return diff --git a/test_cases/constants/out/AddressConstantContract.clear.mir b/test_cases/constants/out/AddressConstantContract.clear.mir index baa3c1d623..a2a3b68456 100644 --- a/test_cases/constants/out/AddressConstantContract.clear.mir +++ b/test_cases/constants/out/AddressConstantContract.clear.mir @@ -4,6 +4,6 @@ // test_cases.constants.address_constant.AddressConstantContract.clear_state_program() -> uint64: main_block@0: - int 1 // 1 True constants/address_constant.py:19 - return // return True constants/address_constant.py:19 + int 1 // 1 True constants/address_constant.py:17 + return // return True constants/address_constant.py:17 diff --git a/test_cases/constants/out/AddressConstantContract.clear.teal b/test_cases/constants/out/AddressConstantContract.clear.teal index 3af1836ed3..35ee9bf8c5 100644 --- a/test_cases/constants/out/AddressConstantContract.clear.teal +++ b/test_cases/constants/out/AddressConstantContract.clear.teal @@ -1,7 +1,7 @@ #pragma version 10 test_cases.constants.address_constant.AddressConstantContract.clear_state_program: - // constants/address_constant.py:19 + // constants/address_constant.py:17 // return True int 1 return diff --git a/test_cases/constants/out/AddressConstantContract.destructured.ir b/test_cases/constants/out/AddressConstantContract.destructured.ir index 8c9ab9f76f..a6349b715a 100644 --- a/test_cases/constants/out/AddressConstantContract.destructured.ir +++ b/test_cases/constants/out/AddressConstantContract.destructured.ir @@ -1,7 +1,7 @@ contract test_cases.constants.address_constant.AddressConstantContract: program approval: subroutine test_cases.constants.address_constant.AddressConstantContract.approval_program() -> uint64: - block@0: // L7 + block@0: // L5 let sender#0: bytes = (txn Sender) (log sender#0) let tmp%0#0: bytes = (txn Sender) @@ -11,5 +11,5 @@ contract test_cases.constants.address_constant.AddressConstantContract: program clear-state: subroutine test_cases.constants.address_constant.AddressConstantContract.clear_state_program() -> uint64: - block@0: // L18 + block@0: // L16 return 1u \ No newline at end of file diff --git a/test_cases/constants/out/AddressConstantContract.ssa.ir b/test_cases/constants/out/AddressConstantContract.ssa.ir index 44d43e6dba..5d7291964b 100644 --- a/test_cases/constants/out/AddressConstantContract.ssa.ir +++ b/test_cases/constants/out/AddressConstantContract.ssa.ir @@ -1,7 +1,7 @@ contract test_cases.constants.address_constant.AddressConstantContract: program approval: subroutine test_cases.constants.address_constant.AddressConstantContract.approval_program() -> uint64: - block@0: // L7 + block@0: // L5 let some_address#0: bytes = addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA let some_address#1: bytes = some_address#0 let sender#0: bytes = (txn Sender) @@ -14,5 +14,5 @@ contract test_cases.constants.address_constant.AddressConstantContract: program clear-state: subroutine test_cases.constants.address_constant.AddressConstantContract.clear_state_program() -> uint64: - block@0: // L18 + block@0: // L16 return 1u \ No newline at end of file diff --git a/test_cases/constants/out/AddressConstantContract.ssa.opt_pass_1.ir b/test_cases/constants/out/AddressConstantContract.ssa.opt_pass_1.ir index 8c9ab9f76f..a6349b715a 100644 --- a/test_cases/constants/out/AddressConstantContract.ssa.opt_pass_1.ir +++ b/test_cases/constants/out/AddressConstantContract.ssa.opt_pass_1.ir @@ -1,7 +1,7 @@ contract test_cases.constants.address_constant.AddressConstantContract: program approval: subroutine test_cases.constants.address_constant.AddressConstantContract.approval_program() -> uint64: - block@0: // L7 + block@0: // L5 let sender#0: bytes = (txn Sender) (log sender#0) let tmp%0#0: bytes = (txn Sender) @@ -11,5 +11,5 @@ contract test_cases.constants.address_constant.AddressConstantContract: program clear-state: subroutine test_cases.constants.address_constant.AddressConstantContract.clear_state_program() -> uint64: - block@0: // L18 + block@0: // L16 return 1u \ No newline at end of file diff --git a/test_cases/constants/out/address_constant.awst b/test_cases/constants/out/address_constant.awst index 1da6aaa4d8..b8412e2ee2 100644 --- a/test_cases/constants/out/address_constant.awst +++ b/test_cases/constants/out/address_constant.awst @@ -1,5 +1,3 @@ -SOME_ADDRESS = 'VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA' - contract AddressConstantContract { approval_program(): bool @@ -17,4 +15,5 @@ contract AddressConstantContract { return true } -} \ No newline at end of file +} +SOME_ADDRESS = 'VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA' \ No newline at end of file diff --git a/test_cases/constants/out_O2/AddressConstantContract.destructured.ir b/test_cases/constants/out_O2/AddressConstantContract.destructured.ir index 8c9ab9f76f..a6349b715a 100644 --- a/test_cases/constants/out_O2/AddressConstantContract.destructured.ir +++ b/test_cases/constants/out_O2/AddressConstantContract.destructured.ir @@ -1,7 +1,7 @@ contract test_cases.constants.address_constant.AddressConstantContract: program approval: subroutine test_cases.constants.address_constant.AddressConstantContract.approval_program() -> uint64: - block@0: // L7 + block@0: // L5 let sender#0: bytes = (txn Sender) (log sender#0) let tmp%0#0: bytes = (txn Sender) @@ -11,5 +11,5 @@ contract test_cases.constants.address_constant.AddressConstantContract: program clear-state: subroutine test_cases.constants.address_constant.AddressConstantContract.clear_state_program() -> uint64: - block@0: // L18 + block@0: // L16 return 1u \ No newline at end of file diff --git a/test_cases/constants/out_unoptimized/AddressConstantContract.approval.teal b/test_cases/constants/out_unoptimized/AddressConstantContract.approval.teal index adbe092a89..1921c2b5be 100644 --- a/test_cases/constants/out_unoptimized/AddressConstantContract.approval.teal +++ b/test_cases/constants/out_unoptimized/AddressConstantContract.approval.teal @@ -1,21 +1,21 @@ #pragma version 10 test_cases.constants.address_constant.AddressConstantContract.approval_program: - // constants/address_constant.py:8 + // constants/address_constant.py:6 // some_address = Account(SOME_ADDRESS) addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA - // constants/address_constant.py:11 + // constants/address_constant.py:9 // sender = op.Txn.sender txn Sender - // constants/address_constant.py:13 + // constants/address_constant.py:11 // log(sender_bytes) log - // constants/address_constant.py:14 + // constants/address_constant.py:12 // is_some_address = op.Txn.sender == some_address txn Sender swap == - // constants/address_constant.py:16 + // constants/address_constant.py:14 // return not is_some_address ! return diff --git a/test_cases/constants/out_unoptimized/AddressConstantContract.clear.teal b/test_cases/constants/out_unoptimized/AddressConstantContract.clear.teal index 3af1836ed3..35ee9bf8c5 100644 --- a/test_cases/constants/out_unoptimized/AddressConstantContract.clear.teal +++ b/test_cases/constants/out_unoptimized/AddressConstantContract.clear.teal @@ -1,7 +1,7 @@ #pragma version 10 test_cases.constants.address_constant.AddressConstantContract.clear_state_program: - // constants/address_constant.py:19 + // constants/address_constant.py:17 // return True int 1 return diff --git a/test_cases/constants/out_unoptimized/AddressConstantContract.destructured.ir b/test_cases/constants/out_unoptimized/AddressConstantContract.destructured.ir index bf5e38baf3..192262f6a4 100644 --- a/test_cases/constants/out_unoptimized/AddressConstantContract.destructured.ir +++ b/test_cases/constants/out_unoptimized/AddressConstantContract.destructured.ir @@ -1,7 +1,7 @@ contract test_cases.constants.address_constant.AddressConstantContract: program approval: subroutine test_cases.constants.address_constant.AddressConstantContract.approval_program() -> uint64: - block@0: // L7 + block@0: // L5 let some_address#0: bytes = addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA let sender#0: bytes = (txn Sender) let sender_bytes#0: bytes = sender#0 @@ -13,5 +13,5 @@ contract test_cases.constants.address_constant.AddressConstantContract: program clear-state: subroutine test_cases.constants.address_constant.AddressConstantContract.clear_state_program() -> uint64: - block@0: // L18 + block@0: // L16 return 1u \ No newline at end of file diff --git a/test_cases/constants/puya.log b/test_cases/constants/puya.log index 65314496b4..d273719c68 100644 --- a/test_cases/constants/puya.log +++ b/test_cases/constants/puya.log @@ -285,10 +285,10 @@ debug: Deleting Phi assignment: let sequence#1: bytes = φ(sequence#0 <- block@0 debug: Replaced trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0 in current definition for 3 blocks debug: Sealing block@None: // after_while_L11 debug: Terminated block@5: // after_while_L11 -debug: Sealing block@0: // L7 -debug: Terminated block@0: // L7 -debug: Sealing block@0: // L18 -debug: Terminated block@0: // L18 +debug: Sealing block@0: // L5 +debug: Terminated block@0: // L5 +debug: Sealing block@0: // L16 +debug: Terminated block@0: // L16 debug: Sealing block@0: // L5 debug: Terminated block@0: // L5 debug: Sealing block@0: // L16 diff --git a/tests/utils.py b/tests/utils.py index fe86974231..87287b6921 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -28,6 +28,7 @@ "Skipping puyapy stub ", "Skipping typeshed stub ", "Skipping stdlib stub ", + "Discovered user module ", ), "warning": ("Skipping stub: ",), } From 8cb8241155ff076d8aebc77538c5005bd8f69e2a Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Mon, 26 Feb 2024 15:20:23 +0800 Subject: [PATCH 03/40] refactor --- src/puya/awst_build/module.py | 280 ++++++++++++++++++---------------- 1 file changed, 152 insertions(+), 128 deletions(-) diff --git a/src/puya/awst_build/module.py b/src/puya/awst_build/module.py index 7ffd0c760f..d7b3dd4530 100644 --- a/src/puya/awst_build/module.py +++ b/src/puya/awst_build/module.py @@ -155,13 +155,13 @@ def visit_class_def(self, cdef: mypy.nodes.ClassDef) -> StatementResult: "arc4.Struct classes must only inherit directly from arc4.Struct", cdef ) else: - return [self._process_arc4_struct(cdef)] + return _process_arc4_struct(self.context, cdef) elif cdef.info.has_base(constants.STRUCT_BASE): if [ti.fullname for ti in cdef.info.direct_base_classes()] != [constants.STRUCT_BASE]: # TODO: allow inheritance of Structs? self._error("Struct classes must only inherit directly from Struct", cdef) else: - return [self._process_struct(cdef)] + return _process_struct(self.context, cdef) elif cdef.info.has_base(constants.CONTRACT_BASE): # TODO: mypyc also checks for typing.TypingMeta and typing.GenericMeta equivalently # in a similar check - I can't find many references to these, should we include @@ -176,7 +176,7 @@ def visit_class_def(self, cdef: mypy.nodes.ClassDef) -> StatementResult: ) # TODO: other checks above? else: - class_options = self._process_contract_class_options(cdef) + class_options = _process_contract_class_options(self.context, self, cdef) return [lambda ctx: ContractASTConverter.convert(ctx, cdef, class_options)] else: self._error( @@ -186,131 +186,6 @@ def visit_class_def(self, cdef: mypy.nodes.ClassDef) -> StatementResult: ) return [] - def _process_contract_class_options(self, cdef: mypy.nodes.ClassDef) -> ContractClassOptions: - name_override: str | None = None - scratch_slot_reservations = StableSet[int]() - for kw_name, kw_expr in cdef.keywords.items(): - with self.context.log_exceptions(kw_expr): - match kw_name: - case "name": - name_value = kw_expr.accept(self) - if isinstance(name_value, str): - name_override = name_value - else: - self._error("Invalid type for name=", kw_expr) - case "scratch_slots": - if isinstance(kw_expr, mypy.nodes.TupleExpr | mypy.nodes.ListExpr): - slot_items = kw_expr.items - else: - slot_items = [kw_expr] - for item_expr in slot_items: - slots = _map_scratch_space_reservation(self.context, item_expr) - if not slots: - self._error("Slot range is empty", item_expr) - elif (min(slots) < 0) or (max(slots) > MAX_SCRATCH_SLOT_NUMBER): - self._error( - f"Invalid scratch slot reservation." - f" Reserved range must fall entirely between 0" - f" and {MAX_SCRATCH_SLOT_NUMBER}", - item_expr, - ) - else: - scratch_slot_reservations |= slots - case _: - self._error("Unrecognised class keyword", kw_expr) - for base in cdef.info.bases: - base_cdef = base.type.defn - if not base_cdef.info.has_base(constants.CONTRACT_BASE): - continue - base_options = self._process_contract_class_options(base_cdef) - for reservation in base_options.scratch_slot_reservations: - scratch_slot_reservations.add(reservation) - return ContractClassOptions( - name_override=name_override, - scratch_slot_reservations=scratch_slot_reservations, - ) - - def _process_arc4_struct(self, cdef: mypy.nodes.ClassDef) -> ModuleStatement: - field_types = dict[str, wtypes.WType]() - field_decls = list[StructureField]() - docstring = extract_docstring(cdef) - - for stmt in cdef.defs.body: - match stmt: - case mypy.nodes.AssignmentStmt( - lvalues=[mypy.nodes.NameExpr(name=field_name)], - rvalue=mypy.nodes.TempNode(), - type=mypy.types.Type() as mypy_type, - ): - wtype = self.context.type_to_wtype(mypy_type, source_location=stmt) - if not wtypes.is_arc4_encoded_type(wtype): - raise CodeError( - f"Invalid field type for arc4.Struct: {wtype}", self._location(stmt) - ) - field_types[field_name] = wtype - field_decls.append( - StructureField( - source_location=self._location(stmt), - name=field_name, - wtype=wtype, - ) - ) - case mypy.nodes.SymbolNode(name=symbol_name) if ( - cdef.info.names[symbol_name].plugin_generated - ): - pass - case _: - self._error("Unsupported Struct declaration", stmt) - if not field_types: - raise CodeError("arc4.Struct requires at least one field", self._location(cdef)) - tuple_wtype = wtypes.ARC4Struct.from_name_and_fields( - python_name=cdef.fullname, fields=field_types - ) - self.context.type_map[cdef.info.fullname] = tuple_wtype - return StructureDefinition( - name=cdef.name, - source_location=self._location(cdef), - fields=field_decls, - wtype=tuple_wtype, - docstring=docstring, - ) - - def _process_struct(self, cdef: mypy.nodes.ClassDef) -> ModuleStatement: - field_types = dict[str, wtypes.WType]() - field_decls = list[StructureField]() - docstring = extract_docstring(cdef) - for stmt in cdef.defs.body: - match stmt: - case mypy.nodes.AssignmentStmt( - lvalues=[mypy.nodes.NameExpr(name=field_name)], - rvalue=mypy.nodes.TempNode(), - type=mypy.types.Type() as mypy_type, - ): - wtype = self.context.type_to_wtype(mypy_type, source_location=stmt) - field_decls.append( - StructureField( - source_location=self._location(stmt), - name=field_name, - wtype=wtype, - ) - ) - field_types[field_name] = wtype - case mypy.nodes.SymbolNode(name=symbol_name) if ( - cdef.info.names[symbol_name].plugin_generated - ): - pass - case _: - self._error("Unsupported Struct declaration", stmt) - struct_wtype = wtypes.WStructType.from_name_and_fields(cdef.fullname, field_types) - self.context.type_map[cdef.info.fullname] = struct_wtype - return StructureDefinition( - name=cdef.name, - source_location=self._location(cdef), - fields=field_decls, - wtype=struct_wtype, - docstring=docstring, - ) - def visit_operator_assignment_stmt( self, stmt: mypy.nodes.OperatorAssignmentStmt ) -> StatementResult: @@ -625,6 +500,155 @@ def visit_lambda_expr(self, expr: mypy.nodes.LambdaExpr) -> ConstantValue: return self._unsupported(expr) +def _process_contract_class_options( + context: ASTConversionModuleContext, + expr_visitor: mypy.visitor.ExpressionVisitor[ConstantValue], + cdef: mypy.nodes.ClassDef, +) -> ContractClassOptions: + name_override: str | None = None + scratch_slot_reservations = StableSet[int]() + for kw_name, kw_expr in cdef.keywords.items(): + with context.log_exceptions(kw_expr): + match kw_name: + case "name": + name_value = kw_expr.accept(expr_visitor) + if isinstance(name_value, str): + name_override = name_value + else: + context.error("Invalid type for name=", kw_expr) + case "scratch_slots": + if isinstance(kw_expr, mypy.nodes.TupleExpr | mypy.nodes.ListExpr): + slot_items = kw_expr.items + else: + slot_items = [kw_expr] + for item_expr in slot_items: + slots = _map_scratch_space_reservation(context, item_expr) + if not slots: + context.error("Slot range is empty", item_expr) + elif (min(slots) < 0) or (max(slots) > MAX_SCRATCH_SLOT_NUMBER): + context.error( + f"Invalid scratch slot reservation." + f" Reserved range must fall entirely between 0" + f" and {MAX_SCRATCH_SLOT_NUMBER}", + item_expr, + ) + else: + scratch_slot_reservations |= slots + case _: + context.error("Unrecognised class keyword", kw_expr) + for base in cdef.info.bases: + base_cdef = base.type.defn + if not base_cdef.info.has_base(constants.CONTRACT_BASE): + continue + base_options = _process_contract_class_options(context, expr_visitor, base_cdef) + for reservation in base_options.scratch_slot_reservations: + scratch_slot_reservations.add(reservation) + return ContractClassOptions( + name_override=name_override, + scratch_slot_reservations=scratch_slot_reservations, + ) + + +def _process_struct( + context: ASTConversionModuleContext, cdef: mypy.nodes.ClassDef +) -> StatementResult: + field_types = dict[str, wtypes.WType]() + field_decls = list[StructureField]() + docstring = extract_docstring(cdef) + has_error = False + for stmt in cdef.defs.body: + match stmt: + case mypy.nodes.AssignmentStmt( + lvalues=[mypy.nodes.NameExpr(name=field_name)], + rvalue=mypy.nodes.TempNode(), + type=mypy.types.Type() as mypy_type, + ): + wtype = context.type_to_wtype(mypy_type, source_location=stmt) + field_types[field_name] = wtype + field_decls.append( + StructureField( + source_location=context.node_location(stmt), + name=field_name, + wtype=wtype, + ) + ) + case mypy.nodes.SymbolNode(name=symbol_name) if ( + cdef.info.names[symbol_name].plugin_generated + ): + pass + case _: + context.error("Unsupported Struct declaration", stmt) + has_error = True + if has_error: + return [] + struct_wtype = wtypes.WStructType.from_name_and_fields(cdef.fullname, field_types) + context.type_map[cdef.info.fullname] = struct_wtype + return [ + StructureDefinition( + name=cdef.name, + source_location=context.node_location(cdef), + fields=field_decls, + wtype=struct_wtype, + docstring=docstring, + ) + ] + + +def _process_arc4_struct( + context: ASTConversionModuleContext, cdef: mypy.nodes.ClassDef +) -> StatementResult: + field_types = dict[str, wtypes.WType]() + field_decls = list[StructureField]() + docstring = extract_docstring(cdef) + + has_error = False + for stmt in cdef.defs.body: + match stmt: + case mypy.nodes.AssignmentStmt( + lvalues=[mypy.nodes.NameExpr(name=field_name)], + rvalue=mypy.nodes.TempNode(), + type=mypy.types.Type() as mypy_type, + ): + wtype = context.type_to_wtype(mypy_type, source_location=stmt) + if not wtypes.is_arc4_encoded_type(wtype): + context.error(f"Invalid field type for arc4.Struct: {wtype}", stmt) + has_error = True + else: + field_types[field_name] = wtype + field_decls.append( + StructureField( + source_location=context.node_location(stmt), + name=field_name, + wtype=wtype, + ) + ) + case mypy.nodes.SymbolNode(name=symbol_name) if ( + cdef.info.names[symbol_name].plugin_generated + ): + pass + case _: + context.error("Unsupported arc4.Struct declaration", stmt) + has_error = True + if has_error: + return [] + if not field_types: + context.error("arc4.Struct requires at least one field", cdef) + return [] + tuple_wtype = wtypes.ARC4Struct.from_name_and_fields( + python_name=cdef.fullname, fields=field_types + ) + context.type_map[cdef.info.fullname] = tuple_wtype + return [ + StructureDefinition( + name=cdef.name, + source_location=context.node_location(cdef), + fields=field_decls, + wtype=tuple_wtype, + docstring=docstring, + ) + ] + + def _get_int_arg( context: ASTConversionModuleContext, arg_expr: mypy.nodes.Expression, *, error_msg: str ) -> int: From 07f4f01acc3059e0390437a79e4e5cf428d2d5e4 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 27 Feb 2024 10:23:28 +0800 Subject: [PATCH 04/40] wip --- src/puya/awst/nodes.py | 1 + src/puya/awst_build/contract.py | 15 ++++++--------- src/puya/awst_build/contract_data.py | 7 +++++++ src/puya/awst_build/main.py | 1 - src/puya/awst_build/module.py | 3 ++- src/puyapy-stubs/_state.pyi | 8 +++++--- test_cases/scratch_slots/contract2.py | 1 + tests/test_expected_output/subroutine.test | 4 ++-- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index 5dbcf8e616..72f57fa182 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -1490,6 +1490,7 @@ class AppStateDefinition(Node): key: bytes key_encoding: BytesEncoding storage_wtype: WType + description: str | None @attrs.frozen diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index 33dda83416..dcf471ca62 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -2,7 +2,6 @@ from collections.abc import Iterator, Mapping from typing import Never -import attrs import mypy.nodes import mypy.types import mypy.visitor @@ -21,7 +20,11 @@ from puya.awst_build import constants from puya.awst_build.base_mypy_visitor import BaseMyPyStatementVisitor from puya.awst_build.context import ASTConversionModuleContext -from puya.awst_build.contract_data import AppStateDeclaration, AppStateDeclType +from puya.awst_build.contract_data import ( + AppStateDeclaration, + AppStateDeclType, + ContractClassOptions, +) from puya.awst_build.subroutine import ContractMethodInfo, FunctionASTConverter from puya.awst_build.utils import ( extract_bytes_literal_from_mypy, @@ -33,17 +36,10 @@ from puya.errors import CodeError, InternalError from puya.models import ARC4DefaultArgument, ARC4MethodConfig, ARC32StructDef, OnCompletionAction from puya.parse import SourceLocation -from puya.utils import StableSet ALLOWABLE_OCA = [oca.name for oca in OnCompletionAction if oca != OnCompletionAction.ClearState] -@attrs.define -class ContractClassOptions: - name_override: str | None - scratch_slot_reservations: StableSet[int] - - class ContractASTConverter(BaseMyPyStatementVisitor[None]): def __init__( self, @@ -443,6 +439,7 @@ def _gather_app_state( key=name.encode(), # TODO: encode name -> key with source file encoding? key_encoding=BytesEncoding.utf8, kind=kind, + description=None, # TODO! ) yield AppStateDeclaration(state_def, decl_type) diff --git a/src/puya/awst_build/contract_data.py b/src/puya/awst_build/contract_data.py index 3926c357ef..3721ff4121 100644 --- a/src/puya/awst_build/contract_data.py +++ b/src/puya/awst_build/contract_data.py @@ -3,6 +3,7 @@ import attrs from puya.awst.nodes import AppStateDefinition +from puya.utils import StableSet @enum.unique @@ -16,3 +17,9 @@ class AppStateDeclType(enum.Enum): class AppStateDeclaration: state_def: AppStateDefinition decl_type: AppStateDeclType + + +@attrs.define +class ContractClassOptions: + name_override: str | None + scratch_slot_reservations: StableSet[int] diff --git a/src/puya/awst_build/main.py b/src/puya/awst_build/main.py index 97c2245551..6a2cd8676a 100644 --- a/src/puya/awst_build/main.py +++ b/src/puya/awst_build/main.py @@ -7,7 +7,6 @@ from puya.awst.to_code_visitor import ToCodeVisitor from puya.awst_build.context import ASTConversionContext from puya.awst_build.module import ModuleASTConverter -from puya.awst_build.validation.main import validate_awst from puya.context import CompileContext from puya.errors import InternalError from puya.options import PuyaOptions diff --git a/src/puya/awst_build/module.py b/src/puya/awst_build/module.py index d7b3dd4530..01065e048a 100644 --- a/src/puya/awst_build/module.py +++ b/src/puya/awst_build/module.py @@ -19,7 +19,8 @@ from puya.awst_build import constants from puya.awst_build.base_mypy_visitor import BaseMyPyVisitor from puya.awst_build.context import ASTConversionContext, ASTConversionModuleContext -from puya.awst_build.contract import ContractASTConverter, ContractClassOptions +from puya.awst_build.contract import ContractASTConverter +from puya.awst_build.contract_data import ContractClassOptions from puya.awst_build.exceptions import UnsupportedASTError from puya.awst_build.subroutine import FunctionASTConverter from puya.awst_build.utils import ( diff --git a/src/puyapy-stubs/_state.pyi b/src/puyapy-stubs/_state.pyi index 4ae45e5d24..343bf39562 100644 --- a/src/puyapy-stubs/_state.pyi +++ b/src/puyapy-stubs/_state.pyi @@ -1,6 +1,6 @@ import typing -from puyapy import Account, UInt64, Bytes, BytesBacked +from puyapy import Account, Bytes, BytesBacked, UInt64 _T = typing.TypeVar("_T", bound=UInt64 | Bytes | BytesBacked) @@ -11,7 +11,8 @@ class LocalState(typing.Generic[_T]): self, type_: type[_T], /, - key: typing.LiteralString | bytes | None = None, + *, + key: bytes | typing.LiteralString | None = None, description: typing.LiteralString | None = None, ) -> None: """Declare the local state key and it's associated type @@ -84,7 +85,8 @@ class GlobalState(typing.Generic[_T]): self, type_: type[_T], /, - key: typing.LiteralString | bytes | None = None, + *, + key: bytes | typing.LiteralString | None = None, description: typing.LiteralString | None = None, ) -> None: """Declare the global state key and its type without initializing its value""" diff --git a/test_cases/scratch_slots/contract2.py b/test_cases/scratch_slots/contract2.py index 599f17f8a9..93f4dcea23 100644 --- a/test_cases/scratch_slots/contract2.py +++ b/test_cases/scratch_slots/contract2.py @@ -2,6 +2,7 @@ import puyapy from puyapy import Bytes, UInt64, op, subroutine, urange + from test_cases.scratch_slots.contract import MyContract RenamedURange: typing.TypeAlias = urange diff --git a/tests/test_expected_output/subroutine.test b/tests/test_expected_output/subroutine.test index 53a2042057..ea98ddb09b 100644 --- a/tests/test_expected_output/subroutine.test +++ b/tests/test_expected_output/subroutine.test @@ -331,12 +331,12 @@ from puyapy import subroutine def test() -> None: none = None ## E: None is not supported as a value, only a return type -## case: can_not_reference_global_defined_after +## case: can_reference_global_defined_after from puyapy import UInt64, subroutine @subroutine def before() -> None: - two = UInt64(ONE + ONE) ## E: Unable to resolve global constant reference - note that constants must appear before any references to them + two = UInt64(ONE + ONE) ONE = 1 From f99bccc36090d729305ed8533c597230437b9124 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 27 Feb 2024 13:54:12 +0800 Subject: [PATCH 05/40] awst node fixups --- src/puya/awst/nodes.py | 302 ++++++++++++++------------ src/puya/awst_build/eb/arc4/arrays.py | 2 + 2 files changed, 168 insertions(+), 136 deletions(-) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index 72f57fa182..2e9d2de33f 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -1,24 +1,31 @@ -import decimal +from __future__ import annotations + import enum +import functools +import itertools import typing as t from abc import ABC, abstractmethod -from collections.abc import Iterable, Iterator, Mapping, Sequence +from collections.abc import Iterator, Mapping, Sequence from functools import cached_property import attrs from immutabledict import immutabledict from puya.awst import wtypes -from puya.awst.visitors import ( - ExpressionVisitor, - ModuleStatementVisitor, - StatementVisitor, -) from puya.awst.wtypes import WType from puya.errors import CodeError, InternalError -from puya.models import ARC4MethodConfig -from puya.parse import SourceLocation -from puya.utils import StableSet + +if t.TYPE_CHECKING: + import decimal + + from puya.awst.visitors import ( + ExpressionVisitor, + ModuleStatementVisitor, + StatementVisitor, + ) + from puya.models import ARC4MethodConfig + from puya.parse import SourceLocation + from puya.utils import StableSet T = t.TypeVar("T") @@ -439,7 +446,6 @@ class ArrayExtend(Expression): base: Expression other: Expression - wtype: wtypes.WType = attrs.field(default=wtypes.void_wtype) def accept(self, visitor: ExpressionVisitor[T]) -> T: return visitor.visit_array_extend(self) @@ -484,12 +490,12 @@ def bytes_len(cls, expr: Expression, source_location: SourceLocation) -> t.Self: ) -WTypes: t.TypeAlias = Sequence[wtypes.WType | type[wtypes.WType]] +WTypes: t.TypeAlias = Sequence[WType | type[WType]] -@attrs.define(eq=False) +@attrs.define(eq=False, kw_only=True) class TxnField: - wtype: wtypes.WType + wtype: WType additional_input_wtypes: WTypes = () """Other wtypes that are valid as inputs e.g. UInt64 for an Application field""" python_name: str = "" @@ -506,7 +512,7 @@ def __set_name__(self, owner: object, name: str) -> None: def is_array(self) -> bool: return self.num_values > 1 - def valid_type(self, wtype: wtypes.WType) -> bool: + def valid_type(self, wtype: WType) -> bool: all_types = (self.wtype, *self.additional_input_wtypes) wtype_types = tuple(x for x in all_types if isinstance(x, type)) return wtype in all_types or isinstance(wtype, wtype_types) @@ -515,149 +521,175 @@ def valid_type(self, wtype: wtypes.WType) -> bool: def type_desc(self) -> str: return " | ".join(map(str, (self.wtype, *self.additional_input_wtypes))) + @classmethod + def uint64(cls, *, immediate: str = "", is_inner_param: bool = True) -> TxnField: + return cls( + wtype=wtypes.uint64_wtype, + immediate=immediate, + is_inner_param=is_inner_param, + ) -@attrs.define(eq=False) -class UInt64TxnField(TxnField): - wtype: wtypes.WType = wtypes.uint64_wtype - - -@attrs.define(eq=False) -class BytesTxnField(TxnField): - wtype: wtypes.WType = wtypes.bytes_wtype - - -@attrs.define(eq=False) -class BytesBackedTxnField(TxnField): - wtype: wtypes.WType = wtypes.bytes_wtype - additional_input_wtypes: WTypes = ( - wtypes.biguint_wtype, - wtypes.account_wtype, - wtypes.ARC4Type, - ) - - -@attrs.define(eq=False) -class BoolTxnField(TxnField): - wtype: wtypes.WType = wtypes.bool_wtype - - -@attrs.define(eq=False) -class AccountTxnField(TxnField): - wtype: wtypes.WType = wtypes.account_wtype - additional_input_wtypes: WTypes = (wtypes.bytes_wtype,) + @classmethod + def bytes_( + cls, + *, + immediate: str = "", + is_inner_param: bool = True, + num_values: int = 1, + additional_input_wtypes: WTypes = (), + ) -> TxnField: + return cls( + wtype=wtypes.bytes_wtype, + immediate=immediate, + is_inner_param=is_inner_param, + num_values=num_values, + additional_input_wtypes=additional_input_wtypes, + ) + @classmethod + def bool_(cls, *, immediate: str) -> TxnField: + return cls( + wtype=wtypes.bool_wtype, + immediate=immediate, + ) -@attrs.define(eq=False) -class AssetTxnField(TxnField): - wtype: wtypes.WType = wtypes.asset_wtype - additional_input_wtypes: WTypes = (wtypes.uint64_wtype,) + @classmethod + def account(cls, *, immediate: str = "", num_values: int = 1) -> TxnField: + return cls( + wtype=wtypes.account_wtype, + immediate=immediate, + num_values=num_values, + additional_input_wtypes=(wtypes.bytes_wtype,), + ) + @classmethod + def asset( + cls, *, immediate: str = "", is_inner_param: bool = True, num_values: int = 1 + ) -> TxnField: + return cls( + wtype=wtypes.asset_wtype, + immediate=immediate, + is_inner_param=is_inner_param, + num_values=num_values, + additional_input_wtypes=(wtypes.uint64_wtype,), + ) -@attrs.define(eq=False) -class ApplicationTxnField(TxnField): - wtype: wtypes.WType = wtypes.application_wtype - additional_input_wtypes: WTypes = (wtypes.uint64_wtype,) + @classmethod + def application( + cls, *, immediate: str = "", is_inner_param: bool = True, num_values: int = 1 + ) -> TxnField: + return cls( + wtype=wtypes.application_wtype, + immediate=immediate, + is_inner_param=is_inner_param, + num_values=num_values, + additional_input_wtypes=(wtypes.uint64_wtype,), + ) class TxnFields: - sender = AccountTxnField() - fee = UInt64TxnField() - first_valid = UInt64TxnField(is_inner_param=False) - first_valid_time = UInt64TxnField(is_inner_param=False) - last_valid = UInt64TxnField(is_inner_param=False) - note = BytesTxnField() - lease = BytesTxnField(is_inner_param=False) - receiver = AccountTxnField() - amount = UInt64TxnField() - close_remainder_to = AccountTxnField() - vote_key = AccountTxnField(immediate="VotePK") - selection_key = AccountTxnField(immediate="SelectionPK") - vote_first = UInt64TxnField() - vote_last = UInt64TxnField() - vote_key_dilution = UInt64TxnField() - type_bytes = BytesTxnField(immediate="Type") - type = UInt64TxnField(immediate="TypeEnum") - xfer_asset = AssetTxnField() - asset_amount = UInt64TxnField() - asset_sender = AccountTxnField() - asset_receiver = AccountTxnField() - asset_close_to = AccountTxnField() - group_index = UInt64TxnField(is_inner_param=False) - txn_id = BytesTxnField(immediate="TxID", is_inner_param=False) + sender = TxnField.account() + fee = TxnField.uint64() + first_valid = TxnField.uint64(is_inner_param=False) + first_valid_time = TxnField.uint64(is_inner_param=False) + last_valid = TxnField.uint64(is_inner_param=False) + note = TxnField.bytes_() + lease = TxnField.bytes_(is_inner_param=False) + receiver = TxnField.account() + amount = TxnField.uint64() + close_remainder_to = TxnField.account() + vote_key = TxnField.account(immediate="VotePK") + selection_key = TxnField.account(immediate="SelectionPK") + vote_first = TxnField.uint64() + vote_last = TxnField.uint64() + vote_key_dilution = TxnField.uint64() + type_bytes = TxnField.bytes_(immediate="Type") + type = TxnField.uint64(immediate="TypeEnum") + xfer_asset = TxnField.asset() + asset_amount = TxnField.uint64() + asset_sender = TxnField.account() + asset_receiver = TxnField.account() + asset_close_to = TxnField.account() + group_index = TxnField.uint64(is_inner_param=False) + txn_id = TxnField.bytes_(immediate="TxID", is_inner_param=False) # v2 - app_id = ApplicationTxnField(immediate="ApplicationID") - on_completion = UInt64TxnField() - num_app_args = UInt64TxnField(is_inner_param=False) - num_accounts = UInt64TxnField(is_inner_param=False) - approval_program = BytesTxnField() - clear_state_program = BytesTxnField() - rekey_to = AccountTxnField() - config_asset = AssetTxnField() - total = UInt64TxnField(immediate="ConfigAssetTotal") - decimals = UInt64TxnField(immediate="ConfigAssetDecimals") - default_frozen = BoolTxnField(immediate="ConfigAssetDefaultFrozen") - unit_name = BytesTxnField(immediate="ConfigAssetUnitName") - asset_name = BytesTxnField(immediate="ConfigAssetName") - url = BytesTxnField(immediate="ConfigAssetURL") - metadata_hash = BytesTxnField(immediate="ConfigAssetMetadataHash") - manager = AccountTxnField(immediate="ConfigAssetManager") - reserve = AccountTxnField(immediate="ConfigAssetReserve") - freeze = AccountTxnField(immediate="ConfigAssetFreeze") - clawback = AccountTxnField(immediate="ConfigAssetClawback") - freeze_asset = AssetTxnField() - freeze_account = AccountTxnField(immediate="FreezeAssetAccount") - frozen = AssetTxnField(immediate="FreezeAssetFrozen") + app_id = TxnField.application(immediate="ApplicationID") + on_completion = TxnField.uint64() + num_app_args = TxnField.uint64(is_inner_param=False) + num_accounts = TxnField.uint64(is_inner_param=False) + approval_program = TxnField.bytes_() + clear_state_program = TxnField.bytes_() + rekey_to = TxnField.account() + config_asset = TxnField.asset() + total = TxnField.uint64(immediate="ConfigAssetTotal") + decimals = TxnField.uint64(immediate="ConfigAssetDecimals") + default_frozen = TxnField.bool_(immediate="ConfigAssetDefaultFrozen") + unit_name = TxnField.bytes_(immediate="ConfigAssetUnitName") + asset_name = TxnField.bytes_(immediate="ConfigAssetName") + url = TxnField.bytes_(immediate="ConfigAssetURL") + metadata_hash = TxnField.bytes_(immediate="ConfigAssetMetadataHash") + manager = TxnField.account(immediate="ConfigAssetManager") + reserve = TxnField.account(immediate="ConfigAssetReserve") + freeze = TxnField.account(immediate="ConfigAssetFreeze") + clawback = TxnField.account(immediate="ConfigAssetClawback") + freeze_asset = TxnField.asset() + freeze_account = TxnField.account(immediate="FreezeAssetAccount") + frozen = TxnField.asset(immediate="FreezeAssetFrozen") # v3 - num_assets = UInt64TxnField(is_inner_param=False) - num_apps = UInt64TxnField(immediate="NumApplications", is_inner_param=False) - global_num_uint = UInt64TxnField() - global_num_byte_slice = UInt64TxnField() - local_num_uint = UInt64TxnField() - local_num_byte_slice = UInt64TxnField() + num_assets = TxnField.uint64(is_inner_param=False) + num_apps = TxnField.uint64(immediate="NumApplications", is_inner_param=False) + global_num_uint = TxnField.uint64() + global_num_byte_slice = TxnField.uint64() + local_num_uint = TxnField.uint64() + local_num_byte_slice = TxnField.uint64() # v4 - extra_program_pages = UInt64TxnField() + extra_program_pages = TxnField.uint64() # v5 - non_participation = BoolTxnField(immediate="Nonparticipation") - num_logs = UInt64TxnField(is_inner_param=False) - created_asset = AssetTxnField(immediate="CreatedAssetID", is_inner_param=False) - created_app = ApplicationTxnField(immediate="CreatedApplicationID", is_inner_param=False) + non_participation = TxnField.bool_(immediate="Nonparticipation") + num_logs = TxnField.uint64(is_inner_param=False) + created_asset = TxnField.asset(immediate="CreatedAssetID", is_inner_param=False) + created_app = TxnField.application(immediate="CreatedApplicationID", is_inner_param=False) # v6 - last_log = BytesTxnField(is_inner_param=False) - state_proof_key = BytesTxnField(immediate="StateProofPK") + last_log = TxnField.bytes_(is_inner_param=False) + state_proof_key = TxnField.bytes_(immediate="StateProofPK") # v7 - num_approval_program_pages = UInt64TxnField(is_inner_param=False) - num_clear_state_program_pages = UInt64TxnField(is_inner_param=False) + num_approval_program_pages = TxnField.uint64(is_inner_param=False) + num_clear_state_program_pages = TxnField.uint64(is_inner_param=False) # array fields # TODO: allow configuring as these are consensus values # v2 - app_args = BytesBackedTxnField(immediate="ApplicationArgs", num_values=16) - accounts = AccountTxnField(num_values=4) + app_args = TxnField.bytes_( + immediate="ApplicationArgs", + num_values=16, + additional_input_wtypes=( + wtypes.biguint_wtype, + wtypes.account_wtype, + wtypes.ARC4Type, + ), + ) + accounts = TxnField.account(num_values=4) # v3 - assets = AssetTxnField(num_values=8) - apps = ApplicationTxnField(immediate="Applications", num_values=8) + assets = TxnField.asset(num_values=8) + apps = TxnField.application(immediate="Applications", num_values=8) # v5 - logs = BytesTxnField(num_values=32, is_inner_param=False) + logs = TxnField.bytes_(num_values=32, is_inner_param=False) # v7 - approval_program_pages = BytesTxnField(num_values=4) - clear_state_program_pages = BytesTxnField(num_values=4) - - _all_fields: Iterable[TxnField] | None = None + approval_program_pages = TxnField.bytes_(num_values=4) + clear_state_program_pages = TxnField.bytes_(num_values=4) @classmethod - def all_fields(cls) -> Iterable[TxnField]: - if cls._all_fields is None: - names = dir(cls) - values = [getattr(cls, name) for name in names] - cls._all_fields = tuple(v for v in values if isinstance(v, TxnField)) - return cls._all_fields + @functools.cache + def all_fields(cls) -> Sequence[TxnField]: + values = vars(cls).values() + return tuple(v for v in values if isinstance(v, TxnField)) @classmethod - def inner_transaction_param_fields(cls) -> "Sequence[TxnField]": + def inner_transaction_param_fields(cls) -> Sequence[TxnField]: return tuple(f for f in cls.all_fields() if f.is_inner_param) @classmethod - def inner_transaction_non_array_fields(cls) -> "Sequence[TxnField]": + def inner_transaction_non_array_fields(cls) -> Sequence[TxnField]: return tuple(f for f in cls.all_fields() if not f.is_array) @@ -678,7 +710,7 @@ class UpdateInnerTransaction(Expression): fields: Mapping[TxnField, Expression] = attrs.field( converter=immutabledict[TxnField, Expression] ) - wtype: wtypes.WType = wtypes.void_wtype + wtype: WType = attrs.field(default=wtypes.void_wtype, init=False) def accept(self, visitor: ExpressionVisitor[T]) -> T: return visitor.visit_update_inner_transaction(self) @@ -726,9 +758,7 @@ class TupleExpression(Expression): wtype: wtypes.WTuple @classmethod - def from_items( - cls, items: Sequence[Expression], location: SourceLocation - ) -> "TupleExpression": + def from_items(cls, items: Sequence[Expression], location: SourceLocation) -> TupleExpression: return cls( items=items, wtype=wtypes.WTuple.from_types(i.wtype for i in items), @@ -803,7 +833,7 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T: @attrs.define class SubmitInnerTransaction(Expression): - wtype: wtypes.WType = attrs.field() + wtype: WType = attrs.field() itxns: tuple[Expression, ...] = attrs.field( validator=attrs.validators.deep_iterable( member_validator=expression_has_wtype(wtypes.WInnerTransactionFields) @@ -811,7 +841,7 @@ class SubmitInnerTransaction(Expression): ) @wtype.validator - def _validate_wtype(self, _attribute: object, value: wtypes.WType) -> None: + def _validate_wtype(self, _attribute: object, value: WType) -> None: match value: case wtypes.WTuple(types=types): if any(not isinstance(t, wtypes.WInnerTransaction) for t in types) or len( diff --git a/src/puya/awst_build/eb/arc4/arrays.py b/src/puya/awst_build/eb/arc4/arrays.py index c3e1b14cb4..b40795707f 100644 --- a/src/puya/awst_build/eb/arc4/arrays.py +++ b/src/puya/awst_build/eb/arc4/arrays.py @@ -460,6 +460,7 @@ def call( base=self.expr, other=args_tuple, source_location=location, + wtype=wtypes.void_wtype, ) ) @@ -523,6 +524,7 @@ def call( base=self.expr, other=other, source_location=location, + wtype=wtypes.void_wtype, ) ) From d3504f1c4f4ac1c7d9a80ba1191656d9c7ad7a34 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 27 Feb 2024 15:44:53 +0800 Subject: [PATCH 06/40] wip --- src/puya/arc32.py | 62 ++++++----- src/puya/awst/function_traverser.py | 6 ++ src/puya/awst/nodes.py | 101 ++++++++++++------ src/puya/awst/to_code_visitor.py | 12 ++- src/puya/awst/visitors.py | 16 +++ src/puya/awst_build/contract.py | 49 +++++---- src/puya/awst_build/contract_data.py | 9 +- src/puya/awst_build/eb/app_account_state.py | 109 ++++++++------------ src/puya/awst_build/eb/app_state.py | 82 ++++++--------- src/puya/awst_build/eb/array.py | 1 + src/puya/awst_build/eb/contracts.py | 11 +- src/puya/awst_build/subroutine.py | 6 +- src/puya/ir/arc4_router.py | 22 ++-- src/puya/ir/builder/assignment.py | 17 ++- src/puya/ir/builder/main.py | 57 +++++++++- src/puya/ir/context.py | 92 +++++++++-------- src/puya/ir/main.py | 64 +++++------- src/puya/models.py | 36 +++---- tests/test_execution.py | 16 +-- 19 files changed, 421 insertions(+), 347 deletions(-) diff --git a/src/puya/arc32.py b/src/puya/arc32.py index 72eb0b9a17..ad1bfca0fb 100644 --- a/src/puya/arc32.py +++ b/src/puya/arc32.py @@ -1,7 +1,7 @@ import base64 import json import typing -from collections.abc import Mapping, Sequence +from collections.abc import Collection, Mapping, Sequence from puya.avm_type import AVMType from puya.errors import InternalError @@ -31,7 +31,7 @@ def _encode_source(teal_text: str) -> str: return base64.b64encode(teal_text.encode()).decode("utf-8") -def _encode_state_schema(state: Sequence[ContractState]) -> JSONDict: +def _encode_state_schema(state: Collection[ContractState]) -> JSONDict: return { "num_byte_slices": sum(1 for s in state if s.storage_type is AVMType.bytes), "num_uints": sum(1 for s in state if s.storage_type is AVMType.uint64), @@ -46,7 +46,7 @@ def _encode_schema_declaration(state: ContractState) -> JSONDict: } -def _encode_schema(state: Sequence[ContractState]) -> JSONDict: +def _encode_schema(state: Collection[ContractState]) -> JSONDict: return { "declared": { s.name: _encode_schema_declaration(s) for s in sorted(state, key=lambda s: s.name) @@ -77,20 +77,18 @@ def _get_signature(method: ARC4Method) -> str: def _encode_default_arg(contract: CompiledContract, source: str, loc: SourceLocation) -> JSONDict: - for state in contract.metadata.global_state: - if state.name == source: - return { - "source": "global-state", - # TODO: handle non utf-8 bytes - "data": state.key.decode("utf-8"), - } - for state in contract.metadata.local_state: - if state.name == source: - return { - "source": "local-state", - "data": state.key.decode("utf-8"), - } - for method in contract.metadata.methods: + if state := contract.metadata.global_state.get(source): + return { + "source": "global-state", + # TODO: handle non utf-8 bytes + "data": state.key.decode("utf-8"), + } + if state := contract.metadata.local_state.get(source): + return { + "source": "local-state", + "data": state.key.decode("utf-8"), + } + for method in contract.metadata.arc4_methods: if method.name == source: return { "source": "abi-method", @@ -104,14 +102,14 @@ def _encode_arc32_method_hint(contract: CompiledContract, method: ARC4Method) -> return { # deprecated by ARC-22 "read_only": True if method.config.readonly else None, - "default_arguments": { - default_arg.parameter: _encode_default_arg( - contract, default_arg.source, method.config.source_location - ) - for default_arg in method.config.default_args - } - if method.config.default_args - else None, + "default_arguments": ( + { + parameter: _encode_default_arg(contract, source, method.config.source_location) + for parameter, source in method.config.default_args.items() + } + if method.config.default_args + else None + ), "call_config": _encode_call_config(method.config), "structs": _encode_arc32_method_structs(method), } @@ -124,7 +122,7 @@ def _encode_arc32_method_structs(method: ARC4Method) -> JSONDict | None: "name": struct_def.name, "elements": struct_def.elements, } - for struct_purpose, struct_def in method.config.structs + for struct_purpose, struct_def in method.config.structs.items() } return None @@ -174,8 +172,8 @@ def _filter_none(value: JSONDict) -> JSONValue: def create_arc32_json(contract: CompiledContract) -> str: metadata = contract.metadata - bare_methods = [m for m in metadata.methods if m.config.is_bare] - arc4_methods = [m for m in metadata.methods if not m.config.is_bare] + bare_methods = [m for m in metadata.arc4_methods if m.config.is_bare] + arc4_methods = [m for m in metadata.arc4_methods if not m.config.is_bare] app_spec = { "hints": _encode_arc32_hints(contract, arc4_methods), "source": { @@ -183,12 +181,12 @@ def create_arc32_json(contract: CompiledContract) -> str: "clear": _encode_source("\n".join(contract.clear_program)), }, "state": { - "global": _encode_state_schema(metadata.global_state), - "local": _encode_state_schema(metadata.local_state), + "global": _encode_state_schema(metadata.global_state.values()), + "local": _encode_state_schema(metadata.local_state.values()), }, "schema": { - "global": _encode_schema(metadata.global_state), - "local": _encode_schema(metadata.local_state), + "global": _encode_schema(metadata.global_state.values()), + "local": _encode_schema(metadata.local_state.values()), }, "contract": _encode_arc4_contract(metadata.name, metadata.description, arc4_methods), "bare_call_config": _encode_bare_method_configs(bare_methods), diff --git a/src/puya/awst/function_traverser.py b/src/puya/awst/function_traverser.py index 63703db57b..83045b8443 100644 --- a/src/puya/awst/function_traverser.py +++ b/src/puya/awst/function_traverser.py @@ -252,3 +252,9 @@ def visit_enumeration(self, expr: awst_nodes.Enumeration) -> None: range_.step.accept(self) else: expr.expr.accept(self) + + def visit_state_get_ex(self, expr: awst_nodes.StateGetEx) -> None: + expr.field.accept(self) + + def visit_state_delete(self, statement: awst_nodes.StateDelete) -> None: + statement.field.accept(self) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index 2e9d2de33f..f49d01a470 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -892,28 +892,15 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T: @attrs.frozen class AppStateExpression(Expression): - key: bytes - key_encoding: BytesEncoding + field_name: str def accept(self, visitor: ExpressionVisitor[T]) -> T: return visitor.visit_app_state_expression(self) - @classmethod - def from_state_def( - cls, state_def: "AppStateDefinition", location: SourceLocation - ) -> "AppStateExpression": - return cls( - source_location=location, - wtype=state_def.storage_wtype, - key=state_def.key, - key_encoding=state_def.key_encoding, - ) - @attrs.frozen class AppAccountStateExpression(Expression): - key: bytes - key_encoding: BytesEncoding + field_name: str account: Expression = attrs.field( validator=[expression_has_wtype(wtypes.account_wtype, wtypes.uint64_wtype)] ) @@ -1438,6 +1425,60 @@ def accept(self, visitor: StatementVisitor[T]) -> T: return visitor.visit_for_in_loop(self) +StateExpression: t.TypeAlias = AppStateExpression | AppAccountStateExpression + + +# @attrs.frozen +# class StateGet(Expression): +# field: StateExpression +# default: Expression | None = attrs.field() +# wtype: WType = attrs.field(init=False) +# +# @default.validator +# def _check_default(self, _attribute: object, default: Expression | None) -> None: +# if default is not None and self.field.wtype != default.wtype: +# raise CodeError( +# "Default state value should match storage type", default.source_location +# ) +# +# @wtype.default +# def _wtype_factory(self) -> WType: +# return self.field.wtype +# +# def accept(self, visitor: ExpressionVisitor[T]) -> T: +# return visitor.visit_state_get(self) + + +@attrs.frozen +class StateGetEx(Expression): + field: StateExpression + wtype: wtypes.WTuple = attrs.field(init=False) + + @wtype.default + def _wtype_factory(self) -> wtypes.WTuple: + return wtypes.WTuple.from_types((self.field.wtype, wtypes.bool_wtype)) + + def accept(self, visitor: ExpressionVisitor[T]) -> T: + return visitor.visit_state_get_ex(self) + + +# @attrs.frozen +# class StateExists(Expression): +# field: StateExpression +# wtype: WType = attrs.field(default=wtypes.bool_wtype, init=False) +# +# def accept(self, visitor: ExpressionVisitor[T]) -> T: +# return visitor.visit_state_exists(self) + + +@attrs.frozen +class StateDelete(Statement): + field: StateExpression + + def accept(self, visitor: StatementVisitor[T]) -> T: + return visitor.visit_state_delete(self) + + @attrs.frozen class NewStruct(Expression): args: tuple[CallArg, ...] = attrs.field() @@ -1530,32 +1571,32 @@ class ContractFragment(ModuleStatement): module_name: str name_override: str | None is_abstract: bool - is_arc4: bool bases: Sequence[ContractReference] = attrs.field(converter=tuple[ContractReference, ...]) init: ContractMethod | None = attrs.field() approval_program: ContractMethod | None = attrs.field() clear_program: ContractMethod | None = attrs.field() subroutines: Sequence[ContractMethod] = attrs.field(converter=tuple[ContractMethod, ...]) - app_state: Sequence[AppStateDefinition] = attrs.field(converter=tuple[AppStateDefinition, ...]) - reserved_scratch_space: StableSet[int] = attrs.field() + app_state: Mapping[str, AppStateDefinition] + reserved_scratch_space: StableSet[int] docstring: str | None # note: important that symtable comes last so default factory has access to all other fields symtable: Mapping[str, ContractMethod | AppStateDefinition] = attrs.field(init=False) @symtable.default def _symtable_factory(self) -> Mapping[str, ContractMethod | AppStateDefinition]: - all_subs = [ - self.init, - self.approval_program, - self.clear_program, - *self.subroutines, - ] - subs_by_name = {sub.name: sub for sub in all_subs if sub is not None} - state_by_name = {state.member_name: state for state in self.app_state} - return { - **subs_by_name, - **state_by_name, - } + result: dict[str, ContractMethod | AppStateDefinition] = {**self.app_state} + all_subs = itertools.chain( + filter(None, (self.init, self.approval_program, self.clear_program)), + self.subroutines, + ) + for sub in all_subs: + if sub.name in result: + raise CodeError( + f"Duplicate symbol {sub.name} in contract {self.full_name}", + sub.source_location, + ) + result[sub.name] = sub + return result @init.validator def check_init(self, _attribute: object, init: ContractMethod | None) -> None: diff --git a/src/puya/awst/to_code_visitor.py b/src/puya/awst/to_code_visitor.py index ddff73f7e6..4871330e89 100644 --- a/src/puya/awst/to_code_visitor.py +++ b/src/puya/awst/to_code_visitor.py @@ -76,10 +76,10 @@ def visit_temporary_variable(self, expr: nodes.TemporaryVariable) -> str: return f"tmp${self._tmp_index(expr)}" def visit_app_state_expression(self, expr: nodes.AppStateExpression) -> str: - return f"this.globals[{bytes_str(expr.key)}]" + return f"this.globals[{expr.field_name}]" def visit_app_account_state_expression(self, expr: nodes.AppAccountStateExpression) -> str: - return f"this.locals[{bytes_str(expr.key)}].account[{expr.account.accept(self)}]" + return f"this.locals[{expr.field_name}].account[{expr.account.accept(self)}]" def visit_new_array(self, expr: nodes.NewArray) -> str: args = ", ".join(a.accept(self) for a in expr.elements) @@ -174,7 +174,7 @@ def visit_contract_fragment(self, c: nodes.ContractFragment) -> list[str]: body = list[str]() if c.app_state: state_by_kind = dict[AppStateKind, list[nodes.AppStateDefinition]]() - for state in c.app_state: + for state in c.app_state.values(): state_by_kind.setdefault(state.kind, []).append(state) global_state = state_by_kind.pop(AppStateKind.app_global, []) if global_state: @@ -524,6 +524,12 @@ def visit_structure_definition(self, statement: nodes.StructureDefinition) -> li "}", ] + def visit_state_get_ex(self, expr: nodes.StateGetEx) -> str: + return f"STATE_GET_EX({expr.field.accept(self)})" + + def visit_state_delete(self, statement: nodes.StateDelete) -> list[str]: + return [f"STATE_DELETE({statement.field.accept(self)})"] + def _indent(lines: t.Iterable[str], indent_size: str = " ") -> t.Iterator[str]: yield from (f"{indent_size}{line}" for line in lines) diff --git a/src/puya/awst/visitors.py b/src/puya/awst/visitors.py index 80cb93475e..02f566cdc2 100644 --- a/src/puya/awst/visitors.py +++ b/src/puya/awst/visitors.py @@ -72,6 +72,10 @@ def visit_for_in_loop(self, statement: puya.awst.nodes.ForInLoop) -> T: def visit_assignment_statement(self, statement: puya.awst.nodes.AssignmentStatement) -> T: ... + @abstractmethod + def visit_state_delete(self, statement: puya.awst.nodes.StateDelete) -> T: + ... + class ModuleStatementVisitor(t.Generic[T], ABC): @abstractmethod @@ -291,3 +295,15 @@ def visit_copy(self, expr: puya.awst.nodes.Copy) -> T: @abstractmethod def visit_reversed(self, expr: puya.awst.nodes.Reversed) -> T: ... + + # @abstractmethod + # def visit_state_get(self, expr: puya.awst.nodes.StateGet) -> T: + # ... + + @abstractmethod + def visit_state_get_ex(self, expr: puya.awst.nodes.StateGetEx) -> T: + ... + + # @abstractmethod + # def visit_state_exists(self, expr: puya.awst.nodes.StateExists) -> T: + # ... diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index dcf471ca62..03492c52fc 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -5,6 +5,7 @@ import mypy.nodes import mypy.types import mypy.visitor +from immutabledict import immutabledict import puya.models from puya.arc4_util import wtype_to_arc4 @@ -12,7 +13,6 @@ from puya.awst.nodes import ( AppStateDefinition, AppStateKind, - BytesEncoding, ContractFragment, ContractMethod, ContractReference, @@ -34,7 +34,7 @@ qualified_class_name, ) from puya.errors import CodeError, InternalError -from puya.models import ARC4DefaultArgument, ARC4MethodConfig, ARC32StructDef, OnCompletionAction +from puya.models import ARC4MethodConfig, ARC32StructDef, OnCompletionAction from puya.parse import SourceLocation ALLOWABLE_OCA = [oca.name for oca in OnCompletionAction if oca != OnCompletionAction.ClearState] @@ -58,10 +58,10 @@ def __init__( self._init_method: ContractMethod | None = None self._subroutines = list[ContractMethod]() this_app_state = list(_gather_app_state(context, class_def.info)) - combined_app_state = {defn.state_def.member_name: defn for defn in this_app_state} + combined_app_state = {defn.member_name: defn for defn in this_app_state} for base in iterate_user_bases(class_def.info): base_app_state = { - defn.state_def.member_name: defn + defn.member_name: defn # NOTE: we don't report errors for the decls themselves here, # they should already have been reported when analysing the base type for defn in _gather_app_state(context, base, report_errors=False) @@ -71,15 +71,16 @@ def __init__( member_orig = base_app_state[redefined_member] self.context.note( f"Previous definition of {redefined_member} was here", - member_orig.state_def.source_location, + member_orig.source_location, ) self.context.error( f"Redefinition of {redefined_member}", - member_redef.state_def.source_location, + member_redef.source_location, ) # we do it this way around so that we keep combined_app_state with the most-derived # definition in case of redefinitions combined_app_state = base_app_state | combined_app_state + self._collected_app_state_definitions = dict[str, AppStateDefinition]() self.app_state: dict[str, AppStateDeclaration] = combined_app_state # note: we iterate directly and catch+log code errors here, @@ -96,12 +97,11 @@ def __init__( name_override=class_options.name_override, is_abstract=self._is_abstract, bases=_gather_bases(context, class_def), - is_arc4=self._is_arc4, init=self._init_method, approval_program=self._approval_program, clear_program=self._clear_program, subroutines=self._subroutines, - app_state=[decl.state_def for decl in this_app_state], + app_state=self._collected_app_state_definitions, docstring=docstring, source_location=self._location(class_def), reserved_scratch_space=class_options.scratch_slot_reservations, @@ -432,16 +432,13 @@ def _gather_app_state( var_loc, ) else: - state_def = AppStateDefinition( - source_location=var_loc, + yield AppStateDeclaration( member_name=name, - storage_wtype=storage_wtype, - key=name.encode(), # TODO: encode name -> key with source file encoding? - key_encoding=BytesEncoding.utf8, kind=kind, - description=None, # TODO! + storage_wtype=storage_wtype, + decl_type=decl_type, + source_location=var_loc, ) - yield AppStateDeclaration(state_def, decl_type) def get_func_types( @@ -506,7 +503,7 @@ def _get_arc4_method_config( ) create = abi_hints.get("create", False) readonly = abi_hints.get("readonly", False) - default_args = abi_hints.get("default_args", {}) + default_args = immutabledict[str, str](abi_hints.get("default_args", {})) all_args = [ a.variable.name for a in (func_def.arguments or []) if not a.variable.is_self ] @@ -518,13 +515,15 @@ def _get_arc4_method_config( # TODO: validate source here as well? # Deferring it allows for more flexibility in contract composition - structs = [ - (n, _wtype_to_struct_def(t)) - for n, t in get_func_types( - context, func_def, context.node_location(func_def) - ).items() - if isinstance(t, wtypes.ARC4Struct) - ] + structs = immutabledict[str, ARC32StructDef]( + { + n: _wtype_to_struct_def(t) + for n, t in get_func_types( + context, func_def, context.node_location(func_def) + ).items() + if isinstance(t, wtypes.ARC4Struct) + } + ) return ARC4MethodConfig( source_location=dec_loc, @@ -536,9 +535,7 @@ def _get_arc4_method_config( require_create=create is True, readonly=readonly, is_bare=fullname == constants.BAREMETHOD_DECORATOR, - default_args=[ - ARC4DefaultArgument(parameter=p, source=s) for p, s in default_args.items() - ], + default_args=default_args, structs=structs, ) case _: diff --git a/src/puya/awst_build/contract_data.py b/src/puya/awst_build/contract_data.py index 3721ff4121..62653ff221 100644 --- a/src/puya/awst_build/contract_data.py +++ b/src/puya/awst_build/contract_data.py @@ -2,7 +2,9 @@ import attrs -from puya.awst.nodes import AppStateDefinition +from puya.awst.nodes import AppStateKind +from puya.awst.wtypes import WType +from puya.parse import SourceLocation from puya.utils import StableSet @@ -15,8 +17,11 @@ class AppStateDeclType(enum.Enum): @attrs.frozen class AppStateDeclaration: - state_def: AppStateDefinition + member_name: str + kind: AppStateKind + storage_wtype: WType decl_type: AppStateDeclType + source_location: SourceLocation @attrs.define diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index 4cfa146cb9..fcee138397 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -6,19 +6,18 @@ from puya.awst import wtypes from puya.awst.nodes import ( AppAccountStateExpression, - AppStateDefinition, AppStateKind, - BytesConstant, ConditionalExpression, Expression, - ExpressionStatement, IntegerConstant, - IntrinsicCall, Literal, + StateDelete, + StateGetEx, Statement, TupleItemExpression, UInt64Constant, ) +from puya.awst_build.contract_data import AppStateDeclaration from puya.awst_build.eb.base import ( ExpressionBuilder, IntermediateExpressionBuilder, @@ -31,42 +30,53 @@ from puya.parse import SourceLocation +def _build_field( + state_decl: AppStateDeclaration, index: ExpressionBuilder | Literal, location: SourceLocation +) -> AppAccountStateExpression: + index_expr = _validated_index_expr(index) + return AppAccountStateExpression( + field_name=state_decl.member_name, + account=index_expr, + wtype=state_decl.storage_wtype, + source_location=location, + ) + + class AppAccountStateExpressionBuilder(IntermediateExpressionBuilder): - def __init__(self, state_def: AppStateDefinition, location: SourceLocation): - assert state_def.kind is AppStateKind.account_local + def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation): + assert state_decl.kind is AppStateKind.account_local super().__init__(location) - self.state_def = state_def + self.state_decl = state_decl def index( self, index: ExpressionBuilder | Literal, location: SourceLocation ) -> ExpressionBuilder: - index_expr = _validated_index_expr(index) - return AppAccountStateForAccountExpressionBuilder( - state_def=self.state_def, - index_expr=index_expr, - location=location, - ) + expr = _build_field(self.state_decl, index, location) + return AppAccountStateForAccountExpressionBuilder(expr) def contains( self, item: ExpressionBuilder | Literal, location: SourceLocation ) -> ExpressionBuilder: - app_local_get_ex = _build_app_local_get_ex(self.state_def, item, location) + app_local_get_ex = StateGetEx( + field=_build_field(self.state_decl, item, location), + source_location=location, + ) exists_expr = TupleItemExpression(app_local_get_ex, index=1, source_location=location) return var_expression(exists_expr) def member_access(self, name: str, location: SourceLocation) -> ExpressionBuilder | Literal: match name: case "get": - return AppAccountStateGetMethodBuilder(self.state_def, location) + return AppAccountStateGetMethodBuilder(self.state_decl, location) case "maybe": - return AppAccountStateMaybeMethodBuilder(self.state_def, location) + return AppAccountStateMaybeMethodBuilder(self.state_decl, location) return super().member_access(name, location) class AppAccountStateGetMethodBuilder(IntermediateExpressionBuilder): - def __init__(self, state_def: AppStateDefinition, location: SourceLocation): + def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation): super().__init__(location) - self.state_def = state_def + self.state_decl = state_decl def call( self, @@ -82,13 +92,15 @@ def call( default_arg, item = args else: item, default_arg = args - default_expr = expect_operand_wtype(default_arg, target_wtype=self.state_def.storage_wtype) + default_expr = expect_operand_wtype( + default_arg, target_wtype=self.state_decl.storage_wtype + ) app_local_get_ex = create_temporary_assignment( - _build_app_local_get_ex(self.state_def, item, location), location + _build_app_local_get_ex(self.state_decl, item, location), location ) conditional_expr = ConditionalExpression( location, - wtype=self.state_def.storage_wtype, + wtype=self.state_decl.storage_wtype, condition=TupleItemExpression( app_local_get_ex.define, index=1, source_location=location ), @@ -101,9 +113,9 @@ def call( class AppAccountStateMaybeMethodBuilder(IntermediateExpressionBuilder): - def __init__(self, state_def: AppStateDefinition, location: SourceLocation): + def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation): super().__init__(location) - self.state_def = state_def + self.state_decl = state_decl def call( self, @@ -115,29 +127,17 @@ def call( ) -> ExpressionBuilder: match args: case [item]: - app_local_get_ex = _build_app_local_get_ex(self.state_def, item, location) + app_local_get_ex = _build_app_local_get_ex(self.state_decl, item, location) return var_expression(app_local_get_ex) case _: raise CodeError("Invalid/unhandled arguments", location) def _build_app_local_get_ex( - state_def: AppStateDefinition, item: ExpressionBuilder | Literal, location: SourceLocation -) -> IntrinsicCall: - index_expr = _validated_index_expr(item) - app_local_get_ex = IntrinsicCall( - source_location=location, - op_code="app_local_get_ex", - stack_args=[ - index_expr, - UInt64Constant(value=0, source_location=location), - BytesConstant( - value=state_def.key, encoding=state_def.key_encoding, source_location=location - ), - ], - wtype=wtypes.WTuple.from_types((state_def.storage_wtype, wtypes.bool_wtype)), - ) - return app_local_get_ex + state_decl: AppStateDeclaration, item: ExpressionBuilder | Literal, location: SourceLocation +) -> StateGetEx: + field = _build_field(state_decl, item, location) + return StateGetEx(field=field, source_location=location) def _validated_index_expr(index: ExpressionBuilder | Literal) -> Expression: @@ -177,34 +177,13 @@ def valid_account_offset(value: int, loc: SourceLocation) -> None: class AppAccountStateForAccountExpressionBuilder(ValueProxyExpressionBuilder): - def __init__( - self, index_expr: Expression, state_def: AppStateDefinition, location: SourceLocation - ): - assert state_def.kind is AppStateKind.account_local - self.wtype = state_def.storage_wtype - expr = AppAccountStateExpression( - source_location=location, - key=state_def.key, - key_encoding=state_def.key_encoding, - wtype=state_def.storage_wtype, - account=index_expr, - ) - self.index_expr = index_expr - self.state_def = state_def + def __init__(self, expr: AppAccountStateExpression): + self.__field = expr + self.wtype = expr.wtype super().__init__(expr) def delete(self, location: SourceLocation) -> Statement: - return ExpressionStatement( - IntrinsicCall( - source_location=location, - op_code="app_local_del", - stack_args=[ - self.index_expr, - BytesConstant(value=self.state_def.key, source_location=self.source_location), - ], - wtype=wtypes.void_wtype, - ) - ) + return StateDelete(field=self.__field, source_location=location) class AppAccountStateClassExpressionBuilder(IntermediateExpressionBuilder): diff --git a/src/puya/awst_build/eb/app_state.py b/src/puya/awst_build/eb/app_state.py index bae3d5e138..064eb31cc2 100644 --- a/src/puya/awst_build/eb/app_state.py +++ b/src/puya/awst_build/eb/app_state.py @@ -3,23 +3,21 @@ import mypy.nodes import mypy.types -from puya.awst import wtypes +from puya.awst import wtypes # noqa: TCH001 from puya.awst.nodes import ( - AppStateDefinition, AppStateExpression, AppStateKind, - BytesConstant, ConditionalExpression, Expression, - ExpressionStatement, - IntrinsicCall, Literal, Not, + StateDelete, + StateGetEx, Statement, TupleItemExpression, - UInt64Constant, ) from puya.awst_build import constants +from puya.awst_build.contract_data import AppStateDeclaration from puya.awst_build.eb.base import ( ExpressionBuilder, IntermediateExpressionBuilder, @@ -32,6 +30,12 @@ from puya.parse import SourceLocation +def _build_field(state_decl: AppStateDeclaration, location: SourceLocation) -> AppStateExpression: + return AppStateExpression( + field_name=state_decl.member_name, wtype=state_decl.storage_wtype, source_location=location + ) + + class AppStateClassExpressionBuilder(IntermediateExpressionBuilder): def __init__(self, location: SourceLocation): super().__init__(location) @@ -89,14 +93,14 @@ def call( class AppStateExpressionBuilder(IntermediateExpressionBuilder): - def __init__(self, state_def: AppStateDefinition, location: SourceLocation) -> None: - self.state_def = state_def + def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation) -> None: + self.state_decl = state_decl super().__init__(location) def bool_eval(self, location: SourceLocation, *, negate: bool = False) -> ExpressionBuilder: exists_expr = TupleItemExpression( source_location=location, - base=_build_app_global_get_ex(self.state_def, location), + base=_build_app_global_get_ex(self.state_decl, location), index=1, ) if negate: @@ -109,25 +113,25 @@ def member_access(self, name: str, location: SourceLocation) -> ExpressionBuilde match name: case "value": return AppStateValueExpressionBuilder( - state_def=self.state_def, + state_decl=self.state_decl, location=self.source_location, ) case "get": return AppStateGetExpressionBuilder( - state_def=self.state_def, location=self.source_location + state_decl=self.state_decl, location=self.source_location ) case "maybe": return AppStateMaybeExpressionBuilder( - state_def=self.state_def, location=self.source_location + state_decl=self.state_decl, location=self.source_location ) case _: return super().member_access(name, location) class AppStateMethodBaseExpressionBuilder(IntermediateExpressionBuilder): - def __init__(self, state_def: AppStateDefinition, location: SourceLocation) -> None: + def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation) -> None: super().__init__(location) - self.state_def = state_def + self.state_decl = state_decl class AppStateMaybeExpressionBuilder(AppStateMethodBaseExpressionBuilder): @@ -141,7 +145,7 @@ def call( ) -> ExpressionBuilder: match args: case []: - return var_expression(_build_app_global_get_ex(self.state_def, location)) + return var_expression(_build_app_global_get_ex(self.state_decl, location)) case _: raise CodeError("Unexpected/unhandled arguments", location) @@ -158,13 +162,15 @@ def call( if len(args) != 1: raise CodeError(f"Expected 1 argument, got {len(args)}", location) (default_arg,) = args - default_expr = expect_operand_wtype(default_arg, target_wtype=self.state_def.storage_wtype) + default_expr = expect_operand_wtype( + default_arg, target_wtype=self.state_decl.storage_wtype + ) app_global_get_ex = create_temporary_assignment( - _build_app_global_get_ex(self.state_def, location), location + _build_app_global_get_ex(self.state_decl, location), location ) conditional_expr = ConditionalExpression( location, - wtype=self.state_def.storage_wtype, + wtype=self.state_decl.storage_wtype, condition=TupleItemExpression( app_global_get_ex.define, index=1, source_location=location ), @@ -176,40 +182,18 @@ def call( return var_expression(conditional_expr) -def _key_constant(state_def: AppStateDefinition, location: SourceLocation) -> BytesConstant: - return BytesConstant( - value=state_def.key, encoding=state_def.key_encoding, source_location=location - ) - - def _build_app_global_get_ex( - state_def: AppStateDefinition, location: SourceLocation -) -> IntrinsicCall: - return IntrinsicCall( - op_code="app_global_get_ex", - stack_args=[ - UInt64Constant(value=0, source_location=location), - _key_constant(state_def, location), - ], - wtype=wtypes.WTuple.from_types((state_def.storage_wtype, wtypes.bool_wtype)), - source_location=location, - ) + state_decl: AppStateDeclaration, location: SourceLocation +) -> StateGetEx: + return StateGetEx(field=_build_field(state_decl, location), source_location=location) class AppStateValueExpressionBuilder(ValueProxyExpressionBuilder): - def __init__(self, state_def: AppStateDefinition, location: SourceLocation): - assert state_def.kind is AppStateKind.app_global - self.wtype = state_def.storage_wtype - expr = AppStateExpression.from_state_def(state_def, location) - self.state_def = state_def - super().__init__(expr) + def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation): + assert state_decl.kind is AppStateKind.app_global + self.__field = _build_field(state_decl, location) + self.wtype = state_decl.storage_wtype + super().__init__(self.__field) def delete(self, location: SourceLocation) -> Statement: - return ExpressionStatement( - IntrinsicCall( - op_code="app_global_del", - stack_args=[_key_constant(self.state_def, self.source_location)], - wtype=wtypes.void_wtype, - source_location=location, - ), - ) + return StateDelete(field=self.__field, source_location=location) diff --git a/src/puya/awst_build/eb/array.py b/src/puya/awst_build/eb/array.py index b56b52b4ca..4bccb0bf49 100644 --- a/src/puya/awst_build/eb/array.py +++ b/src/puya/awst_build/eb/array.py @@ -120,5 +120,6 @@ def call( location, base=self.array, other=TupleExpression.from_items([elem_expr], location), + wtype=wtypes.void_wtype, ) return var_expression(append_expr) diff --git a/src/puya/awst_build/eb/contracts.py b/src/puya/awst_build/eb/contracts.py index f0a354b96f..66efdd8fff 100644 --- a/src/puya/awst_build/eb/contracts.py +++ b/src/puya/awst_build/eb/contracts.py @@ -35,13 +35,16 @@ def member_access(self, name: str, location: SourceLocation) -> ExpressionBuilde target=InstanceSubroutineTarget(name=name), location=location, ) - state_def = state_decl.state_def match state_decl.decl_type: case AppStateDeclType.local_proxy: - return AppAccountStateExpressionBuilder(state_def, location) + return AppAccountStateExpressionBuilder(state_decl, location) case AppStateDeclType.global_proxy: - return AppStateExpressionBuilder(state_def, location) + return AppStateExpressionBuilder(state_decl, location) case AppStateDeclType.global_direct: return var_expression( - AppStateExpression.from_state_def(location=location, state_def=state_def) + AppStateExpression( + field_name=state_decl.member_name, + wtype=state_decl.storage_wtype, + source_location=location, + ) ) diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index 1cb1a89c5b..eecfbb743c 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -350,8 +350,10 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> Sequence[Sta f" expected a {constants.CLS_GLOBAL_STATE_ALIAS}", app_state_eb.source_location, ) - global_state_target = AppStateExpression.from_state_def( - app_state_eb.state_def, app_state_eb.source_location + global_state_target = AppStateExpression( + field_name=app_state_eb.state_decl.member_name, + wtype=app_state_eb.state_decl.storage_wtype, + source_location=app_state_eb.source_location, ) return [ AssignmentStatement( diff --git a/src/puya/ir/arc4_router.py b/src/puya/ir/arc4_router.py index 1352fdd952..240a8d27c1 100644 --- a/src/puya/ir/arc4_router.py +++ b/src/puya/ir/arc4_router.py @@ -689,9 +689,9 @@ def _validate_default_args( for method in arc4_methods: assert method.abimethod_config args_by_name = {a.name: a for a in method.args} - for default_arg in method.abimethod_config.default_args: + for parameter_name, source_name in method.abimethod_config.default_args.items(): # any invalid parameter matches should have been caught earlier - parameter = args_by_name[default_arg.parameter] + parameter = args_by_name[parameter_name] param_arc4_type = wtype_to_arc4(parameter.wtype) # special handling for reference types match param_arc4_type: @@ -701,10 +701,10 @@ def _validate_default_args( param_arc4_type = "address" try: - source = known_sources[default_arg.source] + source = known_sources[source_name] except KeyError as ex: raise CodeError( - f"'{default_arg.source}' is not a known state or method attribute", + f"'{source_name}' is not a known state or method attribute", method.source_location, ) from ex @@ -716,32 +716,32 @@ def _validate_default_args( ): if OnCompletionAction.NoOp not in abimethod_config.allowed_completion_types: raise CodeError( - f"'{default_arg.source}' does not allow no_op on completion calls", + f"'{source_name}' does not allow no_op on completion calls", method.source_location, ) if abimethod_config.require_create: raise CodeError( - f"'{default_arg.source}' can only be used for create calls", + f"'{source_name}' can only be used for create calls", method.source_location, ) if not abimethod_config.readonly: raise CodeError( - f"'{default_arg.source}' is not readonly", + f"'{source_name}' is not readonly", method.source_location, ) if args: raise CodeError( - f"'{default_arg.source}' does not take zero arguments", + f"'{source_name}' does not take zero arguments", method.source_location, ) if return_type is wtypes.void_wtype: raise CodeError( - f"'{default_arg.source}' does not provide a value", + f"'{source_name}' does not provide a value", method.source_location, ) if wtype_to_arc4(return_type) != param_arc4_type: raise CodeError( - f"'{default_arg.source}' does not provide '{param_arc4_type}' type", + f"'{source_name}' does not provide '{param_arc4_type}' type", method.source_location, ) case ContractState(storage_type=storage_type): @@ -761,7 +761,7 @@ def _validate_default_args( pass else: raise CodeError( - f"'{default_arg.source}' cannot provide '{param_arc4_type}' type", + f"'{source_name}' cannot provide '{param_arc4_type}' type", method.source_location, ) case _: diff --git a/src/puya/ir/builder/assignment.py b/src/puya/ir/builder/assignment.py index a9edc47307..64ca8ed427 100644 --- a/src/puya/ir/builder/assignment.py +++ b/src/puya/ir/builder/assignment.py @@ -77,22 +77,21 @@ def handle_assignment( assignment_location=assignment_location, ) ] - case awst_nodes.AppStateExpression( - key=app_state_key, source_location=key_loc, key_encoding=key_encoding - ): + case awst_nodes.AppStateExpression(field_name=field_name, source_location=key_loc): source = context.visitor.materialise_value_provider( value, description="new_state_value" ) if len(source) != 1: raise CodeError("Tuple state is not supported", assignment_location) + state_def = context.resolve_state(field_name, key_loc) context.block_builder.add( Intrinsic( op=AVMOp.app_global_put, args=[ BytesConstant( - value=app_state_key, + value=state_def.key, source_location=key_loc, - encoding=bytes_enc_to_avm_bytes_enc(key_encoding), + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), ), source[0], ], @@ -101,10 +100,9 @@ def handle_assignment( ) return source case awst_nodes.AppAccountStateExpression( - key=app_acct_state_key, + field_name=field_name, account=account_expr, source_location=key_loc, - key_encoding=key_encoding, ): source = context.visitor.materialise_value_provider( value, description="new_state_value" @@ -112,15 +110,16 @@ def handle_assignment( account = context.visitor.visit_and_materialise_single(account_expr) if len(source) != 1: raise CodeError("Tuple state is not supported", assignment_location) + state_def = context.resolve_state(field_name, key_loc) context.block_builder.add( Intrinsic( op=AVMOp.app_local_put, args=[ account, BytesConstant( - value=app_acct_state_key, + value=state_def.key, source_location=key_loc, - encoding=bytes_enc_to_avm_bytes_enc(key_encoding), + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), ), source[0], ], diff --git a/src/puya/ir/builder/main.py b/src/puya/ir/builder/main.py index dcddf2869b..d02836c639 100644 --- a/src/puya/ir/builder/main.py +++ b/src/puya/ir/builder/main.py @@ -489,13 +489,14 @@ def visit_temporary_variable(self, expr: awst_nodes.TemporaryVariable) -> TExpre return ValueTuple(expr.source_location, registers) def visit_app_state_expression(self, expr: awst_nodes.AppStateExpression) -> TExpression: + state_def = self.context.resolve_state(expr.field_name, expr.source_location) # TODO: add specific (unsafe) optimisation flag to allow skipping this check current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) # TODO: keep encoding? modify AWST to add source location for key? key = BytesConstant( - value=expr.key, + value=state_def.key, source_location=expr.source_location, - encoding=bytes_enc_to_avm_bytes_enc(expr.key_encoding), + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), ) # note: we manually construct temporary targets here since atype is any, @@ -537,15 +538,16 @@ def visit_app_state_expression(self, expr: awst_nodes.AppStateExpression) -> TEx def visit_app_account_state_expression( self, expr: awst_nodes.AppAccountStateExpression ) -> TExpression: + state_def = self.context.resolve_state(expr.field_name, expr.source_location) account = self.visit_and_materialise_single(expr.account) # TODO: add specific (unsafe) optimisation flag to allow skipping this check current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) # TODO: keep encoding? modify AWST to add source location for key? key = BytesConstant( - value=expr.key, + value=state_def.key, source_location=expr.source_location, - encoding=bytes_enc_to_avm_bytes_enc(expr.key_encoding), + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), ) # note: we manually construct temporary targets here since atype is any, @@ -582,6 +584,53 @@ def visit_app_account_state_expression( ) return value_tmp + def visit_state_get_ex(self, expr: awst_nodes.StateGetEx) -> TExpression: + subject = expr.field + state_def = self.context.resolve_state(subject.field_name, subject.source_location) + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + # TODO: keep encoding? modify AWST to add source location for key? + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [current_app_offset, key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_get_ex + else: + op = AVMOp.app_local_get_ex + account = self.visit_and_materialise_single(subject.account) + args.insert(0, account) + return Intrinsic( + op=op, + args=args, + source_location=expr.source_location, + ) + + def visit_state_delete(self, statement: awst_nodes.StateDelete) -> TStatement: + subject = statement.field + state_def = self.context.resolve_state(subject.field_name, subject.source_location) + # TODO: keep encoding? modify AWST to add source location for key? + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_del + else: + op = AVMOp.app_local_del + account = self.visit_and_materialise_single(subject.account) + args.insert(0, account) + self.context.block_builder.add( + Intrinsic( + op=op, + args=args, + source_location=statement.source_location, + ) + ) + def visit_new_array(self, expr: awst_nodes.NewArray) -> TExpression: raise TodoError(expr.source_location, "TODO: visit_new_array") diff --git a/src/puya/ir/context.py b/src/puya/ir/context.py index a8a52d0ee7..c4ff35ab60 100644 --- a/src/puya/ir/context.py +++ b/src/puya/ir/context.py @@ -27,6 +27,29 @@ class IRBuildContext(CompileContext): embedded_funcs: Sequence[awst_nodes.Function] = attrs.field() contract: awst_nodes.ContractFragment | None = None + def for_contract(self, contract: awst_nodes.ContractFragment) -> "IRBuildContextWithFallback": + return attrs_extend( + IRBuildContextWithFallback, + self, + default_fallback=contract.source_location, + contract=contract, + # copy subroutines so that contract specific subroutines do not pollute other contract + # passes + subroutines=self.subroutines.copy(), + ) + + def for_function( + self, function: awst_nodes.Function, subroutine: Subroutine, visitor: "FunctionIRBuilder" + ) -> "IRFunctionBuildContext": + return attrs_extend( + IRFunctionBuildContext, + self, + default_fallback=function.source_location, + visitor=visitor, + function=function, + subroutine=subroutine, + ) + def resolve_contract_reference( self, cref: awst_nodes.ContractReference ) -> awst_nodes.ContractFragment: @@ -49,28 +72,7 @@ def resolve_function_reference( contract = self.resolve_contract_reference(cref) func: awst_nodes.Node = contract.symtable[func_name] case awst_nodes.InstanceSubroutineTarget(name=func_name): - if self.contract is None: - raise InternalError( - f"Cannot resolve instance function {func_name} " - f"as there is no current contract", - source_location, - ) - for contract in ( - self.contract, - *[self.resolve_contract_reference(cref) for cref in self.contract.bases], - ): - try: - func = contract.symtable[func_name] - except KeyError: - pass - else: - break - else: - raise InternalError( - f"Unable to locate {func_name} in hierarchy " - f"for class {self.contract.full_name}", - source_location, - ) + func = self._resolve_contract_attribute(func_name, source_location) case awst_nodes.FreeSubroutineTarget(module_name=module_name, name=func_name): # remap the internal _puyapy_ lib to puyapy so that functions # defined in _puyapy_ can reference other functions defined in the same module @@ -93,27 +95,31 @@ def resolve_function_reference( ) return func - def for_contract(self, contract: awst_nodes.ContractFragment) -> "IRBuildContextWithFallback": - return attrs_extend( - IRBuildContextWithFallback, - self, - default_fallback=contract.source_location, - contract=contract, - # copy subroutines so that contract specific subroutines do not pollute other contract - # passes - subroutines=self.subroutines.copy(), - ) - - def for_function( - self, function: awst_nodes.Function, subroutine: Subroutine, visitor: "FunctionIRBuilder" - ) -> "IRFunctionBuildContext": - return attrs_extend( - IRFunctionBuildContext, - self, - default_fallback=function.source_location, - visitor=visitor, - function=function, - subroutine=subroutine, + def resolve_state( + self, field_name: str, source_location: SourceLocation + ) -> awst_nodes.AppStateDefinition: + node = self._resolve_contract_attribute(field_name, source_location) + if not isinstance(node, awst_nodes.AppStateDefinition): + raise CodeError(f"State reference {field_name} resolved to {node}", source_location) + return node + + def _resolve_contract_attribute( + self, name: str, source_location: SourceLocation + ) -> awst_nodes.ContractMethod | awst_nodes.AppStateDefinition: + if self.contract is None: + raise InternalError( + f"Cannot resolve contract member {name} as there is no current contract", + source_location, + ) + for contract in ( + self.contract, + *[self.resolve_contract_reference(cref) for cref in self.contract.bases], + ): + with contextlib.suppress(KeyError): + return contract.symtable[name] + raise CodeError( + f"Unresolvable attribute '{name}' of {self.contract.full_name}", + source_location, ) diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py index 545ceb61bb..b3ea206522 100644 --- a/src/puya/ir/main.py +++ b/src/puya/ir/main.py @@ -5,8 +5,8 @@ import attrs import structlog +from immutabledict import immutabledict -from puya.arc4_util import get_abi_signature from puya.avm_type import AVMType from puya.awst import ( nodes as awst_nodes, @@ -149,34 +149,16 @@ def _build_ir(ctx: IRBuildContextWithFallback, contract: awst_nodes.ContractFrag source_location=contract.source_location, approval_program=approval_ir, clear_program=clear_state_ir, - metadata=_create_contract_metadata( - contract, - folded.global_state, - folded.local_state, - folded.arc4_methods, + metadata=ContractMetaData( + description=contract.docstring, + name_override=contract.name_override, + module_name=contract.module_name, + class_name=contract.name, + arc4_methods=folded.arc4_methods or [], # TODO: fixme + global_state=immutabledict(folded.global_state), + local_state=immutabledict(folded.local_state), ), ) - - return result - - -def _create_contract_metadata( - contract: awst_nodes.ContractFragment, - global_state: list[ContractState], - local_state: list[ContractState], - arc4_methods: list[ARC4Method] | None, -) -> ContractMetaData: - result = ContractMetaData( - description=contract.docstring, - name_override=contract.name_override, - module_name=contract.module_name, - class_name=contract.name, - is_arc4=contract.is_arc4, - methods=arc4_methods or [], # TODO: fixme - global_state=global_state, - local_state=local_state, - ) - return result @@ -260,8 +242,8 @@ class FoldedContract: init: awst_nodes.ContractMethod | None = None approval_program: awst_nodes.ContractMethod | None = None clear_program: awst_nodes.ContractMethod | None = None - global_state: list[ContractState] = attrs.field(factory=list) - local_state: list[ContractState] = attrs.field(factory=list) + global_state: dict[str, ContractState] = attrs.field(factory=dict) + local_state: dict[str, ContractState] = attrs.field(factory=dict) arc4_methods: list[ARC4Method] | None = None @@ -276,7 +258,7 @@ def fold_state_and_special_methods( ) -> FoldedContract: bases = [ctx.resolve_contract_reference(cref) for cref in contract.bases] result = FoldedContract() - arc4_method_refs = dict[str, tuple[awst_nodes.ContractMethod, ARC4MethodConfig]]() + maybe_arc4_method_refs = dict[str, tuple[awst_nodes.ContractMethod, ARC4MethodConfig] | None]() for c in [contract, *bases]: if result.init is None: result.init = c.init @@ -284,25 +266,27 @@ def fold_state_and_special_methods( result.approval_program = c.approval_program if result.clear_program is None: result.clear_program = c.clear_program - for state in c.app_state: + for state in c.app_state.values(): translated = ContractState( name=state.member_name, source_location=state.source_location, key=state.key, storage_type=wtype_to_storage_type(state.storage_wtype), - description=None, # TODO, have some way to provide this + description=state.description, ) if state.kind == awst_nodes.AppStateKind.app_global: - result.global_state.append(translated) + result.global_state[translated.name] = translated elif state.kind == awst_nodes.AppStateKind.account_local: - result.local_state.append(translated) + result.local_state[translated.name] = translated else: raise InternalError(f"Unhandled state kind: {state.kind}", state.source_location) for cm in c.subroutines: if cm.abimethod_config: - arc4_sig = get_abi_signature(cm, cm.abimethod_config) - arc4_method_refs.setdefault(arc4_sig, (cm, cm.abimethod_config)) - if contract.is_arc4: + maybe_arc4_method_refs.setdefault(cm.name, (cm, cm.abimethod_config)) + else: + maybe_arc4_method_refs.setdefault(cm.name, None) + arc4_method_refs = dict(filter(None, maybe_arc4_method_refs.values())) + if arc4_method_refs: if result.approval_program: raise CodeError( "approval_program should not be defined for ARC4 contracts", @@ -310,9 +294,9 @@ def fold_state_and_special_methods( ) result.approval_program, result.arc4_methods = create_abi_router( contract, - dict(arc4_method_refs.values()), - local_state=result.local_state, - global_state=result.global_state, + arc4_method_refs, + local_state=list(result.local_state.values()), # TODO: pass mappings + global_state=list(result.global_state.values()), ) if not result.clear_program: result.clear_program = create_default_clear_state(contract) diff --git a/src/puya/models.py b/src/puya/models.py index 53ce9e1e96..b46f409a73 100644 --- a/src/puya/models.py +++ b/src/puya/models.py @@ -1,10 +1,15 @@ +from __future__ import annotations + import enum +import typing from typing import Literal, Sequence import attrs +from immutabledict import immutabledict -from puya.avm_type import AVMType -from puya.parse import SourceLocation +if typing.TYPE_CHECKING: + from puya.avm_type import AVMType + from puya.parse import SourceLocation class OnCompletionAction(enum.IntEnum): @@ -16,12 +21,6 @@ class OnCompletionAction(enum.IntEnum): DeleteApplication = 5 -@attrs.frozen(kw_only=True) -class ARC4DefaultArgument: - parameter: str - source: str - - @attrs.frozen(kw_only=True) class ARC4MethodConfig: source_location: SourceLocation @@ -35,13 +34,9 @@ class ARC4MethodConfig: converter=tuple[OnCompletionAction], validator=attrs.validators.min_len(1), ) - default_args: Sequence[ARC4DefaultArgument] = attrs.field( - factory=list, converter=tuple[ARC4DefaultArgument, ...] - ) - structs: Sequence[tuple[str, "ARC32StructDef"]] = attrs.field( - factory=list, converter=tuple[tuple[str, "ARC32StructDef"], ...] - ) - # TODO: the rest + default_args: immutabledict[str, str] = immutabledict() + """Mapping is from parameter -> source""" + structs: immutabledict[str, ARC32StructDef] = immutabledict() @attrs.define @@ -89,10 +84,13 @@ class ContractMetaData: name_override: str | None module_name: str class_name: str - global_state: Sequence[ContractState] - local_state: Sequence[ContractState] - is_arc4: bool - methods: Sequence[ARC4Method] + global_state: immutabledict[str, ContractState] + local_state: immutabledict[str, ContractState] + arc4_methods: Sequence[ARC4Method] + + @property + def is_arc4(self) -> bool: + return bool(self.arc4_methods) @property def name(self) -> str: diff --git a/tests/test_execution.py b/tests/test_execution.py index d6b621171e..51268d6a8c 100644 --- a/tests/test_execution.py +++ b/tests/test_execution.py @@ -5,7 +5,7 @@ import random import re import typing -from collections.abc import Callable, Iterable, Sequence +from collections.abc import Callable, Collection, Iterable from pathlib import Path from tempfile import TemporaryDirectory from textwrap import dedent @@ -26,6 +26,7 @@ from algosdk.transaction import ApplicationCallTxn, ApplicationCreateTxn, OnComplete, StateSchema from algosdk.v2client.algod import AlgodClient from algosdk.v2client.models import SimulateRequest, SimulateTraceConfig +from immutabledict import immutabledict from nacl.signing import SigningKey from puya.avm_type import AVMType from puya.models import CompiledContract, ContractMetaData, ContractState @@ -90,7 +91,7 @@ class Compilation: def assemble_src(contract: CompiledContract, client: AlgodClient) -> Compilation: - def state_to_schema(state: Sequence[ContractState]) -> StateSchema: + def state_to_schema(state: Collection[ContractState]) -> StateSchema: return StateSchema( num_uints=sum(1 for x in state if x.storage_type is AVMType.uint64), num_byte_slices=sum(1 for x in state if x.storage_type is AVMType.bytes), @@ -102,8 +103,8 @@ def state_to_schema(state: Sequence[ContractState]) -> StateSchema: contract=contract, approval=approval_program, clear=clear_program, - local_schema=state_to_schema(contract.metadata.local_state), - global_schema=state_to_schema(contract.metadata.global_state), + local_schema=state_to_schema(contract.metadata.local_state.values()), + global_schema=state_to_schema(contract.metadata.global_state.values()), ) return compilation @@ -510,10 +511,9 @@ def no_op_app_id(algod_client: AlgodClient, account: Account, worker_id: str) -> class_name="", description=None, name_override=None, - global_state=[], - local_state=[], - is_arc4=False, - methods=[], + global_state=immutabledict(), + local_state=immutabledict(), + arc4_methods=[], ), ) compilation = assemble_src(contract=contract, client=algod_client) From 2cc0f01313b15377e8d2a4e223b9c50245206e64 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 27 Feb 2024 16:50:02 +0800 Subject: [PATCH 07/40] refactor --- src/puya/awst_build/contract.py | 85 +++++++++++++++++---------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index 03492c52fc..ccd89638e7 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -57,32 +57,9 @@ def __init__( self._clear_program: ContractMethod | None = None self._init_method: ContractMethod | None = None self._subroutines = list[ContractMethod]() - this_app_state = list(_gather_app_state(context, class_def.info)) - combined_app_state = {defn.member_name: defn for defn in this_app_state} - for base in iterate_user_bases(class_def.info): - base_app_state = { - defn.member_name: defn - # NOTE: we don't report errors for the decls themselves here, - # they should already have been reported when analysing the base type - for defn in _gather_app_state(context, base, report_errors=False) - } - for redefined_member in combined_app_state.keys() & base_app_state.keys(): - member_redef = combined_app_state[redefined_member] - member_orig = base_app_state[redefined_member] - self.context.note( - f"Previous definition of {redefined_member} was here", - member_orig.source_location, - ) - self.context.error( - f"Redefinition of {redefined_member}", - member_redef.source_location, - ) - # we do it this way around so that we keep combined_app_state with the most-derived - # definition in case of redefinitions - combined_app_state = base_app_state | combined_app_state - self._collected_app_state_definitions = dict[str, AppStateDefinition]() - self.app_state: dict[str, AppStateDeclaration] = combined_app_state + self.app_state = _gather_app_state_recursive(context, class_def) + self._collected_app_state_definitions = dict[str, AppStateDefinition]() # note: we iterate directly and catch+log code errors here, # since each statement should be somewhat independent given # the constraints we place (e.g. if one function fails to convert, @@ -226,7 +203,7 @@ def visit_function( self._error( f"cannot be both a subroutine and {arc4_decorator_name}", subroutine_dec ) - *arg_wtypes, ret_wtype = get_func_types( + *arg_wtypes, ret_wtype = _get_func_types( self.context, func_def, location=self._location(func_def) ).values() arc4_method_config = _get_arc4_method_config( @@ -331,10 +308,10 @@ def _unsupported(self, kind: str, stmt: mypy.nodes.Statement) -> None: self._error(f"{kind} statements are not supported in the class body", location=stmt) def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> None: - if isinstance(stmt.rvalue, mypy.nodes.TempNode): - # silently allow state declarations, these will be picked up by gather state - return - self._unsupported("assignment", stmt) + # just pass on state forward-declarations, these will be picked up by gather state + # everything else (ie any _actual_ assignments) is unsupported + if not isinstance(stmt.rvalue, mypy.nodes.TempNode): + self._unsupported("assignment", stmt) def visit_operator_assignment_stmt(self, stmt: mypy.nodes.OperatorAssignmentStmt) -> None: self._unsupported("operator assignment", stmt) @@ -441,16 +418,15 @@ def _gather_app_state( ) -def get_func_types( +def _get_func_types( context: ASTConversionModuleContext, func_def: mypy.nodes.FuncDef, location: SourceLocation ) -> dict[str, wtypes.WType]: - skip_first = ( - 1 - if func_def.arguments - and (func_def.arguments[0].variable.is_self or func_def.arguments[0].variable.is_cls) - else 0 - ) - in_var_names = [arg.variable.name for arg in func_def.arguments[skip_first:]] + start_idx = 0 + if func_def.arguments: + first_arg_var = func_def.arguments[0].variable + if first_arg_var.is_self or first_arg_var.is_cls: + start_idx = 1 + in_var_names = [arg.variable.name for arg in func_def.arguments[start_idx:]] if "output" in in_var_names: # https://github.com/algorandfoundation/ARCs/blob/main/assets/arc-0032/application.schema.json raise CodeError( @@ -460,7 +436,7 @@ def get_func_types( names = [*in_var_names, "output"] match func_def.type: case mypy.types.CallableType(arg_types=arg_types, ret_type=ret_type): - types = arg_types[skip_first:] + [ret_type] + types = arg_types[start_idx:] + [ret_type] wtypes_ = (context.type_to_wtype(t, source_location=location) for t in types) return dict(zip(names, wtypes_, strict=True)) raise InternalError("Unexpected FuncDef type") @@ -518,7 +494,7 @@ def _get_arc4_method_config( structs = immutabledict[str, ARC32StructDef]( { n: _wtype_to_struct_def(t) - for n, t in get_func_types( + for n, t in _get_func_types( context, func_def, context.node_location(func_def) ).items() if isinstance(t, wtypes.ARC4Struct) @@ -672,3 +648,32 @@ def _gather_bases( contract_bases_mro.append(base_cref) return contract_bases_mro + + +def _gather_app_state_recursive( + context: ASTConversionModuleContext, class_def: mypy.nodes.ClassDef +) -> dict[str, AppStateDeclaration]: + this_app_state = list(_gather_app_state(context, class_def.info)) + combined_app_state = {defn.member_name: defn for defn in this_app_state} + for base in iterate_user_bases(class_def.info): + base_app_state = { + defn.member_name: defn + # NOTE: we don't report errors for the decls themselves here, + # they should already have been reported when analysing the base type + for defn in _gather_app_state(context, base, report_errors=False) + } + for redefined_member in combined_app_state.keys() & base_app_state.keys(): + member_redef = combined_app_state[redefined_member] + member_orig = base_app_state[redefined_member] + context.note( + f"Previous definition of {redefined_member} was here", + member_orig.source_location, + ) + context.error( + f"Redefinition of {redefined_member}", + member_redef.source_location, + ) + # we do it this way around so that we keep combined_app_state with the most-derived + # definition in case of redefinitions + combined_app_state = base_app_state | combined_app_state + return combined_app_state From 38d63160003b30b96988f014016152e8bbfa8539 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 27 Feb 2024 17:07:41 +0800 Subject: [PATCH 08/40] fix & update error message --- src/puya/awst_build/context.py | 2 +- src/puya/awst_build/subroutine.py | 3 +- .../Arc4StructsFromAnotherModule.approval.mir | 11 ++ ...Arc4StructsFromAnotherModule.approval.teal | 13 ++ .../Arc4StructsFromAnotherModule.clear.mir | 9 + .../Arc4StructsFromAnotherModule.clear.teal | 7 + ...c4StructsFromAnotherModule.destructured.ir | 11 ++ .../out/Arc4StructsFromAnotherModule.ssa.ir | 25 +++ ...StructsFromAnotherModule.ssa.opt_pass_1.ir | 17 ++ ...StructsFromAnotherModule.ssa.opt_pass_2.ir | 14 ++ ...StructsFromAnotherModule.ssa.opt_pass_3.ir | 13 ++ ...StructsFromAnotherModule.ssa.opt_pass_4.ir | 12 ++ ...StructsFromAnotherModule.ssa.opt_pass_5.ir | 11 ++ test_cases/arc4_types/out/structs2.awst | 14 ++ ...Arc4StructsFromAnotherModule.approval.teal | 7 + .../Arc4StructsFromAnotherModule.clear.teal | 5 + ...c4StructsFromAnotherModule.destructured.ir | 11 ++ ...Arc4StructsFromAnotherModule.approval.teal | 54 ++++++ .../Arc4StructsFromAnotherModule.clear.teal | 7 + ...c4StructsFromAnotherModule.destructured.ir | 24 +++ test_cases/arc4_types/puya.log | 181 ++++++++++++++++++ test_cases/arc4_types/structs2.py | 15 ++ 22 files changed, 463 insertions(+), 3 deletions(-) create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.mir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.teal create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.mir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.teal create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir create mode 100644 test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir create mode 100644 test_cases/arc4_types/out/structs2.awst create mode 100644 test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.approval.teal create mode 100644 test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.clear.teal create mode 100644 test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir create mode 100644 test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.approval.teal create mode 100644 test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.clear.teal create mode 100644 test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir create mode 100644 test_cases/arc4_types/structs2.py diff --git a/src/puya/awst_build/context.py b/src/puya/awst_build/context.py index a23e9010e3..d3a72d0f35 100644 --- a/src/puya/awst_build/context.py +++ b/src/puya/awst_build/context.py @@ -23,6 +23,7 @@ class ASTConversionContext(CompileContext): module_asts: Mapping[str, Module] constants: dict[str, ConstantValue] = attrs.field(factory=dict) + type_map: dict[str, wtypes.WStructType | wtypes.ARC4Struct] = attrs.field(factory=dict) def for_module(self, current_module: mypy.nodes.MypyFile) -> "ASTConversionModuleContext": return attrs_extend(ASTConversionModuleContext, self, current_module=current_module) @@ -31,7 +32,6 @@ def for_module(self, current_module: mypy.nodes.MypyFile) -> "ASTConversionModul @attrs.frozen(kw_only=True) class ASTConversionModuleContext(ASTConversionContext): current_module: mypy.nodes.MypyFile - type_map: dict[str, wtypes.WStructType | wtypes.ARC4Struct] = attrs.field(factory=dict) @property def module_name(self) -> str: diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index eecfbb743c..98e1389013 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -606,8 +606,7 @@ def _visit_ref_expr_maybe_aliased( wtype = self.context.type_map[fullname] except KeyError: raise CodeError( - f"Unknown struct subclass {fullname}" - " (declaration must currently precede usage)", + f"Unknown struct subclass {fullname}", expr_loc, ) from None if isinstance(wtype, wtypes.WStructType): diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.mir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.mir new file mode 100644 index 0000000000..868d6a36f0 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.mir @@ -0,0 +1,11 @@ +// Op // Stack (out) Source code Source line + +#pragma version 10 + +// test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: +main_block@0: + byte 0xa0 // 0xa0 Flags(a=arc4.Bool(True), b=arc4.Bool(False), c=arc4.Bool(True), d=arc4.Bool(False)) arc4_types/structs2.py:8 + log // log(flags.bytes) arc4_types/structs2.py:9 + int 1 // 1 True arc4_types/structs2.py:11 + return // return True arc4_types/structs2.py:11 + diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.teal b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.teal new file mode 100644 index 0000000000..b29b3034c9 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.approval.teal @@ -0,0 +1,13 @@ +#pragma version 10 + +test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program: + // arc4_types/structs2.py:8 + // flags = Flags(a=arc4.Bool(True), b=arc4.Bool(False), c=arc4.Bool(True), d=arc4.Bool(False)) + byte 0xa0 + // arc4_types/structs2.py:9 + // log(flags.bytes) + log + // arc4_types/structs2.py:11 + // return True + int 1 + return diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.mir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.mir new file mode 100644 index 0000000000..b51d3758cc --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.mir @@ -0,0 +1,9 @@ +// Op // Stack (out) Source code Source line + +#pragma version 10 + +// test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: +main_block@0: + int 1 // 1 True arc4_types/structs2.py:14 + return // return True arc4_types/structs2.py:14 + diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.teal b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.teal new file mode 100644 index 0000000000..1633ed77f1 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program: + // arc4_types/structs2.py:14 + // return True + int 1 + return diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir new file mode 100644 index 0000000000..72d4bf6ab8 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir @@ -0,0 +1,11 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + (log 0xa0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir new file mode 100644 index 0000000000..8659298f40 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir @@ -0,0 +1,25 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + let tmp%0#0: any = (setbit 0x00 0u 1u) + let tmp%1#0: any = (setbit 0x00 0u 0u) + let tmp%2#0: any = (setbit 0x00 0u 1u) + let tmp%3#0: any = (setbit 0x00 0u 0u) + let current_tail_offset%4#0: uint64 = 1u + let encoded_tuple_buffer%5#0: bytes = 0x + let encoded_tuple_buffer%5#1: bytes = (concat encoded_tuple_buffer%5#0 tmp%0#0) + let is_true%6#0: uint64 = (getbit tmp%1#0 0u) + let encoded_tuple_buffer%5#2: any = (setbit encoded_tuple_buffer%5#1 1u is_true%6#0) + let is_true%7#0: uint64 = (getbit tmp%2#0 0u) + let encoded_tuple_buffer%5#3: any = (setbit encoded_tuple_buffer%5#2 2u is_true%7#0) + let is_true%8#0: uint64 = (getbit tmp%3#0 0u) + let encoded_tuple_buffer%5#4: any = (setbit encoded_tuple_buffer%5#3 3u is_true%8#0) + let flags#0: any = encoded_tuple_buffer%5#4 + (log flags#0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir new file mode 100644 index 0000000000..52e74b53a3 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir @@ -0,0 +1,17 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + let encoded_tuple_buffer%5#1: bytes = (concat 0x 0x80) + let is_true%6#0: uint64 = (getbit 0x00 0u) + let encoded_tuple_buffer%5#2: any = (setbit encoded_tuple_buffer%5#1 1u is_true%6#0) + let is_true%7#0: uint64 = (getbit 0x80 0u) + let encoded_tuple_buffer%5#3: any = (setbit encoded_tuple_buffer%5#2 2u is_true%7#0) + let flags#0: any = (setbit encoded_tuple_buffer%5#3 3u is_true%6#0) + (log flags#0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir new file mode 100644 index 0000000000..86f76e239e --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir @@ -0,0 +1,14 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + let encoded_tuple_buffer%5#2: any = (setbit 0x80 1u 0u) + let encoded_tuple_buffer%5#3: any = (setbit encoded_tuple_buffer%5#2 2u 1u) + let flags#0: any = (setbit encoded_tuple_buffer%5#3 3u 0u) + (log flags#0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir new file mode 100644 index 0000000000..f498f4bc30 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir @@ -0,0 +1,13 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + let encoded_tuple_buffer%5#3: any = (setbit 0x80 2u 1u) + let flags#0: any = (setbit encoded_tuple_buffer%5#3 3u 0u) + (log flags#0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir new file mode 100644 index 0000000000..dc04a5185e --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir @@ -0,0 +1,12 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + let flags#0: any = (setbit 0xa0 3u 0u) + (log flags#0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir new file mode 100644 index 0000000000..72d4bf6ab8 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir @@ -0,0 +1,11 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + (log 0xa0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out/structs2.awst b/test_cases/arc4_types/out/structs2.awst new file mode 100644 index 0000000000..b9e3a536c7 --- /dev/null +++ b/test_cases/arc4_types/out/structs2.awst @@ -0,0 +1,14 @@ +contract Arc4StructsFromAnotherModule +{ + approval_program(): bool + { + flags: test_cases.arc4_types.structs.Flags = arc4_encode((arc4_encode(true, puyapy.arc4.Bool), arc4_encode(false, puyapy.arc4.Bool), arc4_encode(true, puyapy.arc4.Bool), arc4_encode(false, puyapy.arc4.Bool)), test_cases.arc4_types.structs.Flags) + log(reinterpret_cast(flags)) + return true + } + + clear_state_program(): bool + { + return true + } +} \ No newline at end of file diff --git a/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.approval.teal b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.approval.teal new file mode 100644 index 0000000000..bf2e506e2c --- /dev/null +++ b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.approval.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program: + byte 0xa0 + log + int 1 + return diff --git a/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.clear.teal b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.clear.teal new file mode 100644 index 0000000000..df6be2f42d --- /dev/null +++ b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program: + int 1 + return diff --git a/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir new file mode 100644 index 0000000000..72d4bf6ab8 --- /dev/null +++ b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir @@ -0,0 +1,11 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + (log 0xa0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.approval.teal b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.approval.teal new file mode 100644 index 0000000000..00919f5913 --- /dev/null +++ b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.approval.teal @@ -0,0 +1,54 @@ +#pragma version 10 + +test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program: + // arc4_types/structs2.py:8 + // flags = Flags(a=arc4.Bool(True), b=arc4.Bool(False), c=arc4.Bool(True), d=arc4.Bool(False)) + byte 0x00 + int 0 + int 1 + setbit + byte 0x00 + int 0 + int 0 + setbit + byte 0x00 + int 0 + int 1 + setbit + cover 2 + byte 0x00 + int 0 + int 0 + setbit + cover 3 + byte 0x + uncover 2 + concat + swap + int 0 + getbit + swap + int 1 + uncover 2 + setbit + swap + int 0 + getbit + swap + int 2 + uncover 2 + setbit + swap + int 0 + getbit + swap + int 3 + uncover 2 + setbit + // arc4_types/structs2.py:9 + // log(flags.bytes) + log + // arc4_types/structs2.py:11 + // return True + int 1 + return diff --git a/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.clear.teal b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.clear.teal new file mode 100644 index 0000000000..1633ed77f1 --- /dev/null +++ b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program: + // arc4_types/structs2.py:14 + // return True + int 1 + return diff --git a/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir new file mode 100644 index 0000000000..fa07fc1048 --- /dev/null +++ b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir @@ -0,0 +1,24 @@ +contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: + program approval: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: + block@0: // L6 + let tmp%0#0: any = (setbit 0x00 0u 1u) + let tmp%1#0: any = (setbit 0x00 0u 0u) + let tmp%2#0: any = (setbit 0x00 0u 1u) + let tmp%3#0: any = (setbit 0x00 0u 0u) + let encoded_tuple_buffer%5#0: bytes = 0x + let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%5#0 tmp%0#0) + let is_true%6#0: uint64 = (getbit tmp%1#0 0u) + let encoded_tuple_buffer%5#0: bytes = (setbit encoded_tuple_buffer%5#0 1u is_true%6#0) + let is_true%7#0: uint64 = (getbit tmp%2#0 0u) + let encoded_tuple_buffer%5#0: bytes = (setbit encoded_tuple_buffer%5#0 2u is_true%7#0) + let is_true%8#0: uint64 = (getbit tmp%3#0 0u) + let encoded_tuple_buffer%5#0: bytes = (setbit encoded_tuple_buffer%5#0 3u is_true%8#0) + let flags#0: any = encoded_tuple_buffer%5#0 + (log flags#0) + return 1u + + program clear-state: + subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program() -> uint64: + block@0: // L13 + return 1u \ No newline at end of file diff --git a/test_cases/arc4_types/puya.log b/test_cases/arc4_types/puya.log index a7ccab8905..85d0423180 100644 --- a/test_cases/arc4_types/puya.log +++ b/test_cases/arc4_types/puya.log @@ -618,6 +618,10 @@ debug: Replaced trivial Phi node: let coord_1#1: bytes = φ(coord_1#0 <- block@1 debug: Terminated block@5: // after_for_L30 debug: Sealing block@0: // L41 debug: Terminated block@0: // L41 +debug: Sealing block@0: // L6 +debug: Terminated block@0: // L6 +debug: Sealing block@0: // L13 +debug: Terminated block@0: // L13 debug: Sealing block@0: // L54 debug: Terminated block@0: // L54 debug: Sealing block@0: // L14 @@ -7973,6 +7977,181 @@ debug: Inserted nested_decode_block@0.ops[36]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced nested_decode_block@0.ops[38]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' debug: Inserted nested_decode_block@0.ops[26]: 'store is_true%5#0 to l-stack (copy)' debug: Replaced nested_decode_block@0.ops[30]: 'load is_true%5#0' with 'load is_true%5#0 from l-stack (no copy)' +debug: Output IR to arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir +info: Optimizing test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule at level 1 +debug: Begin optimization pass 1/100 +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Found equivalence set: encoded_tuple_buffer%5#4, flags#0 +debug: Replacing {encoded_tuple_buffer%5#4} with flags#0 made 1 modifications +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable tmp%0#0 +debug: Removing unused variable tmp%1#0 +debug: Removing unused variable tmp%2#0 +debug: Removing unused variable tmp%3#0 +debug: Removing unused variable current_tail_offset%4#0 +debug: Removing unused variable encoded_tuple_buffer%5#0 +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Replacing redundant declaration let is_true%8#0: uint64 = (getbit 0x00 0u) with copy of existing registers [Register(atype=uint64, name='is_true%6', version=0, source_location=arc4_types/structs2.py:8:16-99)] +debug: Found equivalence set: is_true%6#0, is_true%8#0 +debug: Replacing {is_true%8#0} with is_true%6#0 made 1 modifications +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Output IR to arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir +debug: Begin optimization pass 2/100 +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%5#1 +debug: Removing unused variable is_true%6#0 +debug: Removing unused variable is_true%7#0 +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Output IR to arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir +debug: Begin optimization pass 3/100 +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%5#2 +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Output IR to arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir +debug: Begin optimization pass 4/100 +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable encoded_tuple_buffer%5#3 +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Output IR to arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir +debug: Begin optimization pass 5/100 +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Removing unused variable flags#0 +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Output IR to arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir +debug: Begin optimization pass 6/100 +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: No optimizations performed in pass 6, ending loop +debug: Removing Phis from test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Removing Phis from test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Coalescing local variables in test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Sequentializing parallel copies in test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program +debug: Sequentializing parallel copies in test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.clear_state_program +debug: Performing post-SSA optimizations +debug: Output IR to arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir debug: Output IR to arc4_types/out/Arc4TuplesTypeContract.ssa.ir info: Optimizing test_cases.arc4_types.tuples.Arc4TuplesTypeContract at level 1 debug: Begin optimization pass 1/100 @@ -9418,5 +9597,7 @@ info: Writing arc4_types/out/Arc4StringTypesContract.approval.teal info: Writing arc4_types/out/Arc4StringTypesContract.clear.teal info: Writing arc4_types/out/Arc4StructsTypeContract.approval.teal info: Writing arc4_types/out/Arc4StructsTypeContract.clear.teal +info: Writing arc4_types/out/Arc4StructsFromAnotherModule.approval.teal +info: Writing arc4_types/out/Arc4StructsFromAnotherModule.clear.teal info: Writing arc4_types/out/Arc4TuplesTypeContract.approval.teal info: Writing arc4_types/out/Arc4TuplesTypeContract.clear.teal \ No newline at end of file diff --git a/test_cases/arc4_types/structs2.py b/test_cases/arc4_types/structs2.py new file mode 100644 index 0000000000..3ba29b9a1a --- /dev/null +++ b/test_cases/arc4_types/structs2.py @@ -0,0 +1,15 @@ +from puyapy import Contract, arc4, log +from test_cases.arc4_types.structs import Flags + + +class Arc4StructsFromAnotherModule(Contract): + def approval_program(self) -> bool: + + flags = Flags(a=arc4.Bool(True), b=arc4.Bool(False), c=arc4.Bool(True), d=arc4.Bool(False)) + log(flags.bytes) + + return True + + def clear_state_program(self) -> bool: + return True + From cf801cb933b31cbcb14e00f0a3d340f46b8bd589 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 11:40:20 +0800 Subject: [PATCH 09/40] refactors: - remove unused `module_asts` on ASTConversionContext - convert ALLOWED_OCA list to frozenset - add/remove/address some TODOs - simplify FunctionASTConverter.visit_assignment_stmt a bit --- src/puya/awst_build/context.py | 2 -- src/puya/awst_build/contract.py | 4 +++- src/puya/awst_build/eb/temporary_assignment.py | 1 + src/puya/awst_build/main.py | 6 +----- src/puya/awst_build/subroutine.py | 10 +++------- src/puya/ir/context.py | 1 - src/puya/ir/main.py | 4 ++-- 7 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/puya/awst_build/context.py b/src/puya/awst_build/context.py index d3a72d0f35..76cea1873a 100644 --- a/src/puya/awst_build/context.py +++ b/src/puya/awst_build/context.py @@ -9,7 +9,6 @@ from puya.awst.nodes import ( ConstantValue, Literal as AWSTLiteral, - Module, ) from puya.awst_build import constants from puya.awst_build.eb.base import TypeClassExpressionBuilder @@ -21,7 +20,6 @@ @attrs.frozen(kw_only=True) class ASTConversionContext(CompileContext): - module_asts: Mapping[str, Module] constants: dict[str, ConstantValue] = attrs.field(factory=dict) type_map: dict[str, wtypes.WStructType | wtypes.ARC4Struct] = attrs.field(factory=dict) diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index ccd89638e7..44dfe395de 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -37,7 +37,9 @@ from puya.models import ARC4MethodConfig, ARC32StructDef, OnCompletionAction from puya.parse import SourceLocation -ALLOWABLE_OCA = [oca.name for oca in OnCompletionAction if oca != OnCompletionAction.ClearState] +ALLOWABLE_OCA = frozenset( + [oca.name for oca in OnCompletionAction if oca != OnCompletionAction.ClearState] +) class ContractASTConverter(BaseMyPyStatementVisitor[None]): diff --git a/src/puya/awst_build/eb/temporary_assignment.py b/src/puya/awst_build/eb/temporary_assignment.py index cd4cde0cc7..cb8988323a 100644 --- a/src/puya/awst_build/eb/temporary_assignment.py +++ b/src/puya/awst_build/eb/temporary_assignment.py @@ -11,6 +11,7 @@ from puya.parse import SourceLocation +# TODO: this should probably extend ValueProxyExpressionBuilder class TemporaryAssignmentExpressionBuilder(ExpressionBuilder): def __init__(self, expr: Expression): super().__init__(expr.source_location) diff --git a/src/puya/awst_build/main.py b/src/puya/awst_build/main.py index 6a2cd8676a..4037fa53ba 100644 --- a/src/puya/awst_build/main.py +++ b/src/puya/awst_build/main.py @@ -17,12 +17,8 @@ def transform_ast(compile_context: CompileContext) -> dict[str, Module]: - # module mapping is mutable here, but on the context it is an immutable Mapping - # (from a type-checkers perspective, anyway) result = dict[str, Module]() - ctx: ASTConversionContext = attrs_extend( - ASTConversionContext, compile_context, module_asts=result - ) + ctx: ASTConversionContext = attrs_extend(ASTConversionContext, compile_context) user_modules = {} for scc_module_names in mypy.build.sorted_components(ctx.parse_result.graph): for module_name in scc_module_names: diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index 98e1389013..acc0394f5b 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -362,18 +362,14 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> Sequence[Sta value=rvalue.initial_value, ) ] - elif len(stmt.lvalues) == 1: - value = rvalue.build_assignment_source() - (lvalue,) = stmt.lvalues - target = self.resolve_lvalue(lvalue) - return [AssignmentStatement(source_location=stmt_loc, target=target, value=value)] else: - single_eval_wrapper = temporary_assignment_if_required(rvalue) + if len(stmt.lvalues) > 1: + rvalue = temporary_assignment_if_required(rvalue) return [ AssignmentStatement( source_location=stmt_loc, target=self.resolve_lvalue(lvalue), - value=single_eval_wrapper.build_assignment_source(), + value=rvalue.build_assignment_source(), ) for lvalue in reversed(stmt.lvalues) ] diff --git a/src/puya/ir/context.py b/src/puya/ir/context.py index c4ff35ab60..fa062bbc76 100644 --- a/src/puya/ir/context.py +++ b/src/puya/ir/context.py @@ -53,7 +53,6 @@ def for_function( def resolve_contract_reference( self, cref: awst_nodes.ContractReference ) -> awst_nodes.ContractFragment: - # TODO: this probably shouldn't be required, AWST should stitch things together try: module = self.module_awsts[cref.module_name] contract = module.symtable[cref.class_name] diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py index b3ea206522..bf22e36f42 100644 --- a/src/puya/ir/main.py +++ b/src/puya/ir/main.py @@ -154,7 +154,7 @@ def _build_ir(ctx: IRBuildContextWithFallback, contract: awst_nodes.ContractFrag name_override=contract.name_override, module_name=contract.module_name, class_name=contract.name, - arc4_methods=folded.arc4_methods or [], # TODO: fixme + arc4_methods=folded.arc4_methods, global_state=immutabledict(folded.global_state), local_state=immutabledict(folded.local_state), ), @@ -244,7 +244,7 @@ class FoldedContract: clear_program: awst_nodes.ContractMethod | None = None global_state: dict[str, ContractState] = attrs.field(factory=dict) local_state: dict[str, ContractState] = attrs.field(factory=dict) - arc4_methods: list[ARC4Method] | None = None + arc4_methods: list[ARC4Method] = attrs.field(factory=list) def wtype_to_storage_type(wtype: wtypes.WType) -> typing.Literal[AVMType.uint64, AVMType.bytes]: From 0450619e86768066917d05e9a2857ee90d400588 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 11:52:55 +0800 Subject: [PATCH 10/40] avoid isinstance checks on ValueExpressionBuilder --- src/puya/awst_build/eb/arc4/numeric.py | 7 +++---- src/puya/awst_build/eb/transaction/inner_params.py | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/puya/awst_build/eb/arc4/numeric.py b/src/puya/awst_build/eb/arc4/numeric.py index e17086d968..67698df250 100644 --- a/src/puya/awst_build/eb/arc4/numeric.py +++ b/src/puya/awst_build/eb/arc4/numeric.py @@ -18,7 +18,7 @@ ARC4EncodedExpressionBuilder, get_integer_literal_value, ) -from puya.awst_build.eb.base import ValueExpressionBuilder +from puya.awst_build.eb.base import ExpressionBuilder from puya.awst_build.eb.var_factory import var_expression from puya.errors import CodeError, InternalError @@ -27,7 +27,6 @@ import mypy.nodes - from puya.awst_build.eb.base import ExpressionBuilder from puya.parse import SourceLocation logger: structlog.types.FilteringBoundLogger = structlog.get_logger(__name__) @@ -103,9 +102,9 @@ def call( wtype=self.wtype, ) ) - case [ValueExpressionBuilder() as eb]: + case [ExpressionBuilder(value_type=wtypes.WType() as value_type) as eb]: value = eb.rvalue() - if value.wtype not in ( + if value_type not in ( wtypes.bool_wtype, wtypes.uint64_wtype, wtypes.biguint_wtype, diff --git a/src/puya/awst_build/eb/transaction/inner_params.py b/src/puya/awst_build/eb/transaction/inner_params.py index fe5f8773aa..c0094aaef8 100644 --- a/src/puya/awst_build/eb/transaction/inner_params.py +++ b/src/puya/awst_build/eb/transaction/inner_params.py @@ -52,8 +52,8 @@ def get_field_exprs( else TxnFields.clear_state_program_pages ) match arg: - case ValueExpressionBuilder( - wtype=wtypes.WTuple(types=tuple_item_types) as wtype + case ExpressionBuilder( + value_type=wtypes.WTuple(types=tuple_item_types) as wtype ) if all(field.valid_type(t) for t in tuple_item_types): expr = expect_operand_wtype(arg, wtype) return field, expr @@ -61,8 +61,8 @@ def get_field_exprs( field_expr = expect_operand_wtype(arg, field.wtype) elif field.is_array: match arg: - case ValueExpressionBuilder( - wtype=wtypes.WTuple(types=tuple_item_types) as wtype + case ExpressionBuilder( + value_type=wtypes.WTuple(types=tuple_item_types) as wtype ) if all(field.valid_type(t) for t in tuple_item_types): expr = expect_operand_wtype(arg, wtype) return field, expr From bc7741413f0c4cadb7d2e237d03cb8b6b01c310c Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 11:54:52 +0800 Subject: [PATCH 11/40] fix issue with TemporaryAssignmentExpressionBuilder not being picked up as a value --- src/puya/awst_build/eb/temporary_assignment.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/puya/awst_build/eb/temporary_assignment.py b/src/puya/awst_build/eb/temporary_assignment.py index cb8988323a..1498493696 100644 --- a/src/puya/awst_build/eb/temporary_assignment.py +++ b/src/puya/awst_build/eb/temporary_assignment.py @@ -1,3 +1,4 @@ +from puya.awst import wtypes from puya.awst.nodes import ( Expression, Literal, @@ -15,11 +16,16 @@ class TemporaryAssignmentExpressionBuilder(ExpressionBuilder): def __init__(self, expr: Expression): super().__init__(expr.source_location) + self.wtype = expr.wtype assign_expr = create_temporary_assignment(expr) self.target = assign_expr.read self.assignment = assign_expr.define self.is_first_access = True + @property + def value_type(self) -> wtypes.WType: + return self.wtype + def lvalue(self) -> Lvalue: raise InternalError( "Temporary assignment should not be used as an assignment target itself" From 6b6f32575a2351ee309f0d9d8db18f3027ed2ac8 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 13:45:18 +0800 Subject: [PATCH 12/40] wip --- src/puya/awst_build/context.py | 8 +- src/puya/awst_build/eb/app_account_state.py | 90 +++++++++++++++++---- src/puya/awst_build/eb/base.py | 82 +++++++++++++++++++ src/puya/awst_build/subroutine.py | 58 +++++++------ test_cases/arc4_types/structs2.py | 3 +- 5 files changed, 198 insertions(+), 43 deletions(-) diff --git a/src/puya/awst_build/context.py b/src/puya/awst_build/context.py index 76cea1873a..580ba62c6b 100644 --- a/src/puya/awst_build/context.py +++ b/src/puya/awst_build/context.py @@ -1,5 +1,6 @@ import contextlib -from collections.abc import Iterator, Mapping, Sequence +from collections import defaultdict +from collections.abc import Iterator, Sequence import attrs import mypy.nodes @@ -7,7 +8,9 @@ from puya.awst import wtypes from puya.awst.nodes import ( + AppStateDefinition, ConstantValue, + ContractReference, Literal as AWSTLiteral, ) from puya.awst_build import constants @@ -22,6 +25,9 @@ class ASTConversionContext(CompileContext): constants: dict[str, ConstantValue] = attrs.field(factory=dict) type_map: dict[str, wtypes.WStructType | wtypes.ARC4Struct] = attrs.field(factory=dict) + state_defs: defaultdict[ContractReference, list[AppStateDefinition]] = attrs.field( + factory=lambda: defaultdict(list) + ) def for_module(self, current_module: mypy.nodes.MypyFile) -> "ASTConversionModuleContext": return attrs_extend(ASTConversionModuleContext, self, current_module=current_module) diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index fcee138397..02e0b7f517 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -7,6 +7,7 @@ from puya.awst.nodes import ( AppAccountStateExpression, AppStateKind, + BytesEncoding, ConditionalExpression, Expression, IntegerConstant, @@ -17,15 +18,22 @@ TupleItemExpression, UInt64Constant, ) +from puya.awst_build import constants from puya.awst_build.contract_data import AppStateDeclaration from puya.awst_build.eb.base import ( ExpressionBuilder, IntermediateExpressionBuilder, + StateProxyDefinitionBuilder, + StateProxyMemberBuilder, TypeClassExpressionBuilder, ) from puya.awst_build.eb.value_proxy import ValueProxyExpressionBuilder from puya.awst_build.eb.var_factory import var_expression -from puya.awst_build.utils import create_temporary_assignment, expect_operand_wtype +from puya.awst_build.utils import ( + create_temporary_assignment, + expect_operand_wtype, + get_arg_mapping, +) from puya.errors import CodeError, InternalError from puya.parse import SourceLocation @@ -42,7 +50,7 @@ def _build_field( ) -class AppAccountStateExpressionBuilder(IntermediateExpressionBuilder): +class AppAccountStateExpressionBuilder(StateProxyMemberBuilder): def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation): assert state_decl.kind is AppStateKind.account_local super().__init__(location) @@ -215,18 +223,72 @@ def call( location: SourceLocation, original_expr: mypy.nodes.CallExpr, ) -> ExpressionBuilder: - call_expr_loc = location - match args: - case [TypeClassExpressionBuilder() as typ_class_eb]: - storage_wtype = typ_class_eb.produces() - case _: - raise CodeError("expected a single argument with storage type", call_expr_loc) + type_arg_name = "type_" + arg_mapping = get_arg_mapping( + positional_arg_names=[type_arg_name], + args=zip(arg_names, args, strict=True), + location=location, + ) + try: + type_arg = arg_mapping.pop(type_arg_name) + except KeyError as ex: + raise CodeError("Required positional argument missing", location) from ex - if self._storage is not None and self._storage != storage_wtype: + key_arg = arg_mapping.pop("key", None) + descr_arg = arg_mapping.pop("description", None) + if arg_mapping: raise CodeError( - "App account state explicit type annotation does not match first argument" - " - suggest to remove the explicit type annotation," - " it shouldn't be required", - call_expr_loc, + f"Unrecognised keyword argument(s): {", ".join(arg_mapping)}", location ) - return self + + match type_arg: + case TypeClassExpressionBuilder() as typ_class_eb: + storage_wtype = typ_class_eb.produces() + if self._storage is not None and self._storage != storage_wtype: + raise CodeError( + "App account state explicit type annotation does not match first argument" + " - suggest to remove the explicit type annotation," + " it shouldn't be required", + location, + ) + case _: + raise CodeError("First argument must be a type reference", location) + + match key_arg: + case None: + key = None + key_encoding = None + case Literal(value=bytes(bytes_value)): + key = bytes_value + key_encoding = BytesEncoding.base16 # TODO: maybe we need an "unknown" encoding? + case Literal(value=str(str_value)): + key = str_value.encode("utf8") + key_encoding = BytesEncoding.utf8 + case _: + raise CodeError("key should be a string or bytes literal", key_arg.source_location) + + match descr_arg: + case None: + description = None + case Literal(value=str(str_value)): + description = str_value + case _: + raise CodeError( + "description should be a string literal", descr_arg.source_location + ) + + return AppAccountStateProxyDefinitionBuilder( + location=location, + storage=storage_wtype, + key=key, + key_encoding=key_encoding, + description=description, + ) + + +class AppAccountStateProxyDefinitionBuilder(StateProxyDefinitionBuilder): + kind = AppStateKind.account_local + python_name = constants.CLS_LOCAL_STATE_ALIAS + + def initial_value(self) -> Expression | None: + return None diff --git a/src/puya/awst_build/eb/base.py b/src/puya/awst_build/eb/base.py index 2c873fb147..3473d01c35 100644 --- a/src/puya/awst_build/eb/base.py +++ b/src/puya/awst_build/eb/base.py @@ -5,6 +5,9 @@ from typing import TYPE_CHECKING, Never, TypeAlias, cast from puya.awst.nodes import ( + AppStateDefinition, + AppStateKind, + BytesEncoding, Expression, FieldExpression, IndexExpression, @@ -24,6 +27,7 @@ import mypy.types from puya.awst import wtypes + from puya.awst_build.contract_data import AppStateDeclaration from puya.parse import SourceLocation __all__ = [ @@ -31,6 +35,8 @@ "BuilderComparisonOp", "BuilderBinaryOp", "ExpressionBuilder", + "StateProxyDefinitionBuilder", + "StateProxyMemberBuilder", "IntermediateExpressionBuilder", "TypeClassExpressionBuilder", "GenericClassExpressionBuilder", @@ -228,6 +234,82 @@ def _not_a_value(self, location: SourceLocation) -> Never: raise CodeError(f"{type(self).__name__} is not a value", location) +class StateProxyMemberBuilder(IntermediateExpressionBuilder): + state_decl: AppStateDeclaration + + +class StateProxyDefinitionBuilder(ExpressionBuilder, abc.ABC): + kind: AppStateKind + python_name: str + + def __init__( + self, + location: SourceLocation, + storage: wtypes.WType, + key: bytes | None, + key_encoding: BytesEncoding | None, + description: str | None, + ): + super().__init__(location) + if (key is None) != (key_encoding is None): + raise InternalError( + "either key and key_encoding should be specified or neither", location + ) + self.storage = storage + self.key = key + self.key_encoding = key_encoding + self.description = description + + @abc.abstractmethod + def initial_value(self) -> Expression | None: + ... + + def build_definition(self, member_name: str, location: SourceLocation) -> AppStateDefinition: + return AppStateDefinition( + description=self.description, + key=(self.key if self.key is not None else member_name.encode("utf8")), + key_encoding=self.key_encoding or BytesEncoding.utf8, + source_location=location, + member_name=member_name, + storage_wtype=self.storage, + kind=self.kind, + ) + + def rvalue(self) -> Expression: + return self._assign_first(self.source_location) + + def lvalue(self) -> Lvalue: + raise CodeError( + f"{self.python_name} is not valid as an assignment target", self.source_location + ) + + def delete(self, location: SourceLocation) -> Statement: + raise self._assign_first(location) + + def bool_eval(self, location: SourceLocation, *, negate: bool = False) -> ExpressionBuilder: + return self._assign_first(location) + + def unary_plus(self, location: SourceLocation) -> ExpressionBuilder: + return self._assign_first(location) + + def unary_minus(self, location: SourceLocation) -> ExpressionBuilder: + return self._assign_first(location) + + def bitwise_invert(self, location: SourceLocation) -> ExpressionBuilder: + return self._assign_first(location) + + def contains( + self, item: ExpressionBuilder | Literal, location: SourceLocation + ) -> ExpressionBuilder: + return self._assign_first(location) + + def _assign_first(self, location: SourceLocation) -> Never: + raise CodeError( + f"{self.python_name} should be assigned to an instance variable before being used", + location, + ) + + class TypeClassExpressionBuilder(IntermediateExpressionBuilder, abc.ABC): # TODO: better error messages for rvalue/lvalue/delete diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index acc0394f5b..b07a8ca3e0 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -12,6 +12,7 @@ from puya.awst import wtypes from puya.awst.nodes import ( AppStateExpression, + AppStateKind, AssertStatement, AssignmentExpression, AssignmentStatement, @@ -48,13 +49,13 @@ from puya.awst_build.base_mypy_visitor import BaseMyPyVisitor from puya.awst_build.context import ASTConversionModuleContext from puya.awst_build.contract_data import AppStateDeclaration -from puya.awst_build.eb.app_account_state import AppAccountStateClassExpressionBuilder -from puya.awst_build.eb.app_state import AppStateClassExpressionBuilder, AppStateExpressionBuilder from puya.awst_build.eb.arc4 import ARC4StructClassExpressionBuilder from puya.awst_build.eb.base import ( BuilderBinaryOp, BuilderComparisonOp, ExpressionBuilder, + StateProxyDefinitionBuilder, + StateProxyMemberBuilder, TypeClassExpressionBuilder, ) from puya.awst_build.eb.bool import BoolClassExpressionBuilder @@ -324,42 +325,47 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> Sequence[Sta return [] rvalue = require_expression_builder(stmt.rvalue.accept(self)) # special no-op case - if isinstance(rvalue, AppAccountStateClassExpressionBuilder): - if len(stmt.lvalues) != 1: + if isinstance(rvalue, StateProxyDefinitionBuilder): + if self.contract_method_info is None: raise CodeError( - f"{constants.CLS_LOCAL_STATE_ALIAS}" - f" can only be assigned to a single member variable", - stmt_loc, + f"{rvalue.python_name} should only be used inside a contract class", stmt_loc ) - return [] - elif isinstance(rvalue, AppStateClassExpressionBuilder): if len(stmt.lvalues) != 1: raise CodeError( - f"{constants.CLS_GLOBAL_STATE_ALIAS}" - f" can only be assigned to a single member variable", + f"{rvalue.python_name} can only be assigned to a single member variable", stmt_loc, ) - if rvalue.initial_value is None: - return [] + # note: we don't use resolve_lvalue here, because + # these types shouldn't be a valid lvalue target in any other instance + # except initial assignment + (lvalue,) = stmt.lvalues + lvalue_builder = require_expression_builder(lvalue.accept(self)) + if not ( + isinstance(lvalue_builder, StateProxyMemberBuilder) + and rvalue.kind == lvalue_builder.state_decl.kind + and rvalue.storage == lvalue_builder.state_decl.storage_wtype + ): + raise CodeError("Incompatible types on assignment", stmt_loc) + defn = rvalue.build_definition( + lvalue_builder.state_decl.member_name, lvalue_builder.source_location + ) + self.context.state_defs[self.contract_method_info.cref].append(defn) + if defn.kind != AppStateKind.account_local: + raise InternalError("Don't know how to initialise local account storage", stmt_loc) else: - (lvalue,) = stmt.lvalues - app_state_eb = lvalue.accept(self) - if not isinstance(app_state_eb, AppStateExpressionBuilder): - raise CodeError( - f"Incompatible type on assignment," - f" expected a {constants.CLS_GLOBAL_STATE_ALIAS}", - app_state_eb.source_location, - ) + initial_value = rvalue.initial_value() + if initial_value is None: + return [] global_state_target = AppStateExpression( - field_name=app_state_eb.state_decl.member_name, - wtype=app_state_eb.state_decl.storage_wtype, - source_location=app_state_eb.source_location, + field_name=defn.member_name, + wtype=defn.storage_wtype, + source_location=defn.source_location, ) return [ AssignmentStatement( - source_location=stmt_loc, target=global_state_target, - value=rvalue.initial_value, + value=initial_value, + source_location=stmt_loc, ) ] else: diff --git a/test_cases/arc4_types/structs2.py b/test_cases/arc4_types/structs2.py index 3ba29b9a1a..bc0144ea4c 100644 --- a/test_cases/arc4_types/structs2.py +++ b/test_cases/arc4_types/structs2.py @@ -1,10 +1,10 @@ from puyapy import Contract, arc4, log + from test_cases.arc4_types.structs import Flags class Arc4StructsFromAnotherModule(Contract): def approval_program(self) -> bool: - flags = Flags(a=arc4.Bool(True), b=arc4.Bool(False), c=arc4.Bool(True), d=arc4.Bool(False)) log(flags.bytes) @@ -12,4 +12,3 @@ def approval_program(self) -> bool: def clear_state_program(self) -> bool: return True - From 1f2055bd1c042e2f06aa5493e68bc12944daffc7 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 13:52:25 +0800 Subject: [PATCH 13/40] wip --- src/puya/awst_build/context.py | 6 +++--- src/puya/awst_build/contract.py | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/puya/awst_build/context.py b/src/puya/awst_build/context.py index 580ba62c6b..76b1fe501f 100644 --- a/src/puya/awst_build/context.py +++ b/src/puya/awst_build/context.py @@ -25,9 +25,6 @@ class ASTConversionContext(CompileContext): constants: dict[str, ConstantValue] = attrs.field(factory=dict) type_map: dict[str, wtypes.WStructType | wtypes.ARC4Struct] = attrs.field(factory=dict) - state_defs: defaultdict[ContractReference, list[AppStateDefinition]] = attrs.field( - factory=lambda: defaultdict(list) - ) def for_module(self, current_module: mypy.nodes.MypyFile) -> "ASTConversionModuleContext": return attrs_extend(ASTConversionModuleContext, self, current_module=current_module) @@ -36,6 +33,9 @@ def for_module(self, current_module: mypy.nodes.MypyFile) -> "ASTConversionModul @attrs.frozen(kw_only=True) class ASTConversionModuleContext(ASTConversionContext): current_module: mypy.nodes.MypyFile + state_defs: defaultdict[ContractReference, list[AppStateDefinition]] = attrs.field( + factory=lambda: defaultdict(list) + ) @property def module_name(self) -> str: diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index 44dfe395de..e4d8b5cf05 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -61,7 +61,6 @@ def __init__( self._subroutines = list[ContractMethod]() self.app_state = _gather_app_state_recursive(context, class_def) - self._collected_app_state_definitions = dict[str, AppStateDefinition]() # note: we iterate directly and catch+log code errors here, # since each statement should be somewhat independent given # the constraints we place (e.g. if one function fails to convert, @@ -70,6 +69,11 @@ def __init__( with context.log_exceptions(fallback_location=stmt): stmt.accept(self) + collected_app_state_definitions = { + app_state_defn.member_name: app_state_defn + for app_state_defn in context.state_defs[self.cref] + } + self.result_ = ContractFragment( module_name=self.cref.module_name, name=self.cref.class_name, @@ -80,7 +84,7 @@ def __init__( approval_program=self._approval_program, clear_program=self._clear_program, subroutines=self._subroutines, - app_state=self._collected_app_state_definitions, + app_state=collected_app_state_definitions, docstring=docstring, source_location=self._location(class_def), reserved_scratch_space=class_options.scratch_slot_reservations, From 0b0e2242d3797bcb82732d303910096bca07ef63 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 13:56:20 +0800 Subject: [PATCH 14/40] wip --- examples/local_state/out/local_state_contract.awst | 10 +++++----- examples/local_state/out/local_state_with_offsets.awst | 10 +++++----- src/puya/awst/to_code_visitor.py | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/local_state/out/local_state_contract.awst b/examples/local_state/out/local_state_contract.awst index 78630b03a6..a690b01598 100644 --- a/examples/local_state/out/local_state_contract.awst +++ b/examples/local_state/out/local_state_contract.awst @@ -61,28 +61,28 @@ contract LocalStateContract subroutine get_guaranteed_data(for_account: puyapy.Account): puyapy.Bytes { - return this.locals['local'].account[for_account] + return this.local[for_account] } subroutine get_data_with_default(for_account: puyapy.Account, default: puyapy.Bytes): puyapy.Bytes { - return (tmp$0: tuple[puyapy.Bytes, bool] := app_local_get_ex(for_account, 0u, 'local')[1]) ? (tmp$0[0]) : (default) + return (tmp$0: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.local[for_account])[1]) ? (tmp$0[0]) : (default) } subroutine get_data_or_assert(for_account: puyapy.Account): puyapy.Bytes { - (result, exists): tuple[puyapy.Bytes, bool] = app_local_get_ex(for_account, 0u, 'local') + (result, exists): tuple[puyapy.Bytes, bool] = STATE_GET_EX(this.local[for_account]) assert(exists, comment="no data for account") return result } subroutine set_data(for_account: puyapy.Account, value: puyapy.Bytes): None { - this.locals['local'].account[for_account]: puyapy.Bytes = value + this.local[for_account]: puyapy.Bytes = value } subroutine delete_data(for_account: puyapy.Account): None { - app_local_del(for_account, 'local') + STATE_DELETE(this.local[for_account]) } } \ No newline at end of file diff --git a/examples/local_state/out/local_state_with_offsets.awst b/examples/local_state/out/local_state_with_offsets.awst index a4d2e240b1..6d94e18453 100644 --- a/examples/local_state/out/local_state_with_offsets.awst +++ b/examples/local_state/out/local_state_with_offsets.awst @@ -62,28 +62,28 @@ contract LocalStateContract subroutine get_guaranteed_data(for_account: puyapy.UInt64): puyapy.Bytes { - return this.locals['local'].account[for_account] + return this.local[for_account] } subroutine get_data_with_default(for_account: puyapy.UInt64, default: puyapy.Bytes): puyapy.Bytes { - return (tmp$0: tuple[puyapy.Bytes, bool] := app_local_get_ex(for_account, 0u, 'local')[1]) ? (tmp$0[0]) : (default) + return (tmp$0: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.local[for_account])[1]) ? (tmp$0[0]) : (default) } subroutine get_data_or_assert(for_account: puyapy.UInt64): puyapy.Bytes { - (result, exists): tuple[puyapy.Bytes, bool] = app_local_get_ex(for_account, 0u, 'local') + (result, exists): tuple[puyapy.Bytes, bool] = STATE_GET_EX(this.local[for_account]) assert(exists, comment="no data for account") return result } subroutine set_data(for_account: puyapy.UInt64, value: puyapy.Bytes): None { - this.locals['local'].account[for_account]: puyapy.Bytes = value + this.local[for_account]: puyapy.Bytes = value } subroutine delete_data(for_account: puyapy.UInt64): None { - app_local_del(for_account, 'local') + STATE_DELETE(this.local[for_account]) } } \ No newline at end of file diff --git a/src/puya/awst/to_code_visitor.py b/src/puya/awst/to_code_visitor.py index 4871330e89..665f74f5a2 100644 --- a/src/puya/awst/to_code_visitor.py +++ b/src/puya/awst/to_code_visitor.py @@ -76,10 +76,10 @@ def visit_temporary_variable(self, expr: nodes.TemporaryVariable) -> str: return f"tmp${self._tmp_index(expr)}" def visit_app_state_expression(self, expr: nodes.AppStateExpression) -> str: - return f"this.globals[{expr.field_name}]" + return f"this.{expr.field_name}" def visit_app_account_state_expression(self, expr: nodes.AppAccountStateExpression) -> str: - return f"this.locals[{expr.field_name}].account[{expr.account.accept(self)}]" + return f"this.{expr.field_name}[{expr.account.accept(self)}]" def visit_new_array(self, expr: nodes.NewArray) -> str: args = ", ".join(a.accept(self) for a in expr.elements) From 89d1cad719816828a5f9218b4310ccbdaafbd5c7 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 14:12:12 +0800 Subject: [PATCH 15/40] wip --- examples/global_state/out/contract.awst | 44 +++++------ src/puya/awst_build/contract.py | 24 ++++-- src/puya/awst_build/eb/app_account_state.py | 17 ++-- src/puya/awst_build/eb/app_state.py | 88 +++++++++++++++++---- src/puya/awst_build/eb/base.py | 6 +- src/puya/awst_build/subroutine.py | 15 ++-- 6 files changed, 133 insertions(+), 61 deletions(-) diff --git a/examples/global_state/out/contract.awst b/examples/global_state/out/contract.awst index ca3242d6d2..9bae6e9ca1 100644 --- a/examples/global_state/out/contract.awst +++ b/examples/global_state/out/contract.awst @@ -2,44 +2,44 @@ contract AppStateContract { globals { ['global_int_full']: puyapy.UInt64 - ['global_int_simplified']: puyapy.UInt64 ['global_int_no_default']: puyapy.UInt64 ['global_bytes_full']: puyapy.Bytes - ['global_bytes_simplified']: puyapy.Bytes ['global_bytes_no_default']: puyapy.Bytes + ['global_int_simplified']: puyapy.UInt64 + ['global_bytes_simplified']: puyapy.Bytes } constructor() { - this.globals['global_int_full']: puyapy.UInt64 = 55u - this.globals['global_int_simplified']: puyapy.UInt64 = 33u - this.globals['global_bytes_full']: puyapy.Bytes = 'Hello' - this.globals['global_bytes_simplified']: puyapy.Bytes = 'Hello' + this.global_int_full: puyapy.UInt64 = 55u + this.global_int_simplified: puyapy.UInt64 = 33u + this.global_bytes_full: puyapy.Bytes = 'Hello' + this.global_bytes_simplified: puyapy.Bytes = 'Hello' } approval_program(): bool { - assert(this.globals['global_int_simplified'] == 33u) - assert(app_global_get_ex(0u, 'global_int_full')[1]) - assert(this.globals['global_int_full'] == 55u) - assert(!(app_global_get_ex(0u, 'global_int_no_default')[1])) - this.globals['global_int_no_default']: puyapy.UInt64 = 44u - (i_value, i_exists): tuple[puyapy.UInt64, bool] = app_global_get_ex(0u, 'global_int_no_default') + assert(this.global_int_simplified == 33u) + assert(STATE_GET_EX(this.global_int_full)[1]) + assert(this.global_int_full == 55u) + assert(!(STATE_GET_EX(this.global_int_no_default)[1])) + this.global_int_no_default: puyapy.UInt64 = 44u + (i_value, i_exists): tuple[puyapy.UInt64, bool] = STATE_GET_EX(this.global_int_no_default) assert(i_exists) assert(i_value == 44u) - assert(this.globals['global_bytes_simplified'] == 'Hello') - assert(app_global_get_ex(0u, 'global_bytes_full')[1]) - assert(this.globals['global_bytes_full'] == 'Hello') - assert((tmp$0: tuple[puyapy.Bytes, bool] := app_global_get_ex(0u, 'global_bytes_full')[1]) ? (tmp$0[0]) : ('default') == 'Hello') - assert(!(app_global_get_ex(0u, 'global_bytes_no_default')[1])) - this.globals['global_bytes_no_default']: puyapy.Bytes = 'World' - (b_value, b_exists): tuple[puyapy.Bytes, bool] = app_global_get_ex(0u, 'global_bytes_no_default') + assert(this.global_bytes_simplified == 'Hello') + assert(STATE_GET_EX(this.global_bytes_full)[1]) + assert(this.global_bytes_full == 'Hello') + assert((tmp$0: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.global_bytes_full)[1]) ? (tmp$0[0]) : ('default') == 'Hello') + assert(!(STATE_GET_EX(this.global_bytes_no_default)[1])) + this.global_bytes_no_default: puyapy.Bytes = 'World' + (b_value, b_exists): tuple[puyapy.Bytes, bool] = STATE_GET_EX(this.global_bytes_no_default) assert(b_exists) assert(b_value == 'World') - app_global_del('global_bytes_no_default') - (b_value, b_exists): tuple[puyapy.Bytes, bool] = app_global_get_ex(0u, 'global_bytes_no_default') + STATE_DELETE(this.global_bytes_no_default) + (b_value, b_exists): tuple[puyapy.Bytes, bool] = STATE_GET_EX(this.global_bytes_no_default) assert(!(b_exists)) - assert((tmp$1: tuple[puyapy.Bytes, bool] := app_global_get_ex(0u, 'global_bytes_no_default')[1]) ? (tmp$1[0]) : ('default') == 'default') + assert((tmp$1: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.global_bytes_no_default)[1]) ? (tmp$1[0]) : ('default') == 'default') return true } diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index e4d8b5cf05..bda926c423 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -1,6 +1,6 @@ import typing from collections.abc import Iterator, Mapping -from typing import Never +from typing import Never, List import mypy.nodes import mypy.types @@ -11,11 +11,12 @@ from puya.arc4_util import wtype_to_arc4 from puya.awst import wtypes from puya.awst.nodes import ( - AppStateDefinition, AppStateKind, ContractFragment, ContractMethod, ContractReference, + AppStateDefinition, + BytesEncoding, ) from puya.awst_build import constants from puya.awst_build.base_mypy_visitor import BaseMyPyStatementVisitor @@ -59,7 +60,8 @@ def __init__( self._clear_program: ContractMethod | None = None self._init_method: ContractMethod | None = None self._subroutines = list[ContractMethod]() - self.app_state = _gather_app_state_recursive(context, class_def) + this_app_state = list(_gather_app_state(context, class_def.info)) + self.app_state = _gather_app_state_recursive(context, class_def, this_app_state) # note: we iterate directly and catch+log code errors here, # since each statement should be somewhat independent given @@ -73,6 +75,17 @@ def __init__( app_state_defn.member_name: app_state_defn for app_state_defn in context.state_defs[self.cref] } + for decl in this_app_state: + if decl.decl_type is AppStateDeclType.global_direct: + collected_app_state_definitions[decl.member_name] = AppStateDefinition( + member_name=decl.member_name, + storage_wtype=decl.storage_wtype, + key=decl.member_name.encode("utf8"), + key_encoding=BytesEncoding.utf8, + description=None, + source_location=decl.source_location, + kind=decl.kind, + ) self.result_ = ContractFragment( module_name=self.cref.module_name, @@ -657,9 +670,10 @@ def _gather_bases( def _gather_app_state_recursive( - context: ASTConversionModuleContext, class_def: mypy.nodes.ClassDef + context: ASTConversionModuleContext, + class_def: mypy.nodes.ClassDef, + this_app_state: list[AppStateDeclaration], ) -> dict[str, AppStateDeclaration]: - this_app_state = list(_gather_app_state(context, class_def.info)) combined_app_state = {defn.member_name: defn for defn in this_app_state} for base in iterate_user_bases(class_def.info): base_app_state = { diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index 02e0b7f517..962769a314 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -244,15 +244,15 @@ def call( match type_arg: case TypeClassExpressionBuilder() as typ_class_eb: storage_wtype = typ_class_eb.produces() - if self._storage is not None and self._storage != storage_wtype: - raise CodeError( - "App account state explicit type annotation does not match first argument" - " - suggest to remove the explicit type annotation," - " it shouldn't be required", - location, - ) case _: raise CodeError("First argument must be a type reference", location) + if self._storage is not None and self._storage != storage_wtype: + raise CodeError( + "App account state explicit type annotation does not match first argument" + " - suggest to remove the explicit type annotation," + " it shouldn't be required", + location, + ) match key_arg: case None: @@ -289,6 +289,3 @@ def call( class AppAccountStateProxyDefinitionBuilder(StateProxyDefinitionBuilder): kind = AppStateKind.account_local python_name = constants.CLS_LOCAL_STATE_ALIAS - - def initial_value(self) -> Expression | None: - return None diff --git a/src/puya/awst_build/eb/app_state.py b/src/puya/awst_build/eb/app_state.py index 064eb31cc2..8e02047559 100644 --- a/src/puya/awst_build/eb/app_state.py +++ b/src/puya/awst_build/eb/app_state.py @@ -3,10 +3,11 @@ import mypy.nodes import mypy.types -from puya.awst import wtypes # noqa: TCH001 +from puya.awst import wtypes from puya.awst.nodes import ( AppStateExpression, AppStateKind, + BytesEncoding, ConditionalExpression, Expression, Literal, @@ -21,11 +22,17 @@ from puya.awst_build.eb.base import ( ExpressionBuilder, IntermediateExpressionBuilder, + StateProxyDefinitionBuilder, + StateProxyMemberBuilder, TypeClassExpressionBuilder, ) from puya.awst_build.eb.value_proxy import ValueProxyExpressionBuilder from puya.awst_build.eb.var_factory import var_expression -from puya.awst_build.utils import create_temporary_assignment, expect_operand_wtype +from puya.awst_build.utils import ( + create_temporary_assignment, + expect_operand_wtype, + get_arg_mapping, +) from puya.errors import CodeError, InternalError from puya.parse import SourceLocation @@ -70,29 +77,82 @@ def call( location: SourceLocation, original_expr: mypy.nodes.CallExpr, ) -> ExpressionBuilder: - call_expr_loc = location - match args: - case [TypeClassExpressionBuilder() as typ_class_eb]: + type_or_value_arg_name = "type_or_initial_value" + arg_mapping = get_arg_mapping( + positional_arg_names=[type_or_value_arg_name], + args=zip(arg_names, args, strict=True), + location=location, + ) + try: + first_arg = arg_mapping.pop(type_or_value_arg_name) + except KeyError as ex: + raise CodeError("Required positional argument missing", location) from ex + + key_arg = arg_mapping.pop("key", None) + descr_arg = arg_mapping.pop("description", None) + if arg_mapping: + raise CodeError( + f"Unrecognised keyword argument(s): {", ".join(arg_mapping)}", location + ) + + match first_arg: + case TypeClassExpressionBuilder() as typ_class_eb: storage_wtype = typ_class_eb.produces() - self._initial_value = None - case [ExpressionBuilder() as value_eb]: - self._initial_value = value_eb.rvalue() - storage_wtype = self._initial_value.wtype + initial_value = None + case ExpressionBuilder(value_type=wtypes.WType() as storage_wtype) as value_eb: + initial_value = value_eb.rvalue() case _: - raise CodeError("expected a single argument with storage type", call_expr_loc) + raise CodeError( + "First argument must be a type reference or an initial value", location + ) if self._storage is not None and self._storage != storage_wtype: raise CodeError( f"{constants.CLS_GLOBAL_STATE_ALIAS} explicit type annotation" f" does not match first argument - suggest to remove the explicit type annotation," " it shouldn't be required", - call_expr_loc, + location, ) - self._storage = storage_wtype - return self + + match key_arg: + case None: + key = None + key_encoding = None + case Literal(value=bytes(bytes_value)): + key = bytes_value + key_encoding = BytesEncoding.base16 # TODO: maybe we need an "unknown" encoding? + case Literal(value=str(str_value)): + key = str_value.encode("utf8") + key_encoding = BytesEncoding.utf8 + case _: + raise CodeError("key should be a string or bytes literal", key_arg.source_location) + + match descr_arg: + case None: + description = None + case Literal(value=str(str_value)): + description = str_value + case _: + raise CodeError( + "description should be a string literal", descr_arg.source_location + ) + + return AppStateProxyDefinitionBuilder( + location=location, + storage=storage_wtype, + key=key, + key_encoding=key_encoding, + description=description, + initial_value=initial_value, + ) + + +class AppStateProxyDefinitionBuilder(StateProxyDefinitionBuilder): + kind = AppStateKind.app_global + python_name = constants.CLS_GLOBAL_STATE_ALIAS -class AppStateExpressionBuilder(IntermediateExpressionBuilder): +class AppStateExpressionBuilder(StateProxyMemberBuilder): def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation) -> None: self.state_decl = state_decl super().__init__(location) diff --git a/src/puya/awst_build/eb/base.py b/src/puya/awst_build/eb/base.py index 3473d01c35..9a914ce1dc 100644 --- a/src/puya/awst_build/eb/base.py +++ b/src/puya/awst_build/eb/base.py @@ -249,6 +249,7 @@ def __init__( key: bytes | None, key_encoding: BytesEncoding | None, description: str | None, + initial_value: Expression | None = None, ): super().__init__(location) if (key is None) != (key_encoding is None): @@ -259,10 +260,7 @@ def __init__( self.key = key self.key_encoding = key_encoding self.description = description - - @abc.abstractmethod - def initial_value(self) -> Expression | None: - ... + self.initial_value = initial_value def build_definition(self, member_name: str, location: SourceLocation) -> AppStateDefinition: return AppStateDefinition( diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index b07a8ca3e0..da65bf6942 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -350,12 +350,15 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> Sequence[Sta lvalue_builder.state_decl.member_name, lvalue_builder.source_location ) self.context.state_defs[self.contract_method_info.cref].append(defn) - if defn.kind != AppStateKind.account_local: - raise InternalError("Don't know how to initialise local account storage", stmt_loc) + if rvalue.initial_value is None: + return [] + elif defn.kind != AppStateKind.app_global: + raise InternalError( + f"Don't know how to do initialise-on-declaration" + f" for storage of kind {defn.kind}", + stmt_loc, + ) else: - initial_value = rvalue.initial_value() - if initial_value is None: - return [] global_state_target = AppStateExpression( field_name=defn.member_name, wtype=defn.storage_wtype, @@ -364,7 +367,7 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> Sequence[Sta return [ AssignmentStatement( target=global_state_target, - value=initial_value, + value=rvalue.initial_value, source_location=stmt_loc, ) ] From 28bf03010d31df9880c3f2011d558932833c48c6 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 14:14:26 +0800 Subject: [PATCH 16/40] re-run compile-all --- examples/amm/out/contract.awst | 76 +++++++++---------- examples/auction/out/contract.awst | 44 +++++------ examples/sizes.txt | 1 + examples/voting/out/voting.awst | 50 ++++++------ src/puya/awst/nodes.py | 4 +- test_cases/abi_routing/out/contract.awst | 16 ++-- test_cases/application/out/contract.awst | 6 +- ...c4StructsFromAnotherModule.destructured.ir | 2 +- .../out/Arc4StructsFromAnotherModule.ssa.ir | 2 +- ...StructsFromAnotherModule.ssa.opt_pass_1.ir | 2 +- ...StructsFromAnotherModule.ssa.opt_pass_2.ir | 2 +- ...StructsFromAnotherModule.ssa.opt_pass_3.ir | 2 +- ...StructsFromAnotherModule.ssa.opt_pass_4.ir | 2 +- ...StructsFromAnotherModule.ssa.opt_pass_5.ir | 2 +- ...c4StructsFromAnotherModule.destructured.ir | 2 +- ...c4StructsFromAnotherModule.destructured.ir | 2 +- test_cases/arc4_types/puya.log | 4 +- test_cases/asset/out/contract.awst | 8 +- .../augmented_assignment/out/contract.awst | 16 ++-- .../chained_assignment/out/contract.awst | 4 +- .../conditional_execution/out/contract.awst | 26 +++---- test_cases/everything/out/contract.awst | 12 +-- test_cases/everything/out/my_base.awst | 2 +- test_cases/inner_transactions/out/c2c.awst | 10 +-- .../inner_transactions/out/contract.awst | 10 +-- test_cases/match/out/contract.awst | 8 +- test_cases/simplish/out/base_class.awst | 6 +- test_cases/simplish/out/contract.awst | 2 +- .../tuple_support/out/tuple_support.awst | 4 +- 29 files changed, 165 insertions(+), 162 deletions(-) diff --git a/examples/amm/out/contract.awst b/examples/amm/out/contract.awst index 657ec8ba09..90dcfe269e 100644 --- a/examples/amm/out/contract.awst +++ b/examples/amm/out/contract.awst @@ -15,90 +15,90 @@ contract ConstantProductAMM constructor() { - this.globals['asset_a']: puyapy.Asset = reinterpret_cast(0u) - this.globals['asset_b']: puyapy.Asset = reinterpret_cast(0u) - this.globals['governor']: puyapy.Account = txn() - this.globals['pool_token']: puyapy.Asset = reinterpret_cast(0u) - this.globals['ratio']: puyapy.UInt64 = 0u + this.asset_a: puyapy.Asset = reinterpret_cast(0u) + this.asset_b: puyapy.Asset = reinterpret_cast(0u) + this.governor: puyapy.Account = txn() + this.pool_token: puyapy.Asset = reinterpret_cast(0u) + this.ratio: puyapy.UInt64 = 0u } abimethod set_governor(new_governor: puyapy.Account): None { this::_check_is_governor() - this.globals['governor']: puyapy.Account = new_governor + this.governor: puyapy.Account = new_governor } abimethod bootstrap(seed: puyapy.gtxn.PaymentTransaction, a_asset: puyapy.Asset, b_asset: puyapy.Asset): puyapy.arc4.UIntN[typing.Literal[64]] { - assert(!(reinterpret_cast(this.globals['pool_token'])), comment="application has already been bootstrapped") + assert(!(reinterpret_cast(this.pool_token)), comment="application has already been bootstrapped") this::_check_is_governor() assert(global() == 2u, comment="group size not 2") assert(gtxns(seed) == global(), comment="receiver not app address") assert(gtxns(seed) >= 300000u, comment="amount minimum not met") assert(reinterpret_cast(a_asset) < reinterpret_cast(b_asset), comment="asset a must be less than asset b") - this.globals['asset_a']: puyapy.Asset = a_asset - this.globals['asset_b']: puyapy.Asset = b_asset - this.globals['pool_token']: puyapy.Asset = this::_create_pool_token() - this::_do_opt_in(this.globals['asset_a']) - this::_do_opt_in(this.globals['asset_b']) - return arc4_encode(reinterpret_cast(this.globals['pool_token']), puyapy.arc4.UIntN[typing.Literal[64]]) + this.asset_a: puyapy.Asset = a_asset + this.asset_b: puyapy.Asset = b_asset + this.pool_token: puyapy.Asset = this::_create_pool_token() + this::_do_opt_in(this.asset_a) + this::_do_opt_in(this.asset_b) + return arc4_encode(reinterpret_cast(this.pool_token), puyapy.arc4.UIntN[typing.Literal[64]]) } abimethod mint(a_xfer: puyapy.gtxn.AssetTransferTransaction, b_xfer: puyapy.gtxn.AssetTransferTransaction, pool_asset: puyapy.Asset, a_asset: puyapy.Asset, b_asset: puyapy.Asset): None { this::_check_bootstrapped() - assert(pool_asset == this.globals['pool_token'], comment="asset pool incorrect") - assert(a_asset == this.globals['asset_a'], comment="asset a incorrect") - assert(b_asset == this.globals['asset_b'], comment="asset b incorrect") + assert(pool_asset == this.pool_token, comment="asset pool incorrect") + assert(a_asset == this.asset_a, comment="asset a incorrect") + assert(b_asset == this.asset_b, comment="asset b incorrect") assert(gtxns(a_xfer) == txn(), comment="sender invalid") assert(gtxns(b_xfer) == txn(), comment="sender invalid") assert(gtxns(a_xfer) == global(), comment="receiver not app address") - assert(gtxns(a_xfer) == this.globals['asset_a'], comment="asset a incorrect") + assert(gtxns(a_xfer) == this.asset_a, comment="asset a incorrect") assert(gtxns(a_xfer) > 0u, comment="amount minimum not met") assert(gtxns(b_xfer) == global(), comment="receiver not app address") - assert(gtxns(b_xfer) == this.globals['asset_b'], comment="asset b incorrect") + assert(gtxns(b_xfer) == this.asset_b, comment="asset b incorrect") assert(gtxns(b_xfer) > 0u, comment="amount minimum not met") to_mint: puyapy.UInt64 = examples.amm.contract::tokens_to_mint(pool_balance=this::_current_pool_balance(), a_balance=this::_current_a_balance(), b_balance=this::_current_b_balance(), a_amount=gtxns(a_xfer), b_amount=gtxns(b_xfer)) assert(to_mint > 0u, comment="send amount too low") - examples.amm.contract::do_asset_transfer(receiver=txn(), asset=this.globals['pool_token'], amount=to_mint) + examples.amm.contract::do_asset_transfer(receiver=txn(), asset=this.pool_token, amount=to_mint) this::_update_ratio() } abimethod burn(pool_xfer: puyapy.gtxn.AssetTransferTransaction, pool_asset: puyapy.Asset, a_asset: puyapy.Asset, b_asset: puyapy.Asset): None { this::_check_bootstrapped() - assert(pool_asset == this.globals['pool_token'], comment="asset pool incorrect") - assert(a_asset == this.globals['asset_a'], comment="asset a incorrect") - assert(b_asset == this.globals['asset_b'], comment="asset b incorrect") + assert(pool_asset == this.pool_token, comment="asset pool incorrect") + assert(a_asset == this.asset_a, comment="asset a incorrect") + assert(b_asset == this.asset_b, comment="asset b incorrect") assert(gtxns(pool_xfer) == global(), comment="receiver not app address") assert(gtxns(pool_xfer) > 0u, comment="amount minimum not met") - assert(gtxns(pool_xfer) == this.globals['pool_token'], comment="asset pool incorrect") + assert(gtxns(pool_xfer) == this.pool_token, comment="asset pool incorrect") assert(gtxns(pool_xfer) == txn(), comment="sender invalid") pool_balance: puyapy.UInt64 = this::_current_pool_balance() a_amt: puyapy.UInt64 = examples.amm.contract::tokens_to_burn(pool_balance=pool_balance, supply=this::_current_a_balance(), amount=gtxns(pool_xfer)) b_amt: puyapy.UInt64 = examples.amm.contract::tokens_to_burn(pool_balance=pool_balance, supply=this::_current_b_balance(), amount=gtxns(pool_xfer)) - examples.amm.contract::do_asset_transfer(receiver=txn(), asset=this.globals['asset_a'], amount=a_amt) - examples.amm.contract::do_asset_transfer(receiver=txn(), asset=this.globals['asset_b'], amount=b_amt) + examples.amm.contract::do_asset_transfer(receiver=txn(), asset=this.asset_a, amount=a_amt) + examples.amm.contract::do_asset_transfer(receiver=txn(), asset=this.asset_b, amount=b_amt) this::_update_ratio() } abimethod swap(swap_xfer: puyapy.gtxn.AssetTransferTransaction, a_asset: puyapy.Asset, b_asset: puyapy.Asset): None { this::_check_bootstrapped() - assert(a_asset == this.globals['asset_a'], comment="asset a incorrect") - assert(b_asset == this.globals['asset_b'], comment="asset b incorrect") + assert(a_asset == this.asset_a, comment="asset a incorrect") + assert(b_asset == this.asset_b, comment="asset b incorrect") assert(gtxns(swap_xfer) > 0u, comment="amount minimum not met") assert(gtxns(swap_xfer) == txn(), comment="sender invalid") switch (tmp$0: puyapy.Asset := gtxns(swap_xfer)) { - case this.globals['asset_a']: { + case this.asset_a: { in_supply: puyapy.UInt64 = this::_current_b_balance() out_supply: puyapy.UInt64 = this::_current_a_balance() - out_asset: puyapy.Asset = this.globals['asset_a'] + out_asset: puyapy.Asset = this.asset_a } - case this.globals['asset_b']: { + case this.asset_b: { in_supply: puyapy.UInt64 = this::_current_a_balance() out_supply: puyapy.UInt64 = this::_current_b_balance() - out_asset: puyapy.Asset = this.globals['asset_b'] + out_asset: puyapy.Asset = this.asset_b } case _: { assert(false, comment="asset id incorrect") @@ -112,24 +112,24 @@ contract ConstantProductAMM subroutine _check_bootstrapped(): None { - assert(reinterpret_cast(this.globals['pool_token']), comment="bootstrap method needs to be called first") + assert(reinterpret_cast(this.pool_token), comment="bootstrap method needs to be called first") } subroutine _update_ratio(): None { a_balance: puyapy.UInt64 = this::_current_a_balance() b_balance: puyapy.UInt64 = this::_current_b_balance() - this.globals['ratio']: puyapy.UInt64 = a_balance * 1000u // b_balance + this.ratio: puyapy.UInt64 = a_balance * 1000u // b_balance } subroutine _check_is_governor(): None { - assert(txn() == this.globals['governor'], comment="Only the account set in global_state.governor may call this method") + assert(txn() == this.governor, comment="Only the account set in global_state.governor may call this method") } subroutine _create_pool_token(): puyapy.Asset { - return submit_txn(create_inner_transaction(TypeEnum=acfg, ConfigAssetName='DPT-' + checked_maybe(asset_params_get(this.globals['asset_a'])) + '-' + checked_maybe(asset_params_get(this.globals['asset_b'])), ConfigAssetUnitName='dbt', ConfigAssetTotal=10000000000u, ConfigAssetDecimals=3u, ConfigAssetManager=global(), ConfigAssetReserve=global(), Fee=0u)).CreatedAssetID + return submit_txn(create_inner_transaction(TypeEnum=acfg, ConfigAssetName='DPT-' + checked_maybe(asset_params_get(this.asset_a)) + '-' + checked_maybe(asset_params_get(this.asset_b)), ConfigAssetUnitName='dbt', ConfigAssetTotal=10000000000u, ConfigAssetDecimals=3u, ConfigAssetManager=global(), ConfigAssetReserve=global(), Fee=0u)).CreatedAssetID } subroutine _do_opt_in(asset: puyapy.Asset): None @@ -139,17 +139,17 @@ contract ConstantProductAMM subroutine _current_pool_balance(): puyapy.UInt64 { - return checked_maybe(asset_holding_get(global(), this.globals['pool_token'])) + return checked_maybe(asset_holding_get(global(), this.pool_token)) } subroutine _current_a_balance(): puyapy.UInt64 { - return checked_maybe(asset_holding_get(global(), this.globals['asset_a'])) + return checked_maybe(asset_holding_get(global(), this.asset_a)) } subroutine _current_b_balance(): puyapy.UInt64 { - return checked_maybe(asset_holding_get(global(), this.globals['asset_b'])) + return checked_maybe(asset_holding_get(global(), this.asset_b)) } } diff --git a/examples/auction/out/contract.awst b/examples/auction/out/contract.awst index 4468ae24ad..1b008fa139 100644 --- a/examples/auction/out/contract.awst +++ b/examples/auction/out/contract.awst @@ -13,11 +13,11 @@ contract Auction constructor() { - this.globals['auction_end']: puyapy.UInt64 = 0u - this.globals['previous_bid']: puyapy.UInt64 = 0u - this.globals['asa_amount']: puyapy.UInt64 = 0u - this.globals['asa']: puyapy.Asset = reinterpret_cast(0u) - this.globals['previous_bidder']: puyapy.Account = global() + this.auction_end: puyapy.UInt64 = 0u + this.previous_bid: puyapy.UInt64 = 0u + this.asa_amount: puyapy.UInt64 = 0u + this.asa: puyapy.Asset = reinterpret_cast(0u) + this.previous_bidder: puyapy.Account = global() } clear_state_program(): bool @@ -28,19 +28,19 @@ contract Auction abimethod opt_into_asset(asset: puyapy.Asset): None { assert(txn() == global(), comment="Only creator can opt in to ASA") - assert(reinterpret_cast(this.globals['asa']) == 0u, comment="ASA already opted in") - this.globals['asa']: puyapy.Asset = asset + assert(reinterpret_cast(this.asa) == 0u, comment="ASA already opted in") + this.asa: puyapy.Asset = asset submit_txn(create_inner_transaction(TypeEnum=axfer, AssetReceiver=global(), XferAsset=asset, Fee=0u)) } abimethod start_auction(starting_price: puyapy.arc4.UIntN[typing.Literal[64]], length: puyapy.arc4.UIntN[typing.Literal[64]], axfer: puyapy.gtxn.AssetTransferTransaction): None { assert(txn() == global(), comment="auction must be started by creator") - assert(this.globals['auction_end'] == 0u, comment="auction already started") + assert(this.auction_end == 0u, comment="auction already started") assert(gtxns(axfer) == global(), comment="axfer must transfer to this app") - this.globals['asa_amount']: puyapy.UInt64 = gtxns(axfer) - this.globals['auction_end']: puyapy.UInt64 = global() + arc4_decode(length, puyapy.UInt64) - this.globals['previous_bid']: puyapy.UInt64 = arc4_decode(starting_price, puyapy.UInt64) + this.asa_amount: puyapy.UInt64 = gtxns(axfer) + this.auction_end: puyapy.UInt64 = global() + arc4_decode(length, puyapy.UInt64) + this.previous_bid: puyapy.UInt64 = arc4_decode(starting_price, puyapy.UInt64) } abimethod opt_in(): None @@ -49,29 +49,29 @@ contract Auction abimethod bid(pay: puyapy.gtxn.PaymentTransaction): None { - assert(global() < this.globals['auction_end'], comment="auction has ended") + assert(global() < this.auction_end, comment="auction has ended") assert(gtxns(pay) == txn(), comment="payment sender must match transaction sender") - assert(gtxns(pay) > this.globals['previous_bid'], comment="Bid must be higher than previous bid") - this.globals['previous_bid']: puyapy.UInt64 = gtxns(pay) - this.globals['previous_bidder']: puyapy.Account = gtxns(pay) - this.locals['claimable_amount'].account[txn()]: puyapy.UInt64 = gtxns(pay) + assert(gtxns(pay) > this.previous_bid, comment="Bid must be higher than previous bid") + this.previous_bid: puyapy.UInt64 = gtxns(pay) + this.previous_bidder: puyapy.Account = gtxns(pay) + this.claimable_amount[txn()]: puyapy.UInt64 = gtxns(pay) } abimethod claim_bids(): None { - original_amount: puyapy.UInt64 = tmp$0: puyapy.UInt64 := this.locals['claimable_amount'].account[txn()] + original_amount: puyapy.UInt64 = tmp$0: puyapy.UInt64 := this.claimable_amount[txn()] amount: puyapy.UInt64 = tmp$0 - if (txn() == this.globals['previous_bidder']) { - amount -= this.globals['previous_bid'] + if (txn() == this.previous_bidder) { + amount -= this.previous_bid } submit_txn(create_inner_transaction(TypeEnum=pay, Fee=0u, Amount=amount, Receiver=txn())) - this.locals['claimable_amount'].account[txn()]: puyapy.UInt64 = original_amount - amount + this.claimable_amount[txn()]: puyapy.UInt64 = original_amount - amount } abimethod claim_asset(asset: puyapy.Asset): None { - assert(global() > this.globals['auction_end'], comment="auction has not ended") - submit_txn(create_inner_transaction(TypeEnum=axfer, Fee=0u, XferAsset=asset, AssetCloseTo=this.globals['previous_bidder'], AssetReceiver=this.globals['previous_bidder'], AssetAmount=this.globals['asa_amount'])) + assert(global() > this.auction_end, comment="auction has not ended") + submit_txn(create_inner_transaction(TypeEnum=axfer, Fee=0u, XferAsset=asset, AssetCloseTo=this.previous_bidder, AssetReceiver=this.previous_bidder, AssetAmount=this.asa_amount)) } subroutine delete_application(): None diff --git a/examples/sizes.txt b/examples/sizes.txt index 0b35cbf393..d606112f0b 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -9,6 +9,7 @@ arc4_types/Arc4Mutation 2803 1663 1662 arc4_types/Arc4NumericTypes 364 218 218 arc4_types/Arc4RefTypes 47 43 43 arc4_types/Arc4StringTypes 336 245 245 +arc4_types/Arc4StructsFromAnotherModule 67 12 12 arc4_types/Arc4StructsType 283 225 225 arc4_types/Arc4TuplesType 799 207 207 asset/Reference 259 252 252 diff --git a/examples/voting/out/voting.awst b/examples/voting/out/voting.awst index 1035e18472..e000348763 100644 --- a/examples/voting/out/voting.awst +++ b/examples/voting/out/voting.awst @@ -15,9 +15,9 @@ struct VotingPreconditions { contract VotingRoundApp { globals { + ['close_time']: puyapy.UInt64 ['is_bootstrapped']: bool ['voter_count']: puyapy.UInt64 - ['close_time']: puyapy.UInt64 ['vote_id']: puyapy.Bytes ['snapshot_public_key']: puyapy.Bytes ['metadata_ipfs_cid']: puyapy.Bytes @@ -32,30 +32,30 @@ contract VotingRoundApp constructor() { - this.globals['is_bootstrapped']: bool = false - this.globals['voter_count']: puyapy.UInt64 = 0u + this.is_bootstrapped: bool = false + this.voter_count: puyapy.UInt64 = 0u } abimethod create(vote_id: puyapy.arc4.String, snapshot_public_key: puyapy.Bytes, metadata_ipfs_cid: puyapy.arc4.String, start_time: puyapy.UInt64, end_time: puyapy.UInt64, option_counts: puyapy.arc4.DynamicArray[puyapy.arc4.UIntN[typing.Literal[8]]], quorum: puyapy.UInt64, nft_image_url: puyapy.arc4.String): None { assert(start_time < end_time, comment="End time should be after start time") assert(end_time >= global(), comment="End time should be in the future") - this.globals['vote_id']: puyapy.Bytes = arc4_decode(vote_id, puyapy.Bytes) - this.globals['snapshot_public_key']: puyapy.Bytes = snapshot_public_key - this.globals['metadata_ipfs_cid']: puyapy.Bytes = arc4_decode(metadata_ipfs_cid, puyapy.Bytes) - this.globals['start_time']: puyapy.UInt64 = start_time - this.globals['end_time']: puyapy.UInt64 = end_time - this.globals['quorum']: puyapy.UInt64 = quorum - this.globals['nft_image_url']: puyapy.Bytes = arc4_decode(nft_image_url, puyapy.Bytes) + this.vote_id: puyapy.Bytes = arc4_decode(vote_id, puyapy.Bytes) + this.snapshot_public_key: puyapy.Bytes = snapshot_public_key + this.metadata_ipfs_cid: puyapy.Bytes = arc4_decode(metadata_ipfs_cid, puyapy.Bytes) + this.start_time: puyapy.UInt64 = start_time + this.end_time: puyapy.UInt64 = end_time + this.quorum: puyapy.UInt64 = quorum + this.nft_image_url: puyapy.Bytes = arc4_decode(nft_image_url, puyapy.Bytes) this::store_option_counts(option_counts.copy()) } abimethod bootstrap(fund_min_bal_req: puyapy.gtxn.PaymentTransaction): None { - assert(!(this.globals['is_bootstrapped']), comment="Must not be already bootstrapped") - this.globals['is_bootstrapped']: bool = true + assert(!(this.is_bootstrapped), comment="Must not be already bootstrapped") + this.is_bootstrapped: bool = true assert(gtxns(fund_min_bal_req) == global(), comment="Payment must be to app address") - tally_box_size: puyapy.UInt64 = this.globals['total_options'] * 8u + tally_box_size: puyapy.UInt64 = this.total_options * 8u min_balance_req: puyapy.UInt64 = 203900u + tally_box_size * 400u log(itob(min_balance_req)) assert(gtxns(fund_min_bal_req) == min_balance_req, comment="Payment must be for the exact min balance requirement") @@ -65,11 +65,11 @@ contract VotingRoundApp abimethod close(): None { puyapy::ensure_budget(required_budget=20000u, fee_source=0u) - assert(!(app_global_get_ex(0u, 'close_time')[1]), comment="Already closed") - this.globals['close_time']: puyapy.UInt64 = global() - note: puyapy.Bytes = '{"standard":"arc69","description":"This is a voting result NFT for voting round with ID ' + this.globals['vote_id'] + '.","properties":{"metadata":"ipfs://' + this.globals['metadata_ipfs_cid'] + '","id":"' + this.globals['vote_id'] + '","quorum":' + examples.voting.voting::itoa(this.globals['quorum']) + ',"voterCount":' + examples.voting.voting::itoa(this.globals['voter_count']) + ',"tallies":[' + assert(!(STATE_GET_EX(this.close_time)[1]), comment="Already closed") + this.close_time: puyapy.UInt64 = global() + note: puyapy.Bytes = '{"standard":"arc69","description":"This is a voting result NFT for voting round with ID ' + this.vote_id + '.","properties":{"metadata":"ipfs://' + this.metadata_ipfs_cid + '","id":"' + this.vote_id + '","quorum":' + examples.voting.voting::itoa(this.quorum) + ',"voterCount":' + examples.voting.voting::itoa(this.voter_count) + ',"tallies":[' current_index: puyapy.UInt64 = 0u - for (question_index, question_options_arc) in enumerate(this.globals['option_counts']) { + for (question_index, question_options_arc) in enumerate(this.option_counts) { if (question_index > 0u) { note += ',' } @@ -88,7 +88,7 @@ contract VotingRoundApp } } note += ']}}' - this.globals['nft_asset_id']: puyapy.UInt64 = reinterpret_cast(submit_txn(create_inner_transaction(TypeEnum=acfg, ConfigAssetTotal=1u, ConfigAssetDecimals=0u, ConfigAssetDefaultFrozen=false, ConfigAssetName='[VOTE RESULT] ' + this.globals['vote_id'], ConfigAssetUnitName='VOTERSLT', ConfigAssetURL=this.globals['nft_image_url'], Note=note)).CreatedAssetID) + this.nft_asset_id: puyapy.UInt64 = reinterpret_cast(submit_txn(create_inner_transaction(TypeEnum=acfg, ConfigAssetTotal=1u, ConfigAssetDecimals=0u, ConfigAssetDefaultFrozen=false, ConfigAssetName='[VOTE RESULT] ' + this.vote_id, ConfigAssetUnitName='VOTERSLT', ConfigAssetURL=this.nft_image_url, Note=note)).CreatedAssetID) } abimethod get_preconditions(signature: puyapy.arc4.DynamicArray[puyapy.arc4.UIntN[typing.Literal[8]]]): examples.voting.voting.VotingPreconditions @@ -102,7 +102,7 @@ contract VotingRoundApp assert(this::allowed_to_vote(signature), comment="Not allowed to vote") assert(this::voting_open(), comment="Voting not open") assert(!(this::already_voted()), comment="Already voted") - questions_count: puyapy.UInt64 = extract_uint16(this.globals['option_counts'], 0u) + questions_count: puyapy.UInt64 = extract_uint16(this.option_counts, 0u) assert(extract_uint16(answer_ids, 0u) == questions_count, comment="Number of answers incorrect") min_bal_req: puyapy.UInt64 = 2500u + 34u + 1u * extract_uint16(answer_ids, 0u) * 400u assert(gtxns(fund_min_bal_req) == global(), comment="Payment must be to app address") @@ -111,18 +111,18 @@ contract VotingRoundApp cumulative_offset: puyapy.UInt64 = 0u for question_index in range(0u, questions_count, 1u) { answer_option_index: puyapy.UInt64 = arc4_decode(answer_ids[question_index], puyapy.UInt64) - options_count: puyapy.UInt64 = arc4_decode(this.globals['option_counts'][question_index], puyapy.UInt64) + options_count: puyapy.UInt64 = arc4_decode(this.option_counts[question_index], puyapy.UInt64) assert(answer_option_index < options_count, comment="Answer option index invalid") examples.voting.voting::increment_vote_in_box(cumulative_offset + answer_option_index) cumulative_offset += options_count box_put(reinterpret_cast(txn()), reinterpret_cast(answer_ids)) - this.globals['voter_count'] += 1u + this.voter_count += 1u } } subroutine voting_open(): bool { - return this.globals['is_bootstrapped'] and !(app_global_get_ex(0u, 'close_time')[1]) and this.globals['start_time'] <= tmp$1: puyapy.UInt64 := global() and tmp$1 <= this.globals['end_time'] + return this.is_bootstrapped and !(STATE_GET_EX(this.close_time)[1]) and this.start_time <= tmp$1: puyapy.UInt64 := global() and tmp$1 <= this.end_time } subroutine already_voted(): bool @@ -140,14 +140,14 @@ contract VotingRoundApp total_options += arc4_decode(item, puyapy.UInt64) } assert(total_options <= 128u, comment="Can't have more than 128 vote options") - this.globals['option_counts']: puyapy.arc4.DynamicArray[puyapy.arc4.UIntN[typing.Literal[8]]] = option_counts.copy() - this.globals['total_options']: puyapy.UInt64 = total_options + this.option_counts: puyapy.arc4.DynamicArray[puyapy.arc4.UIntN[typing.Literal[8]]] = option_counts.copy() + this.total_options: puyapy.UInt64 = total_options } subroutine allowed_to_vote(signature: puyapy.Bytes): bool { puyapy::ensure_budget(required_budget=2000u, fee_source=2u) - return ed25519verify_bare(reinterpret_cast(txn()), signature, this.globals['snapshot_public_key']) + return ed25519verify_bare(reinterpret_cast(txn()), signature, this.snapshot_public_key) } } diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index f49d01a470..44c6b50ea0 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -681,7 +681,9 @@ class TxnFields: @classmethod @functools.cache def all_fields(cls) -> Sequence[TxnField]: - values = vars(cls).values() + # values = vars(cls).values() + names = dir(cls) + values = [getattr(cls, name) for name in names] return tuple(v for v in values if isinstance(v, TxnField)) @classmethod diff --git a/test_cases/abi_routing/out/contract.awst b/test_cases/abi_routing/out/contract.awst index 691341281e..c130e08534 100644 --- a/test_cases/abi_routing/out/contract.awst +++ b/test_cases/abi_routing/out/contract.awst @@ -10,11 +10,11 @@ contract Reference constructor() { - this.globals['asa']: puyapy.Asset = reinterpret_cast(123u) - this.globals['an_int']: puyapy.UInt64 = 2u - this.globals['some_bytes']: puyapy.arc4.StaticArray[puyapy.arc4.UIntN[typing.Literal[8]], typing.Literal[3]] = arc4_array_encode([7arc4u8, 8arc4u8, 9arc4u8], puyapy.arc4.StaticArray[puyapy.arc4.UIntN[typing.Literal[8]], typing.Literal[3]]) - this.globals['creator']: puyapy.Account = txn() - this.globals['app']: puyapy.Application = reinterpret_cast(123u) + this.asa: puyapy.Asset = reinterpret_cast(123u) + this.an_int: puyapy.UInt64 = 2u + this.some_bytes: puyapy.arc4.StaticArray[puyapy.arc4.UIntN[typing.Literal[8]], typing.Literal[3]] = arc4_array_encode([7arc4u8, 8arc4u8, 9arc4u8], puyapy.arc4.StaticArray[puyapy.arc4.UIntN[typing.Literal[8]], typing.Literal[3]]) + this.creator: puyapy.Account = txn() + this.app: puyapy.Application = reinterpret_cast(123u) assert(reinterpret_cast(len(Method("get(uint64,byte[])byte[]"))), comment="has method selector") } @@ -44,8 +44,8 @@ contract Reference abimethod opt_into_asset(asset: puyapy.Asset): None { assert(txn() == global(), comment="Only creator can opt in to ASA") - assert(!(reinterpret_cast(this.globals['asa'])), comment="ASA already opted in") - this.globals['asa']: puyapy.Asset = asset + assert(!(reinterpret_cast(this.asa)), comment="ASA already opted in") + this.asa: puyapy.Asset = asset itxn_begin() itxn_field(axfer) itxn_field(0u) @@ -56,7 +56,7 @@ contract Reference abimethod with_transactions(asset: puyapy.Asset, an_int: puyapy.arc4.UIntN[typing.Literal[64]], pay: puyapy.gtxn.PaymentTransaction, another_int: puyapy.arc4.UIntN[typing.Literal[64]]): None { - assert(this.globals['asa'] == asset, comment="is correct asset") + assert(this.asa == asset, comment="is correct asset") assert(arc4_decode(an_int, puyapy.UInt64) == 1u, comment="is correct int") assert(gtxns(pay) == global(), comment="is payment to app") assert(arc4_decode(another_int, puyapy.UInt64) == 2u, comment="is correct int") diff --git a/test_cases/application/out/contract.awst b/test_cases/application/out/contract.awst index 2f4ecc3eac..db958dbe7d 100644 --- a/test_cases/application/out/contract.awst +++ b/test_cases/application/out/contract.awst @@ -17,9 +17,9 @@ contract Reference constructor() { - this.globals['int_1']: puyapy.UInt64 = 0u - this.globals['bytes_1']: puyapy.Bytes = '' - this.globals['bytes_2']: puyapy.Bytes = '' + this.int_1: puyapy.UInt64 = 0u + this.bytes_1: puyapy.Bytes = '' + this.bytes_2: puyapy.Bytes = '' } approval_program(): bool diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir index 72d4bf6ab8..6918b5ffc6 100644 --- a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.destructured.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 (log 0xa0) return 1u diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir index 8659298f40..6153ef72c8 100644 --- a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 let tmp%0#0: any = (setbit 0x00 0u 1u) let tmp%1#0: any = (setbit 0x00 0u 0u) let tmp%2#0: any = (setbit 0x00 0u 1u) diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir index 52e74b53a3..04da9a28bc 100644 --- a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_1.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 let encoded_tuple_buffer%5#1: bytes = (concat 0x 0x80) let is_true%6#0: uint64 = (getbit 0x00 0u) let encoded_tuple_buffer%5#2: any = (setbit encoded_tuple_buffer%5#1 1u is_true%6#0) diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir index 86f76e239e..6ebb852fdc 100644 --- a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_2.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 let encoded_tuple_buffer%5#2: any = (setbit 0x80 1u 0u) let encoded_tuple_buffer%5#3: any = (setbit encoded_tuple_buffer%5#2 2u 1u) let flags#0: any = (setbit encoded_tuple_buffer%5#3 3u 0u) diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir index f498f4bc30..bb19e4784c 100644 --- a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_3.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 let encoded_tuple_buffer%5#3: any = (setbit 0x80 2u 1u) let flags#0: any = (setbit encoded_tuple_buffer%5#3 3u 0u) (log flags#0) diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir index dc04a5185e..62b336b58d 100644 --- a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_4.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 let flags#0: any = (setbit 0xa0 3u 0u) (log flags#0) return 1u diff --git a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir index 72d4bf6ab8..6918b5ffc6 100644 --- a/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir +++ b/test_cases/arc4_types/out/Arc4StructsFromAnotherModule.ssa.opt_pass_5.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 (log 0xa0) return 1u diff --git a/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir index 72d4bf6ab8..6918b5ffc6 100644 --- a/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir +++ b/test_cases/arc4_types/out_O2/Arc4StructsFromAnotherModule.destructured.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 (log 0xa0) return 1u diff --git a/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir index fa07fc1048..86e2702142 100644 --- a/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir +++ b/test_cases/arc4_types/out_unoptimized/Arc4StructsFromAnotherModule.destructured.ir @@ -1,7 +1,7 @@ contract test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule: program approval: subroutine test_cases.arc4_types.structs2.Arc4StructsFromAnotherModule.approval_program() -> uint64: - block@0: // L6 + block@0: // L7 let tmp%0#0: any = (setbit 0x00 0u 1u) let tmp%1#0: any = (setbit 0x00 0u 0u) let tmp%2#0: any = (setbit 0x00 0u 1u) diff --git a/test_cases/arc4_types/puya.log b/test_cases/arc4_types/puya.log index 85d0423180..d767c3e409 100644 --- a/test_cases/arc4_types/puya.log +++ b/test_cases/arc4_types/puya.log @@ -618,8 +618,8 @@ debug: Replaced trivial Phi node: let coord_1#1: bytes = φ(coord_1#0 <- block@1 debug: Terminated block@5: // after_for_L30 debug: Sealing block@0: // L41 debug: Terminated block@0: // L41 -debug: Sealing block@0: // L6 -debug: Terminated block@0: // L6 +debug: Sealing block@0: // L7 +debug: Terminated block@0: // L7 debug: Sealing block@0: // L13 debug: Terminated block@0: // L13 debug: Sealing block@0: // L54 diff --git a/test_cases/asset/out/contract.awst b/test_cases/asset/out/contract.awst index 8e1f8c15a7..e739ece9d4 100644 --- a/test_cases/asset/out/contract.awst +++ b/test_cases/asset/out/contract.awst @@ -6,7 +6,7 @@ contract Reference constructor() { - this.globals['asa']: puyapy.Asset = reinterpret_cast(0u) + this.asa: puyapy.Asset = reinterpret_cast(0u) } approval_program(): bool @@ -35,8 +35,8 @@ contract Reference subroutine opt_into_asset(asset: puyapy.Asset): None { assert(txn() == global(), comment="Only creator can opt in to ASA") - assert(!(reinterpret_cast(this.globals['asa'])), comment="ASA already opted in") - this.globals['asa']: puyapy.Asset = asset + assert(!(reinterpret_cast(this.asa)), comment="ASA already opted in") + this.asa: puyapy.Asset = asset itxn_begin() itxn_field(axfer) itxn_field(0u) @@ -47,7 +47,7 @@ contract Reference subroutine is_opted_asset(asset: puyapy.Asset): None { - assert(this.globals['asa'] == asset, comment="asset self.asa == asset") + assert(this.asa == asset, comment="asset self.asa == asset") assert(checked_maybe(asset_params_get(asset)) == 10000000u, comment="total") assert(checked_maybe(asset_params_get(asset)) == 0u, comment="decimals") assert(!(checked_maybe(asset_params_get(asset))), comment="default frozen") diff --git a/test_cases/augmented_assignment/out/contract.awst b/test_cases/augmented_assignment/out/contract.awst index 672d5b0f5b..d8edf96bf6 100644 --- a/test_cases/augmented_assignment/out/contract.awst +++ b/test_cases/augmented_assignment/out/contract.awst @@ -11,24 +11,24 @@ contract Augmented constructor() { - this.globals['global_uint']: puyapy.UInt64 = 0u - this.globals['global_bytes']: puyapy.Bytes = '' + this.global_uint: puyapy.UInt64 = 0u + this.global_bytes: puyapy.Bytes = '' } approval_program(): bool { me: puyapy.Account = txn() if (txn() == OptIn) { - this.locals['my_uint'].account[me]: puyapy.UInt64 = 0u - this.locals['my_bytes'].account[me]: puyapy.Bytes = '' + this.my_uint[me]: puyapy.UInt64 = 0u + this.my_bytes[me]: puyapy.Bytes = '' } if (txn() > 0u) { n: puyapy.UInt64 = txn() bytes_to_add: puyapy.Bytes = reinterpret_cast(itob(n)) - this.locals['my_uint'].account[me] += n - this.locals['my_bytes'].account[me] += bytes_to_add - this.globals['global_uint'] += n - this.globals['global_bytes'] += bytes_to_add + this.my_uint[me] += n + this.my_bytes[me] += bytes_to_add + this.global_uint += n + this.global_bytes += bytes_to_add } return true } diff --git a/test_cases/chained_assignment/out/contract.awst b/test_cases/chained_assignment/out/contract.awst index 9ba937b6d8..448cfab0f9 100644 --- a/test_cases/chained_assignment/out/contract.awst +++ b/test_cases/chained_assignment/out/contract.awst @@ -9,8 +9,8 @@ abstract contract BaseContract constructor() { - this.globals['state2']: puyapy.Bytes = tmp$0: puyapy.Bytes := test_cases.chained_assignment.contract::join_log_and_return(right='\xf0\x9f\x91\x8b', left='Hello, world!') - this.globals['state1']: puyapy.Bytes = tmp$0 + this.state2: puyapy.Bytes = tmp$0: puyapy.Bytes := test_cases.chained_assignment.contract::join_log_and_return(right='\xf0\x9f\x91\x8b', left='Hello, world!') + this.state1: puyapy.Bytes = tmp$0 } } diff --git a/test_cases/conditional_execution/out/contract.awst b/test_cases/conditional_execution/out/contract.awst index fa1a15f8b3..0e1fa636f8 100644 --- a/test_cases/conditional_execution/out/contract.awst +++ b/test_cases/conditional_execution/out/contract.awst @@ -7,26 +7,26 @@ contract ConditionalExecutionContract constructor() { - this.globals['did_execute_a']: bool = false - this.globals['did_execute_b']: bool = false + this.did_execute_a: bool = false + this.did_execute_b: bool = false } approval_program(): bool { this::func_a(true) or this::func_b(true) - this::assert_and_reset(this.globals['did_execute_a'] and !(this.globals['did_execute_b'])) + this::assert_and_reset(this.did_execute_a and !(this.did_execute_b)) this::func_a(false) or this::func_b(true) - this::assert_and_reset(this.globals['did_execute_a'] and this.globals['did_execute_b']) + this::assert_and_reset(this.did_execute_a and this.did_execute_b) this::func_a(false) and this::func_b(true) - this::assert_and_reset(this.globals['did_execute_a'] and !(this.globals['did_execute_b'])) + this::assert_and_reset(this.did_execute_a and !(this.did_execute_b)) this::func_a(true) and this::func_b(true) - this::assert_and_reset(this.globals['did_execute_a'] and this.globals['did_execute_b']) + this::assert_and_reset(this.did_execute_a and this.did_execute_b) (this::func_a(true), this::func_b(true))[0] - this::assert_and_reset(this.globals['did_execute_a'] and this.globals['did_execute_b']) + this::assert_and_reset(this.did_execute_a and this.did_execute_b) (this::func_c(true)) ? (this::func_a(true)) : (this::func_b(true)) - this::assert_and_reset(this.globals['did_execute_a'] and !(this.globals['did_execute_b'])) + this::assert_and_reset(this.did_execute_a and !(this.did_execute_b)) (this::func_c(false)) ? (this::func_a(true)) : (this::func_b(true)) - this::assert_and_reset(!(this.globals['did_execute_a']) and this.globals['did_execute_b']) + this::assert_and_reset(!(this.did_execute_a) and this.did_execute_b) return true } @@ -38,19 +38,19 @@ contract ConditionalExecutionContract subroutine assert_and_reset(condition: bool): None { assert(condition) - this.globals['did_execute_b']: bool = false - this.globals['did_execute_a']: bool = false + this.did_execute_b: bool = false + this.did_execute_a: bool = false } subroutine func_a(ret_val: bool): bool { - this.globals['did_execute_a']: bool = true + this.did_execute_a: bool = true return ret_val } subroutine func_b(ret_val: bool): bool { - this.globals['did_execute_b']: bool = true + this.did_execute_b: bool = true return ret_val } diff --git a/test_cases/everything/out/contract.awst b/test_cases/everything/out/contract.awst index 947d3b1bc3..51b6b15200 100644 --- a/test_cases/everything/out/contract.awst +++ b/test_cases/everything/out/contract.awst @@ -39,25 +39,25 @@ contract Everything extends (test_cases.everything.my_base::MyMiddleBase, test_c { this::_check_ban_list() this::remember_creator() - this.globals['counter']: puyapy.UInt64 = 0u + this.counter: puyapy.UInt64 = 0u } abimethod register(name: puyapy.arc4.String): None { this::_check_ban_list() if (txn() == OptIn) { - (sender_name, sender_name_existed): tuple[puyapy.arc4.String, bool] = app_local_get_ex(0u, 0u, 'name') + (sender_name, sender_name_existed): tuple[puyapy.arc4.String, bool] = STATE_GET_EX(this.name[0u]) if (!(sender_name_existed)) { - this.globals['counter'] += test_cases.everything.my_base::multiplicative_identity() + this.counter += test_cases.everything.my_base::multiplicative_identity() } } - this.locals['name'].account[0u]: puyapy.arc4.String = name + this.name[0u]: puyapy.arc4.String = name } abimethod say_hello(): puyapy.arc4.String { this::_check_ban_list() - (name, exists): tuple[puyapy.arc4.String, bool] = app_local_get_ex(0u, 0u, 'name') + (name, exists): tuple[puyapy.arc4.String, bool] = STATE_GET_EX(this.name[0u]) if (!(exists)) { return arc4_encode('Howdy stranger!', puyapy.arc4.String) } @@ -82,7 +82,7 @@ contract Everything extends (test_cases.everything.my_base::MyMiddleBase, test_c subroutine _remove_sender(): None { - this.globals['counter'] -= test_cases.everything.contract::positive_one() + this.counter -= test_cases.everything.contract::positive_one() } } diff --git a/test_cases/everything/out/my_base.awst b/test_cases/everything/out/my_base.awst index 9f007591fb..fcae20995e 100644 --- a/test_cases/everything/out/my_base.awst +++ b/test_cases/everything/out/my_base.awst @@ -6,7 +6,7 @@ abstract contract MyBase subroutine remember_creator(): None { - this.globals['creator']: puyapy.Account = txn() + this.creator: puyapy.Account = txn() } } diff --git a/test_cases/inner_transactions/out/c2c.awst b/test_cases/inner_transactions/out/c2c.awst index 7466a9511e..1327d29355 100644 --- a/test_cases/inner_transactions/out/c2c.awst +++ b/test_cases/inner_transactions/out/c2c.awst @@ -6,19 +6,19 @@ contract Greeter constructor() { - this.globals['hello_app']: puyapy.Application = reinterpret_cast(0u) + this.hello_app: puyapy.Application = reinterpret_cast(0u) } abimethod bootstrap(): puyapy.UInt64 { - assert(!(reinterpret_cast(this.globals['hello_app'])), comment="already bootstrapped") - this.globals['hello_app']: puyapy.Application = submit_txn(create_inner_transaction(TypeEnum=appl, ApprovalProgramPages=hex<"0A200101311B410026800402BECE11361A008E0100010031191444311844361A018800158004151F7C754C50B02243311914443118144422438A01018BFF570200800748656C6C6F2C204C504915165706004C5089">, ClearStateProgramPages=hex<"0A8101">, Fee=0u)).CreatedApplicationID - return reinterpret_cast(this.globals['hello_app']) + assert(!(reinterpret_cast(this.hello_app)), comment="already bootstrapped") + this.hello_app: puyapy.Application = submit_txn(create_inner_transaction(TypeEnum=appl, ApprovalProgramPages=hex<"0A200101311B410026800402BECE11361A008E0100010031191444311844361A018800158004151F7C754C50B02243311914443118144422438A01018BFF570200800748656C6C6F2C204C504915165706004C5089">, ClearStateProgramPages=hex<"0A8101">, Fee=0u)).CreatedApplicationID + return reinterpret_cast(this.hello_app) } abimethod log_greetings(name: puyapy.arc4.String): None { - hello_call: puyapy.itxn.ApplicationCallInnerTransaction = submit_txn(create_inner_transaction(TypeEnum=appl, ApplicationID=this.globals['hello_app'], ApplicationArgs=(Method("hello(string)string"), name))) + hello_call: puyapy.itxn.ApplicationCallInnerTransaction = submit_txn(create_inner_transaction(TypeEnum=appl, ApplicationID=this.hello_app, ApplicationArgs=(Method("hello(string)string"), name))) greeting: puyapy.arc4.String = reinterpret_cast(checked_maybe((extract<4, 0>(reinterpret_cast(hello_call.LastLog)), extract<0, 4>(reinterpret_cast(hello_call.LastLog)) == hex<"151F7C75">))) log(concat(concat('HelloWorld returned: ', ''), arc4_decode(greeting, puyapy.Bytes))) } diff --git a/test_cases/inner_transactions/out/contract.awst b/test_cases/inner_transactions/out/contract.awst index 59274619d7..49f1aefa4d 100644 --- a/test_cases/inner_transactions/out/contract.awst +++ b/test_cases/inner_transactions/out/contract.awst @@ -9,7 +9,7 @@ contract MyContract constructor() { - this.globals['name']: puyapy.Bytes = '' + this.name: puyapy.Bytes = '' } approval_program(): bool @@ -40,11 +40,11 @@ contract MyContract subroutine test1(): None { - this.globals['name']: puyapy.Bytes = 'AST1' - asset_params: puyapy.itxn.AssetConfig = create_inner_transaction(TypeEnum=acfg, ConfigAssetTotal=1000u, ConfigAssetName=this.globals['name'], ConfigAssetUnitName='unit', ConfigAssetDecimals=3u, ConfigAssetManager=global(), ConfigAssetReserve=global(), Fee=0u) - this.globals['name']: puyapy.Bytes = 'AST2' + this.name: puyapy.Bytes = 'AST1' + asset_params: puyapy.itxn.AssetConfig = create_inner_transaction(TypeEnum=acfg, ConfigAssetTotal=1000u, ConfigAssetName=this.name, ConfigAssetUnitName='unit', ConfigAssetDecimals=3u, ConfigAssetManager=global(), ConfigAssetReserve=global(), Fee=0u) + this.name: puyapy.Bytes = 'AST2' asset1_txn: puyapy.itxn.AssetConfigInnerTransaction = submit_txn(asset_params) - update_inner_transaction(asset_params,ConfigAssetName=this.globals['name']) + update_inner_transaction(asset_params,ConfigAssetName=this.name) asset2_txn: puyapy.itxn.AssetConfigInnerTransaction = submit_txn(asset_params) assert(asset1_txn.ConfigAssetName == 'AST1', comment="asset1_txn is correct") assert(asset2_txn.ConfigAssetName == 'AST2', comment="asset2_txn is correct") diff --git a/test_cases/match/out/contract.awst b/test_cases/match/out/contract.awst index cbf0a0fb8e..827acae6b3 100644 --- a/test_cases/match/out/contract.awst +++ b/test_cases/match/out/contract.awst @@ -7,8 +7,8 @@ contract MyContract approval_program(): bool { - this.globals['case_one']: puyapy.UInt64 = 1u - this.globals['case_two']: puyapy.UInt64 = 2u + this.case_one: puyapy.UInt64 = 1u + this.case_two: puyapy.UInt64 = 2u this::match_uint64() this::match_biguint() this::match_bytes() @@ -87,11 +87,11 @@ contract MyContract { n: puyapy.UInt64 = txn() switch (n) { - case this.globals['case_one']: { + case this.case_one: { hello: puyapy.Bytes = 'Hello one' log(hello) } - case this.globals['case_two']: { + case this.case_two: { hello: puyapy.Bytes = 'Hello two' log(hello) } diff --git a/test_cases/simplish/out/base_class.awst b/test_cases/simplish/out/base_class.awst index 56a64c1bf7..4034cb8afa 100644 --- a/test_cases/simplish/out/base_class.awst +++ b/test_cases/simplish/out/base_class.awst @@ -9,16 +9,16 @@ abstract contract CallCounter constructor() { - this.globals['counter']: puyapy.UInt64 = 0u + this.counter: puyapy.UInt64 = 0u } subroutine increment_counter(): None { - this.globals['counter'] += 1u + this.counter += 1u } subroutine set_sender_nickname(nickname: puyapy.Bytes): None { - this.locals['name'].account[0u]: puyapy.Bytes = nickname + this.name[0u]: puyapy.Bytes = nickname } } \ No newline at end of file diff --git a/test_cases/simplish/out/contract.awst b/test_cases/simplish/out/contract.awst index 2e34ee9fb4..9eb3bc0c59 100644 --- a/test_cases/simplish/out/contract.awst +++ b/test_cases/simplish/out/contract.awst @@ -12,7 +12,7 @@ contract Simplish extends (test_cases.simplish.base_class::CallCounter) sender: puyapy.Account = txn() if (oca IS IN (UpdateApplication, DeleteApplication)) { if (oca == DeleteApplication) { - log('I was used ' + test_cases.simplish.contract::itoa(this.globals['counter']) + ' time(s) before I died') + log('I was used ' + test_cases.simplish.contract::itoa(this.counter) + ' time(s) before I died') } return global() == sender } diff --git a/test_cases/tuple_support/out/tuple_support.awst b/test_cases/tuple_support/out/tuple_support.awst index d76af56997..076ba4430c 100644 --- a/test_cases/tuple_support/out/tuple_support.awst +++ b/test_cases/tuple_support/out/tuple_support.awst @@ -6,7 +6,7 @@ contract TupleSupport constructor() { - this.globals['state']: puyapy.UInt64 = 0u + this.state: puyapy.UInt64 = 0u } approval_program(): puyapy.UInt64 @@ -14,7 +14,7 @@ contract TupleSupport total: puyapy.UInt64 = test_cases.tuple_support.tuple_support::add_three_values((101u, 102u, 103u)) log(itob(total)) (a, b): tuple[puyapy.UInt64, puyapy.UInt64] = (1u, 2u) - (did_overflow, this.globals['state']): tuple[puyapy.UInt64, puyapy.UInt64] = addw(a, b) + (did_overflow, this.state): tuple[puyapy.UInt64, puyapy.UInt64] = addw(a, b) assert(!(reinterpret_cast(did_overflow)), comment="overflow!") ab: tuple[puyapy.UInt64, puyapy.UInt64] = (a, b) result: tuple[puyapy.UInt64, puyapy.UInt64] = addw(a, b) From d96ad13bc58af37b0ac952d2d586462cc00ba04f Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 14:38:26 +0800 Subject: [PATCH 17/40] fix tests --- src/puya/awst_build/subroutine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index da65bf6942..4e0aa3fa76 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -377,8 +377,8 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> Sequence[Sta return [ AssignmentStatement( source_location=stmt_loc, - target=self.resolve_lvalue(lvalue), value=rvalue.build_assignment_source(), + target=self.resolve_lvalue(lvalue), ) for lvalue in reversed(stmt.lvalues) ] From 99bdb742cfb0b8b5c9fd8c66559dd2f5cee85ec5 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 14:58:31 +0800 Subject: [PATCH 18/40] add "unknown" bytes encoding for raw bytes. default to hex output, but we can choose a better encoding when e.g. combining constants in optimisation --- src/puya/awst/nodes.py | 2 ++ src/puya/awst/to_code_visitor.py | 8 ++++---- src/puya/awst_build/contract.py | 6 +++--- src/puya/awst_build/eb/app_account_state.py | 2 +- src/puya/awst_build/eb/app_state.py | 2 +- src/puya/awst_build/utils.py | 2 +- src/puya/ir/types_.py | 1 + src/puya/ir/utils.py | 2 +- src/puya/teal/models.py | 1 + 9 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index 44c6b50ea0..bfe5e52aed 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -351,7 +351,9 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T: return visitor.visit_bool_constant(self) +@enum.unique class BytesEncoding(enum.StrEnum): + unknown = enum.auto() base16 = enum.auto() base32 = enum.auto() base64 = enum.auto() diff --git a/src/puya/awst/to_code_visitor.py b/src/puya/awst/to_code_visitor.py index 665f74f5a2..7942adec57 100644 --- a/src/puya/awst/to_code_visitor.py +++ b/src/puya/awst/to_code_visitor.py @@ -339,14 +339,14 @@ def visit_bool_constant(self, expr: nodes.BoolConstant) -> str: def visit_bytes_constant(self, expr: nodes.BytesConstant) -> str: match expr.encoding: - case nodes.BytesEncoding.base16: - return f'hex<"{expr.value.hex().upper()}">' + case nodes.BytesEncoding.utf8: + return bytes_str(expr.value) case nodes.BytesEncoding.base32: return f'b32<"{base64.b32encode(expr.value).decode("ascii")}">' case nodes.BytesEncoding.base64: return f'b64<"{base64.b64encode(expr.value).decode("ascii")}">' - case _: - return bytes_str(expr.value) + case nodes.BytesEncoding.base16 | nodes.BytesEncoding.unknown: + return f'hex<"{expr.value.hex().upper()}">' def visit_method_constant(self, expr: nodes.MethodConstant) -> str: return f'Method("{expr.value}")' diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index bda926c423..62325e01ab 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -1,6 +1,6 @@ import typing from collections.abc import Iterator, Mapping -from typing import Never, List +from typing import Never import mypy.nodes import mypy.types @@ -11,12 +11,12 @@ from puya.arc4_util import wtype_to_arc4 from puya.awst import wtypes from puya.awst.nodes import ( + AppStateDefinition, AppStateKind, + BytesEncoding, ContractFragment, ContractMethod, ContractReference, - AppStateDefinition, - BytesEncoding, ) from puya.awst_build import constants from puya.awst_build.base_mypy_visitor import BaseMyPyStatementVisitor diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index 962769a314..51bb6df81d 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -260,7 +260,7 @@ def call( key_encoding = None case Literal(value=bytes(bytes_value)): key = bytes_value - key_encoding = BytesEncoding.base16 # TODO: maybe we need an "unknown" encoding? + key_encoding = BytesEncoding.unknown case Literal(value=str(str_value)): key = str_value.encode("utf8") key_encoding = BytesEncoding.utf8 diff --git a/src/puya/awst_build/eb/app_state.py b/src/puya/awst_build/eb/app_state.py index 8e02047559..1fd5806c90 100644 --- a/src/puya/awst_build/eb/app_state.py +++ b/src/puya/awst_build/eb/app_state.py @@ -120,7 +120,7 @@ def call( key_encoding = None case Literal(value=bytes(bytes_value)): key = bytes_value - key_encoding = BytesEncoding.base16 # TODO: maybe we need an "unknown" encoding? + key_encoding = BytesEncoding.unknown case Literal(value=str(str_value)): key = str_value.encode("utf8") key_encoding = BytesEncoding.utf8 diff --git a/src/puya/awst_build/utils.py b/src/puya/awst_build/utils.py index 6de967e292..2e01deb448 100644 --- a/src/puya/awst_build/utils.py +++ b/src/puya/awst_build/utils.py @@ -224,7 +224,7 @@ def convert_literal( try: literal_value.decode("utf8") except ValueError: - encoding = BytesEncoding.base16 + encoding = BytesEncoding.unknown else: encoding = BytesEncoding.utf8 return BytesConstant(value=literal_value, source_location=loc, encoding=encoding) diff --git a/src/puya/ir/types_.py b/src/puya/ir/types_.py index 13aa070f9a..0fc201e707 100644 --- a/src/puya/ir/types_.py +++ b/src/puya/ir/types_.py @@ -13,6 +13,7 @@ @enum.unique class AVMBytesEncoding(enum.StrEnum): + unknown = enum.auto() base16 = enum.auto() base32 = enum.auto() base64 = enum.auto() diff --git a/src/puya/ir/utils.py b/src/puya/ir/utils.py index ef456c9510..f9b065c6a6 100644 --- a/src/puya/ir/utils.py +++ b/src/puya/ir/utils.py @@ -46,5 +46,5 @@ def format_bytes(b: bytes, encoding: AVMBytesEncoding) -> str: return base64.b32encode(b).decode("ascii") case AVMBytesEncoding.base64: return base64.b64encode(b).decode("ascii") - case _: + case AVMBytesEncoding.base16 | AVMBytesEncoding.unknown: return f"0x{b.hex()}" diff --git a/src/puya/teal/models.py b/src/puya/teal/models.py index cc7e6cf1b4..fdf294a810 100644 --- a/src/puya/teal/models.py +++ b/src/puya/teal/models.py @@ -219,6 +219,7 @@ def immediates(self) -> Sequence[int | str]: if self.encoding in ( AVMBytesEncoding.utf8, AVMBytesEncoding.base16, + AVMBytesEncoding.unknown, ): return (bytes_str,) hint = self.encoding.name From 404d840fe9129986dec6ce9e8b16c83f1a210faf Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 18:14:13 +0800 Subject: [PATCH 19/40] wip --- .../out/AppStateContract.approval.mir | 396 ++++++++---------- .../out/AppStateContract.approval.teal | 32 +- .../out/AppStateContract.destructured.ir | 56 +-- .../global_state/out/AppStateContract.ssa.ir | 70 ++-- .../out/AppStateContract.ssa.opt_pass_1.ir | 56 +-- examples/global_state/out/contract.awst | 12 +- .../out_O2/AppStateContract.approval.teal | 24 +- .../out_O2/AppStateContract.destructured.ir | 56 +-- .../AppStateContract.approval.teal | 32 +- .../AppStateContract.destructured.ir | 66 ++- examples/global_state/puya.log | 119 ++---- examples/sizes.txt | 2 +- src/puya/awst/function_traverser.py | 7 + src/puya/awst/nodes.py | 57 +-- src/puya/awst/to_code_visitor.py | 12 +- src/puya/awst/visitors.py | 12 +- src/puya/awst_build/eb/app_state.py | 100 ++--- src/puya/ir/builder/main.py | 60 ++- 18 files changed, 517 insertions(+), 652 deletions(-) diff --git a/examples/global_state/out/AppStateContract.approval.mir b/examples/global_state/out/AppStateContract.approval.mir index a1052481fb..541164354d 100644 --- a/examples/global_state/out/AppStateContract.approval.mir +++ b/examples/global_state/out/AppStateContract.approval.mir @@ -1,226 +1,202 @@ -// Op // Op Description Stack (out) Live (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.global_state.contract.AppStateContract.approval_program() -> uint64: -main: - byte "" - dup // allocate 2 to stack (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | - main_block@0: - txn ApplicationID // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {txn} - // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_id%0#0 - bnz main_entrypoint@2 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | - // Implicit fall through to main_on_create@1 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + bnz main_entrypoint@2 // + // Implicit fall through to main_on_create@1 // main_on_create@1: - callsub __init__ // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | - // Implicit fall through to main_entrypoint@2 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | + callsub __init__ // + // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_int_simplified global_state/contract.py:15 - byte "global_int_simplified" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_int_simplified" self.global_int_simplified global_state/contract.py:15 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_simplified global_state/contract.py:15 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.global_int_simplified global_state/contract.py:15 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 - assert // check value exists // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%1#0 self.global_int_simplified global_state/contract.py:15 - // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%1#0 self.global_int_simplified == 33 global_state/contract.py:15 - int 33 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%1#0,33 33 global_state/contract.py:15 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} self.global_int_simplified == 33 global_state/contract.py:15 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%3#0 self.global_int_simplified == 33 global_state/contract.py:15 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%3#0 assert self.global_int_simplified == 33 global_state/contract.py:15 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_int_simplified == 33 global_state/contract.py:15 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_int_full global_state/contract.py:16 - byte "global_int_full" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_int_full" self.global_int_full global_state/contract.py:16 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:16 - swap // store tmp%5#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%5#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:16 - pop // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%5#0 self.global_int_full global_state/contract.py:16 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%5#0 assert self.global_int_full global_state/contract.py:16 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_int_full global_state/contract.py:16 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_int_full global_state/contract.py:17 - byte "global_int_full" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_int_full" self.global_int_full global_state/contract.py:17 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:17 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:17 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 - assert // check value exists // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%6#0 self.global_int_full global_state/contract.py:17 - // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%6#0 self.global_int_full.value == 55 global_state/contract.py:17 - int 55 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%6#0,55 55 global_state/contract.py:17 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} self.global_int_full.value == 55 global_state/contract.py:17 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%8#0 self.global_int_full.value == 55 global_state/contract.py:17 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%8#0 assert self.global_int_full.value == 55 global_state/contract.py:17 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_int_full.value == 55 global_state/contract.py:17 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 not self.global_int_no_default global_state/contract.py:18 - byte "global_int_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_int_no_default" not self.global_int_no_default global_state/contract.py:18 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_int_no_default global_state/contract.py:18 - swap // store tmp%10#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%10#0,{app_global_get_ex}.0 not self.global_int_no_default global_state/contract.py:18 - pop // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%10#0 not self.global_int_no_default global_state/contract.py:18 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%10#0 not self.global_int_no_default global_state/contract.py:18 - ! // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {!} not self.global_int_no_default global_state/contract.py:18 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%11#0 not self.global_int_no_default global_state/contract.py:18 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%11#0 assert not self.global_int_no_default global_state/contract.py:18 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert not self.global_int_no_default global_state/contract.py:18 - byte "global_int_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | "global_int_no_default" self.global_int_no_default global_state/contract.py:19 - int 44 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | "global_int_no_default",44 44 global_state/contract.py:19 - app_global_put // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | self.global_int_no_default.value = UInt64(44) global_state/contract.py:19 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_int_no_default.maybe() global_state/contract.py:20 - byte "global_int_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_int_no_default" self.global_int_no_default.maybe() global_state/contract.py:20 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_no_default.maybe() global_state/contract.py:20 - // virtual: store i_exists#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | i_exists#0,{app_global_get_ex}.0 self.global_int_no_default.maybe() global_state/contract.py:20 - // virtual: store i_value#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | i_value#0,i_exists#0 self.global_int_no_default.maybe() global_state/contract.py:20 - // virtual: load i_exists#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | i_value#0,i_exists#0 assert i_exists global_state/contract.py:21 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | i_value#0 assert i_exists global_state/contract.py:21 - // virtual: load i_value#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | i_value#0 i_value == 44 global_state/contract.py:22 - int 44 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | i_value#0,44 44 global_state/contract.py:22 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} i_value == 44 global_state/contract.py:22 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%14#0 i_value == 44 global_state/contract.py:22 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%14#0 assert i_value == 44 global_state/contract.py:22 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert i_value == 44 global_state/contract.py:22 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_bytes_simplified global_state/contract.py:24 - byte "global_bytes_simplified" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:24 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_simplified global_state/contract.py:24 - // virtual: store app_global_get_ex_did_exist%16#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_did_exist%16#0,{app_global_get_ex}.0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: store app_global_get_ex_value%15#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: load app_global_get_ex_did_exist%16#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 - assert // check value exists // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%15#0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: load app_global_get_ex_value%15#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%15#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - byte "Hello" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%15#0,"Hello" b"Hello" global_state/contract.py:24 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%17#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%17#0 assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_bytes_full global_state/contract.py:25 - byte "global_bytes_full" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:25 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:25 - swap // store tmp%19#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%19#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:25 - pop // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%19#0 self.global_bytes_full global_state/contract.py:25 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%19#0 assert self.global_bytes_full global_state/contract.py:25 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_bytes_full global_state/contract.py:25 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_bytes_full global_state/contract.py:26 - byte "global_bytes_full" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:26 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:26 - // virtual: store app_global_get_ex_did_exist%21#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_did_exist%21#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:26 - // virtual: store app_global_get_ex_value%20#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 - // virtual: load app_global_get_ex_did_exist%21#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 - assert // check value exists // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%20#0 self.global_bytes_full global_state/contract.py:26 - // virtual: load app_global_get_ex_value%20#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%20#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - byte "Hello" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | app_global_get_ex_value%20#0,"Hello" b"Hello" global_state/contract.py:26 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%22#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%22#0 assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - byte "global_bytes_full" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_full" self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - swap // store awst_tmp%23.1#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%23.1#0,{app_global_get_ex}.0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - bury 3 // store awst_tmp%23.0#0 to f-stack (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%23.1#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - // virtual: load awst_tmp%23.1#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%23.1#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - bz main_ternary_false@4 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - // Implicit fall through to main_ternary_true@3 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - -main_ternary_true@3: - dig 1 // load awst_tmp%23.0#0 from f-stack (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%23.0#0 - // virtual: store ternary_result%24#1 to x-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%24#1 | - b main_ternary_merge@5 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%24#1 | ternary_result%24#1 - -main_ternary_false@4: - byte "default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | "default" b"default" global_state/contract.py:27 - // virtual: store ternary_result%24#1 to x-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%24#1 | self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - // Implicit fall through to main_ternary_merge@5 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%24#1 | ternary_result%24#1 - -main_ternary_merge@5: - // virtual: load ternary_result%24#1 from x-stack (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | ternary_result%24#1 ternary_result%24#1 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - byte "Hello" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | ternary_result%24#1,"Hello" b"Hello" global_state/contract.py:27 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - // virtual: store tmp%25#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%25#0 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - // virtual: load tmp%25#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%25#0 assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 not self.global_bytes_no_default global_state/contract.py:28 - byte "global_bytes_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_no_default" not self.global_bytes_no_default global_state/contract.py:28 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_bytes_no_default global_state/contract.py:28 - swap // store tmp%27#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%27#0,{app_global_get_ex}.0 not self.global_bytes_no_default global_state/contract.py:28 - pop // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%27#0 not self.global_bytes_no_default global_state/contract.py:28 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%27#0 not self.global_bytes_no_default global_state/contract.py:28 - ! // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {!} not self.global_bytes_no_default global_state/contract.py:28 - // virtual: store tmp%28#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%28#0 not self.global_bytes_no_default global_state/contract.py:28 - // virtual: load tmp%28#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%28#0 assert not self.global_bytes_no_default global_state/contract.py:28 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert not self.global_bytes_no_default global_state/contract.py:28 - byte "global_bytes_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:29 - byte "World" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | "global_bytes_no_default","World" b"World" global_state/contract.py:29 - app_global_put // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | self.global_bytes_no_default.value = Bytes(b"World") global_state/contract.py:29 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_bytes_no_default.maybe() global_state/contract.py:30 - byte "global_bytes_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_no_default" self.global_bytes_no_default.maybe() global_state/contract.py:30 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:30 - // virtual: store b_exists#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:30 - // virtual: store b_value#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_value#0,b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:30 - // virtual: load b_exists#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_value#0,b_exists#0 assert b_exists global_state/contract.py:31 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_value#0 assert b_exists global_state/contract.py:31 - // virtual: load b_value#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_value#0 b_value == b"World" global_state/contract.py:32 - byte "World" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_value#0,"World" b"World" global_state/contract.py:32 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} b_value == b"World" global_state/contract.py:32 - // virtual: store tmp%31#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%31#0 b_value == b"World" global_state/contract.py:32 - // virtual: load tmp%31#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%31#0 assert b_value == b"World" global_state/contract.py:32 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert b_value == b"World" global_state/contract.py:32 - byte "global_bytes_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:33 - app_global_del // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | del self.global_bytes_no_default.value global_state/contract.py:33 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_bytes_no_default.maybe() global_state/contract.py:34 - byte "global_bytes_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_no_default" self.global_bytes_no_default.maybe() global_state/contract.py:34 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:34 - swap // store b_exists#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:34 - pop // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:34 - // virtual: load b_exists#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | b_exists#0 not b_exists global_state/contract.py:35 - ! // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {!} not b_exists global_state/contract.py:35 - // virtual: store tmp%34#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%34#0 not b_exists global_state/contract.py:35 - // virtual: load tmp%34#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%34#0 assert not b_exists global_state/contract.py:35 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert not b_exists global_state/contract.py:35 - int 0 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - byte "global_bytes_no_default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 0,"global_bytes_no_default" self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - app_global_get_ex // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - swap // store awst_tmp%35.1#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%35.1#0,{app_global_get_ex}.0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - bury 2 // store awst_tmp%35.0#0 to f-stack (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%35.1#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - // virtual: load awst_tmp%35.1#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%35.1#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - bz main_ternary_false@7 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - // Implicit fall through to main_ternary_true@6 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - -main_ternary_true@6: - dup // load awst_tmp%35.0#0 from f-stack (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | awst_tmp%35.0#0 - // virtual: store ternary_result%36#1 to x-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%36#1 | - b main_ternary_merge@8 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%36#1 | ternary_result%36#1 - -main_ternary_false@7: - byte "default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | "default" b"default" global_state/contract.py:37 - // virtual: store ternary_result%36#1 to x-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%36#1 | self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - // Implicit fall through to main_ternary_merge@8 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | (𝕏) ternary_result%36#1 | ternary_result%36#1 - -main_ternary_merge@8: - // virtual: load ternary_result%36#1 from x-stack (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | ternary_result%36#1 ternary_result%36#1 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - byte "default" // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | ternary_result%36#1,"default" b"default" global_state/contract.py:37 - == // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | {==} self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - // virtual: store tmp%37#0 to l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%37#0 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - // virtual: load tmp%37#0 from l-stack (no copy) (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | tmp%37#0 assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - assert // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - int 1 // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | 1 True global_state/contract.py:38 - return // (𝕗) awst_tmp%23.0#0,awst_tmp%35.0#0 | return True global_state/contract.py:38 + int 0 // 0 self.global_int_simplified global_state/contract.py:15 + byte "global_int_simplified" // 0,"global_int_simplified" self.global_int_simplified global_state/contract.py:15 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_simplified global_state/contract.py:15 + // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.global_int_simplified global_state/contract.py:15 + // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 + // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 + assert // check value exists // app_global_get_ex_value%1#0 self.global_int_simplified global_state/contract.py:15 + // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) app_global_get_ex_value%1#0 self.global_int_simplified == 33 global_state/contract.py:15 + int 33 // app_global_get_ex_value%1#0,33 33 global_state/contract.py:15 + == // {==} self.global_int_simplified == 33 global_state/contract.py:15 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 self.global_int_simplified == 33 global_state/contract.py:15 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 assert self.global_int_simplified == 33 global_state/contract.py:15 + assert // assert self.global_int_simplified == 33 global_state/contract.py:15 + int 0 // 0 self.global_int_full global_state/contract.py:16 + byte "global_int_full" // 0,"global_int_full" self.global_int_full global_state/contract.py:16 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:16 + swap // store global_int_full_exists%5#0 to l-stack (no copy) global_int_full_exists%5#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:16 + pop // global_int_full_exists%5#0 self.global_int_full global_state/contract.py:16 + // virtual: load global_int_full_exists%5#0 from l-stack (no copy) global_int_full_exists%5#0 assert self.global_int_full global_state/contract.py:16 + assert // assert self.global_int_full global_state/contract.py:16 + int 0 // 0 self.global_int_full global_state/contract.py:17 + byte "global_int_full" // 0,"global_int_full" self.global_int_full global_state/contract.py:17 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:17 + // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:17 + // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 + // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 + assert // check value exists // app_global_get_ex_value%6#0 self.global_int_full global_state/contract.py:17 + // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) app_global_get_ex_value%6#0 self.global_int_full.value == 55 global_state/contract.py:17 + int 55 // app_global_get_ex_value%6#0,55 55 global_state/contract.py:17 + == // {==} self.global_int_full.value == 55 global_state/contract.py:17 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 self.global_int_full.value == 55 global_state/contract.py:17 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 assert self.global_int_full.value == 55 global_state/contract.py:17 + assert // assert self.global_int_full.value == 55 global_state/contract.py:17 + int 0 // 0 not self.global_int_no_default global_state/contract.py:18 + byte "global_int_no_default" // 0,"global_int_no_default" not self.global_int_no_default global_state/contract.py:18 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_int_no_default global_state/contract.py:18 + swap // store global_int_no_default_exists%10#0 to l-stack (no copy) global_int_no_default_exists%10#0,{app_global_get_ex}.0 not self.global_int_no_default global_state/contract.py:18 + pop // global_int_no_default_exists%10#0 not self.global_int_no_default global_state/contract.py:18 + // virtual: load global_int_no_default_exists%10#0 from l-stack (no copy) global_int_no_default_exists%10#0 not self.global_int_no_default global_state/contract.py:18 + ! // {!} not self.global_int_no_default global_state/contract.py:18 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 not self.global_int_no_default global_state/contract.py:18 + // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 assert not self.global_int_no_default global_state/contract.py:18 + assert // assert not self.global_int_no_default global_state/contract.py:18 + byte "global_int_no_default" // "global_int_no_default" self.global_int_no_default global_state/contract.py:19 + int 44 // "global_int_no_default",44 44 global_state/contract.py:19 + app_global_put // self.global_int_no_default.value = UInt64(44) global_state/contract.py:19 + int 0 // 0 self.global_int_no_default.maybe() global_state/contract.py:20 + byte "global_int_no_default" // 0,"global_int_no_default" self.global_int_no_default global_state/contract.py:20 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_no_default.maybe() global_state/contract.py:20 + // virtual: store i_exists#0 to l-stack (no copy) i_exists#0,{app_global_get_ex}.0 self.global_int_no_default.maybe() global_state/contract.py:20 + // virtual: store i_value#0 to l-stack (no copy) i_value#0,i_exists#0 self.global_int_no_default.maybe() global_state/contract.py:20 + // virtual: load i_exists#0 from l-stack (no copy) i_value#0,i_exists#0 assert i_exists global_state/contract.py:21 + assert // i_value#0 assert i_exists global_state/contract.py:21 + // virtual: load i_value#0 from l-stack (no copy) i_value#0 i_value == 44 global_state/contract.py:22 + int 44 // i_value#0,44 44 global_state/contract.py:22 + == // {==} i_value == 44 global_state/contract.py:22 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 i_value == 44 global_state/contract.py:22 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 assert i_value == 44 global_state/contract.py:22 + assert // assert i_value == 44 global_state/contract.py:22 + int 0 // 0 self.global_bytes_simplified global_state/contract.py:24 + byte "global_bytes_simplified" // 0,"global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:24 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_simplified global_state/contract.py:24 + // virtual: store app_global_get_ex_did_exist%16#0 to l-stack (no copy) app_global_get_ex_did_exist%16#0,{app_global_get_ex}.0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: store app_global_get_ex_value%15#0 to l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: load app_global_get_ex_did_exist%16#0 from l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 + assert // check value exists // app_global_get_ex_value%15#0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: load app_global_get_ex_value%15#0 from l-stack (no copy) app_global_get_ex_value%15#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + byte "Hello" // app_global_get_ex_value%15#0,"Hello" b"Hello" global_state/contract.py:24 + == // {==} self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + assert // assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + int 0 // 0 self.global_bytes_full global_state/contract.py:25 + byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:25 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:25 + swap // store global_bytes_full_exists%19#0 to l-stack (no copy) global_bytes_full_exists%19#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:25 + pop // global_bytes_full_exists%19#0 self.global_bytes_full global_state/contract.py:25 + // virtual: load global_bytes_full_exists%19#0 from l-stack (no copy) global_bytes_full_exists%19#0 assert self.global_bytes_full global_state/contract.py:25 + assert // assert self.global_bytes_full global_state/contract.py:25 + int 0 // 0 self.global_bytes_full global_state/contract.py:26 + byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:26 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:26 + // virtual: store app_global_get_ex_did_exist%21#0 to l-stack (no copy) app_global_get_ex_did_exist%21#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:26 + // virtual: store app_global_get_ex_value%20#0 to l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 + // virtual: load app_global_get_ex_did_exist%21#0 from l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 + assert // check value exists // app_global_get_ex_value%20#0 self.global_bytes_full global_state/contract.py:26 + // virtual: load app_global_get_ex_value%20#0 from l-stack (no copy) app_global_get_ex_value%20#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + byte "Hello" // app_global_get_ex_value%20#0,"Hello" b"Hello" global_state/contract.py:26 + == // {==} self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + assert // assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + int 0 // 0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:27 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + swap // store global_bytes_full_get_ex%24#0 to l-stack (no copy) global_bytes_full_get_ex%24#0,{app_global_get_ex}.0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + // virtual: store global_bytes_full_get_ex%23#0 to l-stack (no copy) global_bytes_full_get_ex%24#0,global_bytes_full_get_ex%23#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + byte "default" // global_bytes_full_get_ex%24#0,global_bytes_full_get_ex%23#0,"default" b"default" global_state/contract.py:27 + swap // load global_bytes_full_get_ex%23#0 from l-stack (no copy) global_bytes_full_get_ex%24#0,"default",global_bytes_full_get_ex%23#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + uncover 2 // load global_bytes_full_get_ex%24#0 from l-stack (no copy) "default",global_bytes_full_get_ex%23#0,global_bytes_full_get_ex%24#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + select // {select} self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + byte "Hello" // tmp%25#0,"Hello" b"Hello" global_state/contract.py:27 + == // {==} self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + assert // assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + int 0 // 0 not self.global_bytes_no_default global_state/contract.py:28 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" not self.global_bytes_no_default global_state/contract.py:28 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_bytes_no_default global_state/contract.py:28 + swap // store global_bytes_no_default_exists%28#0 to l-stack (no copy) global_bytes_no_default_exists%28#0,{app_global_get_ex}.0 not self.global_bytes_no_default global_state/contract.py:28 + pop // global_bytes_no_default_exists%28#0 not self.global_bytes_no_default global_state/contract.py:28 + // virtual: load global_bytes_no_default_exists%28#0 from l-stack (no copy) global_bytes_no_default_exists%28#0 not self.global_bytes_no_default global_state/contract.py:28 + ! // {!} not self.global_bytes_no_default global_state/contract.py:28 + // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 not self.global_bytes_no_default global_state/contract.py:28 + // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 assert not self.global_bytes_no_default global_state/contract.py:28 + assert // assert not self.global_bytes_no_default global_state/contract.py:28 + byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:29 + byte "World" // "global_bytes_no_default","World" b"World" global_state/contract.py:29 + app_global_put // self.global_bytes_no_default.value = Bytes(b"World") global_state/contract.py:29 + int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:30 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:30 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:30 + // virtual: store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:30 + // virtual: store b_value#0 to l-stack (no copy) b_value#0,b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:30 + // virtual: load b_exists#0 from l-stack (no copy) b_value#0,b_exists#0 assert b_exists global_state/contract.py:31 + assert // b_value#0 assert b_exists global_state/contract.py:31 + // virtual: load b_value#0 from l-stack (no copy) b_value#0 b_value == b"World" global_state/contract.py:32 + byte "World" // b_value#0,"World" b"World" global_state/contract.py:32 + == // {==} b_value == b"World" global_state/contract.py:32 + // virtual: store tmp%32#0 to l-stack (no copy) tmp%32#0 b_value == b"World" global_state/contract.py:32 + // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 assert b_value == b"World" global_state/contract.py:32 + assert // assert b_value == b"World" global_state/contract.py:32 + byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:33 + app_global_del // del self.global_bytes_no_default.value global_state/contract.py:33 + int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:34 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:34 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:34 + swap // store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:34 + pop // b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:34 + // virtual: load b_exists#0 from l-stack (no copy) b_exists#0 not b_exists global_state/contract.py:35 + ! // {!} not b_exists global_state/contract.py:35 + // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 not b_exists global_state/contract.py:35 + // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 assert not b_exists global_state/contract.py:35 + assert // assert not b_exists global_state/contract.py:35 + int 0 // 0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:37 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + swap // store global_bytes_no_default_get_ex%37#0 to l-stack (no copy) global_bytes_no_default_get_ex%37#0,{app_global_get_ex}.0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + // virtual: store global_bytes_no_default_get_ex%36#0 to l-stack (no copy) global_bytes_no_default_get_ex%37#0,global_bytes_no_default_get_ex%36#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + byte "default" // global_bytes_no_default_get_ex%37#0,global_bytes_no_default_get_ex%36#0,"default" b"default" global_state/contract.py:37 + swap // load global_bytes_no_default_get_ex%36#0 from l-stack (no copy) global_bytes_no_default_get_ex%37#0,"default",global_bytes_no_default_get_ex%36#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + uncover 2 // load global_bytes_no_default_get_ex%37#0 from l-stack (no copy) "default",global_bytes_no_default_get_ex%36#0,global_bytes_no_default_get_ex%37#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + select // {select} self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + // virtual: store tmp%38#0 to l-stack (no copy) tmp%38#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + byte "default" // tmp%38#0,"default" b"default" global_state/contract.py:37 + == // {==} self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + assert // assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + int 1 // 1 True global_state/contract.py:38 + return // return True global_state/contract.py:38 // examples.global_state.contract.AppStateContract.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: global_state/contract.py:5 + proto 0 0 // def __init__(self) -> None: global_state/contract.py:5 __init___block@0: - byte "global_int_full" // "global_int_full" self.global_int_full global_state/contract.py:6 - int 55 // "global_int_full",55 55 global_state/contract.py:6 - app_global_put // self.global_int_full = GlobalState(UInt64(55)) global_state/contract.py:6 - byte "global_int_simplified" // "global_int_simplified" self.global_int_simplified global_state/contract.py:7 - int 33 // "global_int_simplified",33 33 global_state/contract.py:7 - app_global_put // self.global_int_simplified = UInt64(33) global_state/contract.py:7 - byte "global_bytes_full" // "global_bytes_full" self.global_bytes_full global_state/contract.py:10 - byte "Hello" // "global_bytes_full","Hello" b"Hello" global_state/contract.py:10 - app_global_put // self.global_bytes_full = GlobalState(Bytes(b"Hello")) global_state/contract.py:10 - byte "global_bytes_simplified" // "global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:11 - byte "Hello" // "global_bytes_simplified","Hello" b"Hello" global_state/contract.py:11 - app_global_put // self.global_bytes_simplified = Bytes(b"Hello") global_state/contract.py:11 - retsub // + byte "global_int_full" // "global_int_full" self.global_int_full global_state/contract.py:6 + int 55 // "global_int_full",55 55 global_state/contract.py:6 + app_global_put // self.global_int_full = GlobalState(UInt64(55)) global_state/contract.py:6 + byte "global_int_simplified" // "global_int_simplified" self.global_int_simplified global_state/contract.py:7 + int 33 // "global_int_simplified",33 33 global_state/contract.py:7 + app_global_put // self.global_int_simplified = UInt64(33) global_state/contract.py:7 + byte "global_bytes_full" // "global_bytes_full" self.global_bytes_full global_state/contract.py:10 + byte "Hello" // "global_bytes_full","Hello" b"Hello" global_state/contract.py:10 + app_global_put // self.global_bytes_full = GlobalState(Bytes(b"Hello")) global_state/contract.py:10 + byte "global_bytes_simplified" // "global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:11 + byte "Hello" // "global_bytes_simplified","Hello" b"Hello" global_state/contract.py:11 + app_global_put // self.global_bytes_simplified = Bytes(b"Hello") global_state/contract.py:11 + retsub // diff --git a/examples/global_state/out/AppStateContract.approval.teal b/examples/global_state/out/AppStateContract.approval.teal index 4a980ca751..8fcb627b1f 100644 --- a/examples/global_state/out/AppStateContract.approval.teal +++ b/examples/global_state/out/AppStateContract.approval.teal @@ -1,8 +1,6 @@ #pragma version 10 examples.global_state.contract.AppStateContract.approval_program: - byte "" - dup txn ApplicationID bnz main_entrypoint@2 callsub __init__ @@ -90,19 +88,10 @@ main_entrypoint@2: byte "global_bytes_full" app_global_get_ex swap - bury 3 - bz main_ternary_false@4 - dig 1 - b main_ternary_merge@5 - -main_ternary_false@4: - // global_state/contract.py:27 - // assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" byte "default" - -main_ternary_merge@5: - // global_state/contract.py:27 - // assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" + swap + uncover 2 + select byte "Hello" == assert @@ -152,19 +141,10 @@ main_ternary_merge@5: byte "global_bytes_no_default" app_global_get_ex swap - bury 2 - bz main_ternary_false@7 - dup - b main_ternary_merge@8 - -main_ternary_false@7: - // global_state/contract.py:37 - // assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" byte "default" - -main_ternary_merge@8: - // global_state/contract.py:37 - // assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" + swap + uncover 2 + select byte "default" == assert diff --git a/examples/global_state/out/AppStateContract.destructured.ir b/examples/global_state/out/AppStateContract.destructured.ir index bbce93a70c..63d66eb11a 100644 --- a/examples/global_state/out/AppStateContract.destructured.ir +++ b/examples/global_state/out/AppStateContract.destructured.ir @@ -12,14 +12,14 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%2#0) // check value exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) - let (tmp%4#0: any, tmp%5#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert tmp%5#0) + let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert app_global_get_ex_did_exist%7#0) // check value exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) - let (tmp%9#0: any, tmp%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") - let tmp%11#0: uint64 = (! tmp%10#0) + let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") + let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) (assert tmp%11#0) (app_global_put "global_int_no_default" 44u) let (i_value#0: any, i_exists#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -30,46 +30,32 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%16#0) // check value exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) - let (tmp%18#0: any, tmp%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert tmp%19#0) + let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert app_global_get_ex_did_exist%21#0) // check value exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) - let (awst_tmp%23.0#0: any, awst_tmp%23.1#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - goto awst_tmp%23.1#0 ? block@3 : block@4 - block@3: // ternary_true_L27 - let ternary_result%24#1: bytes = awst_tmp%23.0#0 - goto block@5 - block@4: // ternary_false_L27 - let ternary_result%24#1: bytes = "default" - goto block@5 - block@5: // ternary_merge_L27 - let tmp%25#0: uint64 = (== ternary_result%24#1 "Hello") - (assert tmp%25#0) - let (tmp%26#0: any, tmp%27#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%28#0: uint64 = (! tmp%27#0) - (assert tmp%28#0) + let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) + let tmp%26#0: uint64 = (== tmp%25#0 "Hello") + (assert tmp%26#0) + let (global_bytes_no_default_exists%27#0: any, global_bytes_no_default_exists%28#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%29#0: uint64 = (! global_bytes_no_default_exists%28#0) + (assert tmp%29#0) (app_global_put "global_bytes_no_default" "World") let (b_value#0: any, b_exists#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") (assert b_exists#0) - let tmp%31#0: uint64 = (== b_value#0 "World") - (assert tmp%31#0) + let tmp%32#0: uint64 = (== b_value#0 "World") + (assert tmp%32#0) (app_global_del "global_bytes_no_default") let (b_value#0: any, b_exists#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%34#0: uint64 = (! b_exists#0) - (assert tmp%34#0) - let (awst_tmp%35.0#0: any, awst_tmp%35.1#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - goto awst_tmp%35.1#0 ? block@6 : block@7 - block@6: // ternary_true_L37 - let ternary_result%36#1: bytes = awst_tmp%35.0#0 - goto block@8 - block@7: // ternary_false_L37 - let ternary_result%36#1: bytes = "default" - goto block@8 - block@8: // ternary_merge_L37 - let tmp%37#0: uint64 = (== ternary_result%36#1 "default") - (assert tmp%37#0) + let tmp%35#0: uint64 = (! b_exists#0) + (assert tmp%35#0) + let (global_bytes_no_default_get_ex%36#0: any, global_bytes_no_default_get_ex%37#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%38#0: any = (select "default" global_bytes_no_default_get_ex%36#0 global_bytes_no_default_get_ex%37#0) + let tmp%39#0: uint64 = (== tmp%38#0 "default") + (assert tmp%39#0) return 1u subroutine examples.global_state.contract.AppStateContract.__init__() -> void: diff --git a/examples/global_state/out/AppStateContract.ssa.ir b/examples/global_state/out/AppStateContract.ssa.ir index a336bfd3f2..95c7e72760 100644 --- a/examples/global_state/out/AppStateContract.ssa.ir +++ b/examples/global_state/out/AppStateContract.ssa.ir @@ -12,14 +12,14 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%2#0) // check value exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) - let (tmp%4#0: any, tmp%5#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert tmp%5#0) + let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert app_global_get_ex_did_exist%7#0) // check value exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) - let (tmp%9#0: any, tmp%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") - let tmp%11#0: uint64 = (! tmp%10#0) + let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") + let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) (assert tmp%11#0) (app_global_put "global_int_no_default" 44u) let (tuple_assignment%12#0: any, tuple_assignment%13#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -32,52 +32,36 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%16#0) // check value exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) - let (tmp%18#0: any, tmp%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert tmp%19#0) + let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert app_global_get_ex_did_exist%21#0) // check value exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) - let (awst_tmp%23.0#0: any, awst_tmp%23.1#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - goto awst_tmp%23.1#0 ? block@3 : block@4 - block@3: // ternary_true_L27 - let ternary_result%24#0: any = awst_tmp%23.0#0 - goto block@5 - block@4: // ternary_false_L27 - let ternary_result%24#1: bytes = "default" - goto block@5 - block@5: // ternary_merge_L27 - let ternary_result%24#2: bytes = φ(ternary_result%24#0 <- block@3, ternary_result%24#1 <- block@4) - let tmp%25#0: uint64 = (== ternary_result%24#2 "Hello") - (assert tmp%25#0) - let (tmp%26#0: any, tmp%27#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%28#0: uint64 = (! tmp%27#0) - (assert tmp%28#0) + let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) + let tmp%26#0: uint64 = (== tmp%25#0 "Hello") + (assert tmp%26#0) + let (global_bytes_no_default_exists%27#0: any, global_bytes_no_default_exists%28#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%29#0: uint64 = (! global_bytes_no_default_exists%28#0) + (assert tmp%29#0) (app_global_put "global_bytes_no_default" "World") - let (tuple_assignment%29#0: any, tuple_assignment%30#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let b_value#0: any = tuple_assignment%29#0 - let b_exists#0: uint64 = tuple_assignment%30#0 + let (tuple_assignment%30#0: any, tuple_assignment%31#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let b_value#0: any = tuple_assignment%30#0 + let b_exists#0: uint64 = tuple_assignment%31#0 (assert b_exists#0) - let tmp%31#0: uint64 = (== b_value#0 "World") - (assert tmp%31#0) + let tmp%32#0: uint64 = (== b_value#0 "World") + (assert tmp%32#0) (app_global_del "global_bytes_no_default") - let (tuple_assignment%32#0: any, tuple_assignment%33#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let b_value#1: any = tuple_assignment%32#0 - let b_exists#1: uint64 = tuple_assignment%33#0 - let tmp%34#0: uint64 = (! b_exists#1) - (assert tmp%34#0) - let (awst_tmp%35.0#0: any, awst_tmp%35.1#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - goto awst_tmp%35.1#0 ? block@6 : block@7 - block@6: // ternary_true_L37 - let ternary_result%36#0: any = awst_tmp%35.0#0 - goto block@8 - block@7: // ternary_false_L37 - let ternary_result%36#1: bytes = "default" - goto block@8 - block@8: // ternary_merge_L37 - let ternary_result%36#2: bytes = φ(ternary_result%36#0 <- block@6, ternary_result%36#1 <- block@7) - let tmp%37#0: uint64 = (== ternary_result%36#2 "default") - (assert tmp%37#0) + let (tuple_assignment%33#0: any, tuple_assignment%34#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let b_value#1: any = tuple_assignment%33#0 + let b_exists#1: uint64 = tuple_assignment%34#0 + let tmp%35#0: uint64 = (! b_exists#1) + (assert tmp%35#0) + let (global_bytes_no_default_get_ex%36#0: any, global_bytes_no_default_get_ex%37#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%38#0: any = (select "default" global_bytes_no_default_get_ex%36#0 global_bytes_no_default_get_ex%37#0) + let tmp%39#0: uint64 = (== tmp%38#0 "default") + (assert tmp%39#0) return 1u subroutine examples.global_state.contract.AppStateContract.__init__() -> void: diff --git a/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir b/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir index 484f35af7d..b9688d8274 100644 --- a/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir +++ b/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir @@ -12,14 +12,14 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%2#0) // check value exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) - let (tmp%4#0: any, tmp%5#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert tmp%5#0) + let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert app_global_get_ex_did_exist%7#0) // check value exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) - let (tmp%9#0: any, tmp%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") - let tmp%11#0: uint64 = (! tmp%10#0) + let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") + let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) (assert tmp%11#0) (app_global_put "global_int_no_default" 44u) let (i_value#0: any, i_exists#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -30,46 +30,32 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%16#0) // check value exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) - let (tmp%18#0: any, tmp%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert tmp%19#0) + let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert app_global_get_ex_did_exist%21#0) // check value exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) - let (awst_tmp%23.0#0: any, awst_tmp%23.1#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - goto awst_tmp%23.1#0 ? block@3 : block@4 - block@3: // ternary_true_L27 - goto block@5 - block@4: // ternary_false_L27 - let ternary_result%24#1: bytes = "default" - goto block@5 - block@5: // ternary_merge_L27 - let ternary_result%24#2: bytes = φ(awst_tmp%23.0#0 <- block@3, ternary_result%24#1 <- block@4) - let tmp%25#0: uint64 = (== ternary_result%24#2 "Hello") - (assert tmp%25#0) - let (tmp%26#0: any, tmp%27#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%28#0: uint64 = (! tmp%27#0) - (assert tmp%28#0) + let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) + let tmp%26#0: uint64 = (== tmp%25#0 "Hello") + (assert tmp%26#0) + let (global_bytes_no_default_exists%27#0: any, global_bytes_no_default_exists%28#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%29#0: uint64 = (! global_bytes_no_default_exists%28#0) + (assert tmp%29#0) (app_global_put "global_bytes_no_default" "World") let (b_value#0: any, b_exists#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") (assert b_exists#0) - let tmp%31#0: uint64 = (== b_value#0 "World") - (assert tmp%31#0) + let tmp%32#0: uint64 = (== b_value#0 "World") + (assert tmp%32#0) (app_global_del "global_bytes_no_default") let (b_value#1: any, b_exists#1: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%34#0: uint64 = (! b_exists#1) - (assert tmp%34#0) - let (awst_tmp%35.0#0: any, awst_tmp%35.1#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - goto awst_tmp%35.1#0 ? block@6 : block@7 - block@6: // ternary_true_L37 - goto block@8 - block@7: // ternary_false_L37 - let ternary_result%36#1: bytes = "default" - goto block@8 - block@8: // ternary_merge_L37 - let ternary_result%36#2: bytes = φ(awst_tmp%35.0#0 <- block@6, ternary_result%36#1 <- block@7) - let tmp%37#0: uint64 = (== ternary_result%36#2 "default") - (assert tmp%37#0) + let tmp%35#0: uint64 = (! b_exists#1) + (assert tmp%35#0) + let (global_bytes_no_default_get_ex%36#0: any, global_bytes_no_default_get_ex%37#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%38#0: any = (select "default" global_bytes_no_default_get_ex%36#0 global_bytes_no_default_get_ex%37#0) + let tmp%39#0: uint64 = (== tmp%38#0 "default") + (assert tmp%39#0) return 1u subroutine examples.global_state.contract.AppStateContract.__init__() -> void: diff --git a/examples/global_state/out/contract.awst b/examples/global_state/out/contract.awst index 9bae6e9ca1..d580af8c2b 100644 --- a/examples/global_state/out/contract.awst +++ b/examples/global_state/out/contract.awst @@ -20,18 +20,18 @@ contract AppStateContract approval_program(): bool { assert(this.global_int_simplified == 33u) - assert(STATE_GET_EX(this.global_int_full)[1]) + assert(STATE_EXISTS(this.global_int_full)) assert(this.global_int_full == 55u) - assert(!(STATE_GET_EX(this.global_int_no_default)[1])) + assert(!(STATE_EXISTS(this.global_int_no_default))) this.global_int_no_default: puyapy.UInt64 = 44u (i_value, i_exists): tuple[puyapy.UInt64, bool] = STATE_GET_EX(this.global_int_no_default) assert(i_exists) assert(i_value == 44u) assert(this.global_bytes_simplified == 'Hello') - assert(STATE_GET_EX(this.global_bytes_full)[1]) + assert(STATE_EXISTS(this.global_bytes_full)) assert(this.global_bytes_full == 'Hello') - assert((tmp$0: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.global_bytes_full)[1]) ? (tmp$0[0]) : ('default') == 'Hello') - assert(!(STATE_GET_EX(this.global_bytes_no_default)[1])) + assert(STATE_GET(this.global_bytes_full, default='default') == 'Hello') + assert(!(STATE_EXISTS(this.global_bytes_no_default))) this.global_bytes_no_default: puyapy.Bytes = 'World' (b_value, b_exists): tuple[puyapy.Bytes, bool] = STATE_GET_EX(this.global_bytes_no_default) assert(b_exists) @@ -39,7 +39,7 @@ contract AppStateContract STATE_DELETE(this.global_bytes_no_default) (b_value, b_exists): tuple[puyapy.Bytes, bool] = STATE_GET_EX(this.global_bytes_no_default) assert(!(b_exists)) - assert((tmp$1: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.global_bytes_no_default)[1]) ? (tmp$1[0]) : ('default') == 'default') + assert(STATE_GET(this.global_bytes_no_default, default='default') == 'default') return true } diff --git a/examples/global_state/out_O2/AppStateContract.approval.teal b/examples/global_state/out_O2/AppStateContract.approval.teal index 8d45ac8548..859a79d022 100644 --- a/examples/global_state/out_O2/AppStateContract.approval.teal +++ b/examples/global_state/out_O2/AppStateContract.approval.teal @@ -1,8 +1,6 @@ #pragma version 10 examples.global_state.contract.AppStateContract.approval_program: - byte "" - dup txn ApplicationID bnz main_entrypoint@2 callsub __init__ @@ -66,15 +64,10 @@ main_entrypoint@2: byte "global_bytes_full" app_global_get_ex swap - bury 3 - bz main_ternary_false@4 - dig 1 - b main_ternary_merge@5 - -main_ternary_false@4: byte "default" - -main_ternary_merge@5: + swap + uncover 2 + select byte "Hello" == assert @@ -106,15 +99,10 @@ main_ternary_merge@5: byte "global_bytes_no_default" app_global_get_ex swap - bury 2 - bz main_ternary_false@7 - dup - b main_ternary_merge@8 - -main_ternary_false@7: byte "default" - -main_ternary_merge@8: + swap + uncover 2 + select byte "default" == assert diff --git a/examples/global_state/out_O2/AppStateContract.destructured.ir b/examples/global_state/out_O2/AppStateContract.destructured.ir index bbce93a70c..63d66eb11a 100644 --- a/examples/global_state/out_O2/AppStateContract.destructured.ir +++ b/examples/global_state/out_O2/AppStateContract.destructured.ir @@ -12,14 +12,14 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%2#0) // check value exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) - let (tmp%4#0: any, tmp%5#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert tmp%5#0) + let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert app_global_get_ex_did_exist%7#0) // check value exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) - let (tmp%9#0: any, tmp%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") - let tmp%11#0: uint64 = (! tmp%10#0) + let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") + let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) (assert tmp%11#0) (app_global_put "global_int_no_default" 44u) let (i_value#0: any, i_exists#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -30,46 +30,32 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%16#0) // check value exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) - let (tmp%18#0: any, tmp%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert tmp%19#0) + let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert app_global_get_ex_did_exist%21#0) // check value exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) - let (awst_tmp%23.0#0: any, awst_tmp%23.1#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - goto awst_tmp%23.1#0 ? block@3 : block@4 - block@3: // ternary_true_L27 - let ternary_result%24#1: bytes = awst_tmp%23.0#0 - goto block@5 - block@4: // ternary_false_L27 - let ternary_result%24#1: bytes = "default" - goto block@5 - block@5: // ternary_merge_L27 - let tmp%25#0: uint64 = (== ternary_result%24#1 "Hello") - (assert tmp%25#0) - let (tmp%26#0: any, tmp%27#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%28#0: uint64 = (! tmp%27#0) - (assert tmp%28#0) + let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) + let tmp%26#0: uint64 = (== tmp%25#0 "Hello") + (assert tmp%26#0) + let (global_bytes_no_default_exists%27#0: any, global_bytes_no_default_exists%28#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%29#0: uint64 = (! global_bytes_no_default_exists%28#0) + (assert tmp%29#0) (app_global_put "global_bytes_no_default" "World") let (b_value#0: any, b_exists#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") (assert b_exists#0) - let tmp%31#0: uint64 = (== b_value#0 "World") - (assert tmp%31#0) + let tmp%32#0: uint64 = (== b_value#0 "World") + (assert tmp%32#0) (app_global_del "global_bytes_no_default") let (b_value#0: any, b_exists#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%34#0: uint64 = (! b_exists#0) - (assert tmp%34#0) - let (awst_tmp%35.0#0: any, awst_tmp%35.1#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - goto awst_tmp%35.1#0 ? block@6 : block@7 - block@6: // ternary_true_L37 - let ternary_result%36#1: bytes = awst_tmp%35.0#0 - goto block@8 - block@7: // ternary_false_L37 - let ternary_result%36#1: bytes = "default" - goto block@8 - block@8: // ternary_merge_L37 - let tmp%37#0: uint64 = (== ternary_result%36#1 "default") - (assert tmp%37#0) + let tmp%35#0: uint64 = (! b_exists#0) + (assert tmp%35#0) + let (global_bytes_no_default_get_ex%36#0: any, global_bytes_no_default_get_ex%37#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%38#0: any = (select "default" global_bytes_no_default_get_ex%36#0 global_bytes_no_default_get_ex%37#0) + let tmp%39#0: uint64 = (== tmp%38#0 "default") + (assert tmp%39#0) return 1u subroutine examples.global_state.contract.AppStateContract.__init__() -> void: diff --git a/examples/global_state/out_unoptimized/AppStateContract.approval.teal b/examples/global_state/out_unoptimized/AppStateContract.approval.teal index 4fc5868f0b..811ccb6330 100644 --- a/examples/global_state/out_unoptimized/AppStateContract.approval.teal +++ b/examples/global_state/out_unoptimized/AppStateContract.approval.teal @@ -1,8 +1,6 @@ #pragma version 10 examples.global_state.contract.AppStateContract.approval_program: - byte "" - dup txn ApplicationID bnz main_entrypoint@2 callsub __init__ @@ -93,19 +91,10 @@ main_entrypoint@2: byte "global_bytes_full" app_global_get_ex swap - bury 3 - bz main_ternary_false@4 - dig 1 - b main_ternary_merge@5 - -main_ternary_false@4: - // global_state/contract.py:27 - // assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" byte "default" - -main_ternary_merge@5: - // global_state/contract.py:27 - // assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" + swap + uncover 2 + select byte "Hello" == assert @@ -157,19 +146,10 @@ main_ternary_merge@5: byte "global_bytes_no_default" app_global_get_ex swap - bury 2 - bz main_ternary_false@7 - dup - b main_ternary_merge@8 - -main_ternary_false@7: - // global_state/contract.py:37 - // assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" byte "default" - -main_ternary_merge@8: - // global_state/contract.py:37 - // assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" + swap + uncover 2 + select byte "default" == assert diff --git a/examples/global_state/out_unoptimized/AppStateContract.destructured.ir b/examples/global_state/out_unoptimized/AppStateContract.destructured.ir index ad906be79c..95b82656d2 100644 --- a/examples/global_state/out_unoptimized/AppStateContract.destructured.ir +++ b/examples/global_state/out_unoptimized/AppStateContract.destructured.ir @@ -12,14 +12,14 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%2#0) // check value exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) - let (tmp%4#0: any, tmp%5#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert tmp%5#0) + let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert app_global_get_ex_did_exist%7#0) // check value exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) - let (tmp%9#0: any, tmp%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") - let tmp%11#0: uint64 = (! tmp%10#0) + let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") + let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) (assert tmp%11#0) (app_global_put "global_int_no_default" 44u) let (tuple_assignment%12#0: any, tuple_assignment%13#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -32,49 +32,35 @@ contract examples.global_state.contract.AppStateContract: (assert app_global_get_ex_did_exist%16#0) // check value exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) - let (tmp%18#0: any, tmp%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert tmp%19#0) + let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert app_global_get_ex_did_exist%21#0) // check value exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) - let (awst_tmp%23.0#0: any, awst_tmp%23.1#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - goto awst_tmp%23.1#0 ? block@3 : block@4 - block@3: // ternary_true_L27 - let ternary_result%24#0: any = awst_tmp%23.0#0 - goto block@5 - block@4: // ternary_false_L27 - let ternary_result%24#0: any = "default" - goto block@5 - block@5: // ternary_merge_L27 - let tmp%25#0: uint64 = (== ternary_result%24#0 "Hello") - (assert tmp%25#0) - let (tmp%26#0: any, tmp%27#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let tmp%28#0: uint64 = (! tmp%27#0) - (assert tmp%28#0) + let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) + let tmp%26#0: uint64 = (== tmp%25#0 "Hello") + (assert tmp%26#0) + let (global_bytes_no_default_exists%27#0: any, global_bytes_no_default_exists%28#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%29#0: uint64 = (! global_bytes_no_default_exists%28#0) + (assert tmp%29#0) (app_global_put "global_bytes_no_default" "World") - let (tuple_assignment%29#0: any, tuple_assignment%30#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let b_value#0: any = tuple_assignment%29#0 - let b_exists#0: uint64 = tuple_assignment%30#0 + let (tuple_assignment%30#0: any, tuple_assignment%31#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let b_value#0: any = tuple_assignment%30#0 + let b_exists#0: uint64 = tuple_assignment%31#0 (assert b_exists#0) - let tmp%31#0: uint64 = (== b_value#0 "World") - (assert tmp%31#0) + let tmp%32#0: uint64 = (== b_value#0 "World") + (assert tmp%32#0) (app_global_del "global_bytes_no_default") - let (tuple_assignment%32#0: any, tuple_assignment%33#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - let b_exists#0: uint64 = tuple_assignment%33#0 - let tmp%34#0: uint64 = (! b_exists#0) - (assert tmp%34#0) - let (awst_tmp%35.0#0: any, awst_tmp%35.1#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") - goto awst_tmp%35.1#0 ? block@6 : block@7 - block@6: // ternary_true_L37 - let ternary_result%36#0: any = awst_tmp%35.0#0 - goto block@8 - block@7: // ternary_false_L37 - let ternary_result%36#0: any = "default" - goto block@8 - block@8: // ternary_merge_L37 - let tmp%37#0: uint64 = (== ternary_result%36#0 "default") - (assert tmp%37#0) + let (tuple_assignment%33#0: any, tuple_assignment%34#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let b_exists#0: uint64 = tuple_assignment%34#0 + let tmp%35#0: uint64 = (! b_exists#0) + (assert tmp%35#0) + let (global_bytes_no_default_get_ex%36#0: any, global_bytes_no_default_get_ex%37#0: uint64) = (app_global_get_ex 0u "global_bytes_no_default") + let tmp%38#0: any = (select "default" global_bytes_no_default_get_ex%36#0 global_bytes_no_default_get_ex%37#0) + let tmp%39#0: uint64 = (== tmp%38#0 "default") + (assert tmp%39#0) return 1u subroutine examples.global_state.contract.AppStateContract.__init__() -> void: diff --git a/examples/global_state/puya.log b/examples/global_state/puya.log index 4db1d54095..1ad7df865a 100644 --- a/examples/global_state/puya.log +++ b/examples/global_state/puya.log @@ -293,24 +293,6 @@ debug: Sealing block@None: // on_create_L5 debug: Terminated block@1: // on_create_L5 debug: Sealing block@2: // entrypoint_L5 debug: Terminated block@2: // entrypoint_L5 -debug: Sealing block@None: // ternary_true_L27 -debug: Sealing block@None: // ternary_false_L27 -debug: Terminated block@3: // ternary_true_L27 -debug: Terminated block@4: // ternary_false_L27 -debug: Sealing block@5: // ternary_merge_L27 -debug: Created Phi assignment: let ternary_result%24#2: bytes = undefined while trying to resolve 'ternary_result%24' in block@5: // ternary_merge_L27 -debug: Added ternary_result%24#0 to Phi node: let ternary_result%24#2: bytes = φ(ternary_result%24#0 <- block@3) in block@3: // ternary_true_L27 -debug: Added ternary_result%24#1 to Phi node: let ternary_result%24#2: bytes = φ(ternary_result%24#0 <- block@3, ternary_result%24#1 <- block@4) in block@4: // ternary_false_L27 -debug: Terminated block@5: // ternary_merge_L27 -debug: Sealing block@None: // ternary_true_L37 -debug: Sealing block@None: // ternary_false_L37 -debug: Terminated block@6: // ternary_true_L37 -debug: Terminated block@7: // ternary_false_L37 -debug: Sealing block@8: // ternary_merge_L37 -debug: Created Phi assignment: let ternary_result%36#2: bytes = undefined while trying to resolve 'ternary_result%36' in block@8: // ternary_merge_L37 -debug: Added ternary_result%36#0 to Phi node: let ternary_result%36#2: bytes = φ(ternary_result%36#0 <- block@6) in block@6: // ternary_true_L37 -debug: Added ternary_result%36#1 to Phi node: let ternary_result%36#2: bytes = φ(ternary_result%36#0 <- block@6, ternary_result%36#1 <- block@7) in block@7: // ternary_false_L37 -debug: Terminated block@8: // ternary_merge_L37 debug: Sealing block@0: // L40 debug: Terminated block@0: // L40 debug: Output IR to global_state/out/AppStateContract.ssa.ir @@ -325,25 +307,19 @@ debug: Found equivalence set: tuple_assignment%12#0, i_value#0 debug: Replacing {tuple_assignment%12#0} with i_value#0 made 1 modifications debug: Found equivalence set: tuple_assignment%13#0, i_exists#0 debug: Replacing {tuple_assignment%13#0} with i_exists#0 made 1 modifications -debug: Found equivalence set: awst_tmp%23.0#0, ternary_result%24#0 -debug: Replacing {ternary_result%24#0} with awst_tmp%23.0#0 made 1 modifications -debug: Found equivalence set: tuple_assignment%29#0, b_value#0 -debug: Replacing {tuple_assignment%29#0} with b_value#0 made 1 modifications -debug: Found equivalence set: tuple_assignment%30#0, b_exists#0 -debug: Replacing {tuple_assignment%30#0} with b_exists#0 made 1 modifications -debug: Found equivalence set: tuple_assignment%32#0, b_value#1 -debug: Replacing {tuple_assignment%32#0} with b_value#1 made 1 modifications -debug: Found equivalence set: tuple_assignment%33#0, b_exists#1 -debug: Replacing {tuple_assignment%33#0} with b_exists#1 made 1 modifications -debug: Found equivalence set: awst_tmp%35.0#0, ternary_result%36#0 -debug: Replacing {ternary_result%36#0} with awst_tmp%35.0#0 made 1 modifications +debug: Found equivalence set: tuple_assignment%30#0, b_value#0 +debug: Replacing {tuple_assignment%30#0} with b_value#0 made 1 modifications +debug: Found equivalence set: tuple_assignment%31#0, b_exists#0 +debug: Replacing {tuple_assignment%31#0} with b_exists#0 made 1 modifications +debug: Found equivalence set: tuple_assignment%33#0, b_value#1 +debug: Replacing {tuple_assignment%33#0} with b_value#1 made 1 modifications +debug: Found equivalence set: tuple_assignment%34#0, b_exists#1 +debug: Replacing {tuple_assignment%34#0} with b_exists#1 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@3: // ternary_true_L27 because it's used by phi nodes -debug: Not removing empty block block@6: // ternary_true_L37 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.global_state.contract.AppStateContract.__init__ @@ -381,8 +357,6 @@ debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@3: // ternary_true_L27 because it's used by phi nodes -debug: Not removing empty block block@6: // ternary_true_L37 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.global_state.contract.AppStateContract.__init__ @@ -412,11 +386,9 @@ debug: Removing Phis from examples.global_state.contract.AppStateContract.approv debug: Removing Phis from examples.global_state.contract.AppStateContract.__init__ debug: Removing Phis from examples.global_state.contract.AppStateContract.clear_state_program debug: Coalescing local variables in examples.global_state.contract.AppStateContract.approval_program using strategy RootOperandGrouping -debug: Coalescing ternary_result%24#1 with [ternary_result%24#4, ternary_result%24#2] debug: Coalescing b_value#0 with [b_value#1] debug: Coalescing b_exists#0 with [b_exists#1] -debug: Coalescing ternary_result%36#1 with [ternary_result%36#4, ternary_result%36#2] -debug: Coalescing resulted in 13 replacement/s +debug: Coalescing resulted in 3 replacement/s debug: Coalescing local variables in examples.global_state.contract.AppStateContract.__init__ using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.global_state.contract.AppStateContract.clear_state_program using strategy RootOperandGrouping @@ -440,24 +412,46 @@ debug: Inserted main_entrypoint@2.ops[73]: 'store tmp%17#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[75]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[94]: 'store tmp%22#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[96]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[107]: 'store tmp%25#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[109]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[112]: 'store tmp%26#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[114]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[123]: 'store tmp%29#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[125]: 'load tmp%29#0' with 'load tmp%29#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[140]: 'store tmp%32#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[142]: 'load tmp%32#0' with 'load tmp%32#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[153]: 'store tmp%35#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[155]: 'load tmp%35#0' with 'load tmp%35#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[166]: 'store tmp%38#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[168]: 'load tmp%38#0' with 'load tmp%38#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[171]: 'store tmp%39#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[173]: 'load tmp%39#0' with 'load tmp%39#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[3]: 'store app_global_get_ex_did_exist%2#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[6]: 'load app_global_get_ex_did_exist%2#0' with 'load app_global_get_ex_did_exist%2#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[18]: 'store tmp%5#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[21]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[18]: 'store global_int_full_exists%5#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[21]: 'load global_int_full_exists%5#0' with 'load global_int_full_exists%5#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[26]: 'store app_global_get_ex_did_exist%7#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[29]: 'load app_global_get_ex_did_exist%7#0' with 'load app_global_get_ex_did_exist%7#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[41]: 'store tmp%10#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[44]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[41]: 'store global_int_no_default_exists%10#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[44]: 'load global_int_no_default_exists%10#0' with 'load global_int_no_default_exists%10#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[56]: 'store i_exists#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[59]: 'load i_exists#0' with 'load i_exists#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[71]: 'store app_global_get_ex_did_exist%16#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[74]: 'load app_global_get_ex_did_exist%16#0' with 'load app_global_get_ex_did_exist%16#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[86]: 'store tmp%19#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[89]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[86]: 'store global_bytes_full_exists%19#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[89]: 'load global_bytes_full_exists%19#0' with 'load global_bytes_full_exists%19#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[94]: 'store app_global_get_ex_did_exist%21#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[97]: 'load app_global_get_ex_did_exist%21#0' with 'load app_global_get_ex_did_exist%21#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[109]: 'store awst_tmp%23.1#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[112]: 'load awst_tmp%23.1#0' with 'load awst_tmp%23.1#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[110]: 'store global_bytes_full_get_ex%23#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[113]: 'load global_bytes_full_get_ex%23#0' with 'load global_bytes_full_get_ex%23#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[128]: 'store global_bytes_no_default_exists%28#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[131]: 'load global_bytes_no_default_exists%28#0' with 'load global_bytes_no_default_exists%28#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[143]: 'store b_exists#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[146]: 'load b_exists#0' with 'load b_exists#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[160]: 'store b_exists#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[163]: 'load b_exists#0' with 'load b_exists#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[173]: 'store global_bytes_no_default_get_ex%36#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[176]: 'load global_bytes_no_default_get_ex%36#0' with 'load global_bytes_no_default_get_ex%36#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[5]: 'store app_global_get_ex_value%1#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[9]: 'load app_global_get_ex_value%1#0' with 'load app_global_get_ex_value%1#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[29]: 'store app_global_get_ex_value%6#0 to l-stack (copy)' @@ -468,33 +462,12 @@ debug: Inserted main_entrypoint@2.ops[76]: 'store app_global_get_ex_value%15#0 t debug: Replaced main_entrypoint@2.ops[80]: 'load app_global_get_ex_value%15#0' with 'load app_global_get_ex_value%15#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[100]: 'store app_global_get_ex_value%20#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[104]: 'load app_global_get_ex_value%20#0' with 'load app_global_get_ex_value%20#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[3]: 'store tmp%25#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[5]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[14]: 'store tmp%28#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[16]: 'load tmp%28#0' with 'load tmp%28#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[31]: 'store tmp%31#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[33]: 'load tmp%31#0' with 'load tmp%31#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[44]: 'store tmp%34#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[46]: 'load tmp%34#0' with 'load tmp%34#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[10]: 'store tmp%27#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[13]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[25]: 'store b_exists#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[28]: 'load b_exists#0' with 'load b_exists#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[42]: 'store b_exists#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[45]: 'load b_exists#0' with 'load b_exists#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[54]: 'store awst_tmp%35.1#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[57]: 'load awst_tmp%35.1#0' with 'load awst_tmp%35.1#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@5.ops[27]: 'store b_value#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@5.ops[31]: 'load b_value#0' with 'load b_value#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@8.ops[3]: 'store tmp%37#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@8.ops[5]: 'load tmp%37#0' with 'load tmp%37#0 from l-stack (no copy)' -debug: Found 5 edge set/s for examples.global_state.contract.AppStateContract.approval_program -debug: Allocated 2 variable/s to x-stack: ternary_result%24#1, ternary_result%36#1 -debug: shared x-stack for main_ternary_true@3 -> main_ternary_merge@5: ternary_result%24#1 -debug: shared x-stack for main_ternary_false@4 -> main_ternary_merge@5: ternary_result%24#1 -debug: shared x-stack for main_ternary_true@6 -> main_ternary_merge@8: ternary_result%36#1 -debug: shared x-stack for main_ternary_false@7 -> main_ternary_merge@8: ternary_result%36#1 -debug: examples.global_state.contract.AppStateContract.approval_program f-stack entry: ['awst_tmp%23.0#0', 'awst_tmp%35.0#0'] -debug: examples.global_state.contract.AppStateContract.approval_program f-stack on first store: [] +debug: Inserted main_entrypoint@2.ops[150]: 'store b_value#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[154]: 'load b_value#0' with 'load b_value#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[114]: 'store global_bytes_full_get_ex%24#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[120]: 'load global_bytes_full_get_ex%24#0' with 'load global_bytes_full_get_ex%24#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[179]: 'store global_bytes_no_default_get_ex%37#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[185]: 'load global_bytes_no_default_get_ex%37#0' with 'load global_bytes_no_default_get_ex%37#0 from l-stack (no copy)' +debug: Found 1 edge set/s for examples.global_state.contract.AppStateContract.approval_program info: Writing global_state/out/AppStateContract.approval.teal info: Writing global_state/out/AppStateContract.clear.teal \ No newline at end of file diff --git a/examples/sizes.txt b/examples/sizes.txt index d606112f0b..60d5a66767 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -31,7 +31,7 @@ control_op_simplification 48 52 46 edverify/Verify 43 37 37 enumeration/Enumeration 551 501 501 everything 479 460 460 -global_state/AppState 319 319 319 +global_state/AppState 305 305 305 hello_world/HelloWorld 23 22 22 hello_world_arc4/HelloWorld 110 89 89 inner_transactions 1862 1222 1222 diff --git a/src/puya/awst/function_traverser.py b/src/puya/awst/function_traverser.py index 83045b8443..39bc00dcae 100644 --- a/src/puya/awst/function_traverser.py +++ b/src/puya/awst/function_traverser.py @@ -258,3 +258,10 @@ def visit_state_get_ex(self, expr: awst_nodes.StateGetEx) -> None: def visit_state_delete(self, statement: awst_nodes.StateDelete) -> None: statement.field.accept(self) + + def visit_state_get(self, expr: awst_nodes.StateGet) -> None: + expr.field.accept(self) + expr.default.accept(self) + + def visit_state_exists(self, expr: awst_nodes.StateExists) -> None: + expr.field.accept(self) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index bfe5e52aed..b9335101e0 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -1432,25 +1432,30 @@ def accept(self, visitor: StatementVisitor[T]) -> T: StateExpression: t.TypeAlias = AppStateExpression | AppAccountStateExpression -# @attrs.frozen -# class StateGet(Expression): -# field: StateExpression -# default: Expression | None = attrs.field() -# wtype: WType = attrs.field(init=False) -# -# @default.validator -# def _check_default(self, _attribute: object, default: Expression | None) -> None: -# if default is not None and self.field.wtype != default.wtype: -# raise CodeError( -# "Default state value should match storage type", default.source_location -# ) -# -# @wtype.default -# def _wtype_factory(self) -> WType: -# return self.field.wtype -# -# def accept(self, visitor: ExpressionVisitor[T]) -> T: -# return visitor.visit_state_get(self) +@attrs.frozen +class StateGet(Expression): + """ + Get value or default if unset - note that for get without a default, + can just use the underlying StateExpression + """ + + field: StateExpression + default: Expression = attrs.field() + wtype: WType = attrs.field(init=False) + + @default.validator + def _check_default(self, _attribute: object, default: Expression) -> None: + if self.field.wtype != default.wtype: + raise CodeError( + "Default state value should match storage type", default.source_location + ) + + @wtype.default + def _wtype_factory(self) -> WType: + return self.field.wtype + + def accept(self, visitor: ExpressionVisitor[T]) -> T: + return visitor.visit_state_get(self) @attrs.frozen @@ -1466,13 +1471,13 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T: return visitor.visit_state_get_ex(self) -# @attrs.frozen -# class StateExists(Expression): -# field: StateExpression -# wtype: WType = attrs.field(default=wtypes.bool_wtype, init=False) -# -# def accept(self, visitor: ExpressionVisitor[T]) -> T: -# return visitor.visit_state_exists(self) +@attrs.frozen +class StateExists(Expression): + field: StateExpression + wtype: WType = attrs.field(default=wtypes.bool_wtype, init=False) + + def accept(self, visitor: ExpressionVisitor[T]) -> T: + return visitor.visit_state_exists(self) @attrs.frozen diff --git a/src/puya/awst/to_code_visitor.py b/src/puya/awst/to_code_visitor.py index 7942adec57..34751c625a 100644 --- a/src/puya/awst/to_code_visitor.py +++ b/src/puya/awst/to_code_visitor.py @@ -4,11 +4,7 @@ from puya.awst import nodes, wtypes from puya.awst.nodes import AppStateKind -from puya.awst.visitors import ( - ExpressionVisitor, - ModuleStatementVisitor, - StatementVisitor, -) +from puya.awst.visitors import ExpressionVisitor, ModuleStatementVisitor, StatementVisitor from puya.errors import InternalError @@ -530,6 +526,12 @@ def visit_state_get_ex(self, expr: nodes.StateGetEx) -> str: def visit_state_delete(self, statement: nodes.StateDelete) -> list[str]: return [f"STATE_DELETE({statement.field.accept(self)})"] + def visit_state_get(self, expr: nodes.StateGet) -> str: + return f"STATE_GET({expr.field.accept(self)}, default={expr.default.accept(self)})" + + def visit_state_exists(self, expr: nodes.StateExists) -> str: + return f"STATE_EXISTS({expr.field.accept(self)})" + def _indent(lines: t.Iterable[str], indent_size: str = " ") -> t.Iterator[str]: yield from (f"{indent_size}{line}" for line in lines) diff --git a/src/puya/awst/visitors.py b/src/puya/awst/visitors.py index 02f566cdc2..ba5a906680 100644 --- a/src/puya/awst/visitors.py +++ b/src/puya/awst/visitors.py @@ -296,14 +296,14 @@ def visit_copy(self, expr: puya.awst.nodes.Copy) -> T: def visit_reversed(self, expr: puya.awst.nodes.Reversed) -> T: ... - # @abstractmethod - # def visit_state_get(self, expr: puya.awst.nodes.StateGet) -> T: - # ... + @abstractmethod + def visit_state_get(self, expr: puya.awst.nodes.StateGet) -> T: + ... @abstractmethod def visit_state_get_ex(self, expr: puya.awst.nodes.StateGetEx) -> T: ... - # @abstractmethod - # def visit_state_exists(self, expr: puya.awst.nodes.StateExists) -> T: - # ... + @abstractmethod + def visit_state_exists(self, expr: puya.awst.nodes.StateExists) -> T: + ... diff --git a/src/puya/awst_build/eb/app_state.py b/src/puya/awst_build/eb/app_state.py index 1fd5806c90..0e31cd9380 100644 --- a/src/puya/awst_build/eb/app_state.py +++ b/src/puya/awst_build/eb/app_state.py @@ -8,14 +8,14 @@ AppStateExpression, AppStateKind, BytesEncoding, - ConditionalExpression, Expression, Literal, Not, StateDelete, + StateExists, + StateGet, StateGetEx, Statement, - TupleItemExpression, ) from puya.awst_build import constants from puya.awst_build.contract_data import AppStateDeclaration @@ -29,7 +29,6 @@ from puya.awst_build.eb.value_proxy import ValueProxyExpressionBuilder from puya.awst_build.eb.var_factory import var_expression from puya.awst_build.utils import ( - create_temporary_assignment, expect_operand_wtype, get_arg_mapping, ) @@ -37,12 +36,6 @@ from puya.parse import SourceLocation -def _build_field(state_decl: AppStateDeclaration, location: SourceLocation) -> AppStateExpression: - return AppStateExpression( - field_name=state_decl.member_name, wtype=state_decl.storage_wtype, source_location=location - ) - - class AppStateClassExpressionBuilder(IntermediateExpressionBuilder): def __init__(self, location: SourceLocation): super().__init__(location) @@ -158,11 +151,7 @@ def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation) -> super().__init__(location) def bool_eval(self, location: SourceLocation, *, negate: bool = False) -> ExpressionBuilder: - exists_expr = TupleItemExpression( - source_location=location, - base=_build_app_global_get_ex(self.state_decl, location), - index=1, - ) + exists_expr = StateExists(field=self._build_field(location), source_location=location) if negate: expr: Expression = Not(location, exists_expr) else: @@ -170,31 +159,30 @@ def bool_eval(self, location: SourceLocation, *, negate: bool = False) -> Expres return var_expression(expr) def member_access(self, name: str, location: SourceLocation) -> ExpressionBuilder | Literal: + field = self._build_field(self.source_location) match name: case "value": - return AppStateValueExpressionBuilder( - state_decl=self.state_decl, - location=self.source_location, - ) + return AppStateValueExpressionBuilder(field) case "get": - return AppStateGetExpressionBuilder( - state_decl=self.state_decl, location=self.source_location - ) + return AppStateGetExpressionBuilder(field, location=self.source_location) case "maybe": - return AppStateMaybeExpressionBuilder( - state_decl=self.state_decl, location=self.source_location - ) + return AppStateMaybeExpressionBuilder(field, location=self.source_location) case _: return super().member_access(name, location) + def _build_field(self, location: SourceLocation) -> AppStateExpression: + return AppStateExpression( + field_name=self.state_decl.member_name, + wtype=self.state_decl.storage_wtype, + source_location=location, + ) -class AppStateMethodBaseExpressionBuilder(IntermediateExpressionBuilder): - def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation) -> None: - super().__init__(location) - self.state_decl = state_decl +class AppStateMaybeExpressionBuilder(IntermediateExpressionBuilder): + def __init__(self, field: AppStateExpression, location: SourceLocation) -> None: + super().__init__(location) + self.field = field -class AppStateMaybeExpressionBuilder(AppStateMethodBaseExpressionBuilder): def call( self, args: Sequence[ExpressionBuilder | Literal], @@ -203,14 +191,17 @@ def call( location: SourceLocation, original_expr: mypy.nodes.CallExpr, ) -> ExpressionBuilder: - match args: - case []: - return var_expression(_build_app_global_get_ex(self.state_decl, location)) - case _: - raise CodeError("Unexpected/unhandled arguments", location) + if args: + raise CodeError("Unexpected/unhandled arguments", location) + expr = StateGetEx(field=self.field, source_location=location) + return var_expression(expr) -class AppStateGetExpressionBuilder(AppStateMethodBaseExpressionBuilder): +class AppStateGetExpressionBuilder(IntermediateExpressionBuilder): + def __init__(self, field: AppStateExpression, location: SourceLocation) -> None: + super().__init__(location) + self.field = field + def call( self, args: Sequence[ExpressionBuilder | Literal], @@ -222,38 +213,17 @@ def call( if len(args) != 1: raise CodeError(f"Expected 1 argument, got {len(args)}", location) (default_arg,) = args - default_expr = expect_operand_wtype( - default_arg, target_wtype=self.state_decl.storage_wtype - ) - app_global_get_ex = create_temporary_assignment( - _build_app_global_get_ex(self.state_decl, location), location - ) - conditional_expr = ConditionalExpression( - location, - wtype=self.state_decl.storage_wtype, - condition=TupleItemExpression( - app_global_get_ex.define, index=1, source_location=location - ), - true_expr=TupleItemExpression( - app_global_get_ex.read, index=0, source_location=location - ), - false_expr=default_expr, - ) - return var_expression(conditional_expr) - - -def _build_app_global_get_ex( - state_decl: AppStateDeclaration, location: SourceLocation -) -> StateGetEx: - return StateGetEx(field=_build_field(state_decl, location), source_location=location) + default_expr = expect_operand_wtype(default_arg, target_wtype=self.field.wtype) + expr = StateGet(field=self.field, default=default_expr, source_location=location) + return var_expression(expr) class AppStateValueExpressionBuilder(ValueProxyExpressionBuilder): - def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation): - assert state_decl.kind is AppStateKind.app_global - self.__field = _build_field(state_decl, location) - self.wtype = state_decl.storage_wtype - super().__init__(self.__field) + expr: AppStateExpression + + def __init__(self, expr: AppStateExpression): + self.wtype = expr.wtype + super().__init__(expr) def delete(self, location: SourceLocation) -> Statement: - return StateDelete(field=self.__field, source_location=location) + return StateDelete(field=self.expr, source_location=location) diff --git a/src/puya/ir/builder/main.py b/src/puya/ir/builder/main.py index d02836c639..adf5333d2e 100644 --- a/src/puya/ir/builder/main.py +++ b/src/puya/ir/builder/main.py @@ -588,7 +588,6 @@ def visit_state_get_ex(self, expr: awst_nodes.StateGetEx) -> TExpression: subject = expr.field state_def = self.context.resolve_state(subject.field_name, subject.source_location) current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - # TODO: keep encoding? modify AWST to add source location for key? key = BytesConstant( value=state_def.key, source_location=subject.source_location, @@ -610,7 +609,6 @@ def visit_state_get_ex(self, expr: awst_nodes.StateGetEx) -> TExpression: def visit_state_delete(self, statement: awst_nodes.StateDelete) -> TStatement: subject = statement.field state_def = self.context.resolve_state(subject.field_name, subject.source_location) - # TODO: keep encoding? modify AWST to add source location for key? key = BytesConstant( value=state_def.key, source_location=subject.source_location, @@ -631,6 +629,64 @@ def visit_state_delete(self, statement: awst_nodes.StateDelete) -> TStatement: ) ) + def visit_state_get(self, expr: awst_nodes.StateGet) -> TExpression: + subject = expr.field + state_def = self.context.resolve_state(subject.field_name, subject.source_location) + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [current_app_offset, key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_get_ex + else: + op = AVMOp.app_local_get_ex + account = self.visit_and_materialise_single(subject.account) + args.insert(0, account) + default = self.visit_and_materialise_single(expr.default) + maybe_value, exists = self.materialise_value_provider( + Intrinsic( + op=op, + args=args, + source_location=expr.source_location, + ), + description=f"{subject.field_name}_get_ex", + ) + return Intrinsic( + op=AVMOp.select, + args=[default, maybe_value, exists], + source_location=expr.source_location, + ) + + def visit_state_exists(self, expr: awst_nodes.StateExists) -> TExpression: + subject = expr.field + state_def = self.context.resolve_state(subject.field_name, subject.source_location) + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [current_app_offset, key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_get_ex + else: + op = AVMOp.app_local_get_ex + account = self.visit_and_materialise_single(subject.account) + args.insert(0, account) + _, exists = self.materialise_value_provider( + Intrinsic( + op=op, + args=args, + source_location=expr.source_location, + ), + description=f"{subject.field_name}_exists", + ) + return exists + def visit_new_array(self, expr: awst_nodes.NewArray) -> TExpression: raise TodoError(expr.source_location, "TODO: visit_new_array") From e410fcef29a1e703403b792848d5df02ecead13d Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 18:25:58 +0800 Subject: [PATCH 20/40] wip --- src/puya/ir/builder/main.py | 193 ++----------------------------- src/puya/ir/builder/state.py | 217 +++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+), 186 deletions(-) create mode 100644 src/puya/ir/builder/state.py diff --git a/src/puya/ir/builder/main.py b/src/puya/ir/builder/main.py index adf5333d2e..1d05589841 100644 --- a/src/puya/ir/builder/main.py +++ b/src/puya/ir/builder/main.py @@ -15,7 +15,7 @@ ) from puya.errors import CodeError, InternalError, TodoError from puya.ir.avm_ops import AVMOp -from puya.ir.builder import arc4, flow_control +from puya.ir.builder import arc4, flow_control, state from puya.ir.builder.assignment import handle_assignment, handle_assignment_expr from puya.ir.builder.iteration import handle_for_in_loop from puya.ir.builder.itxn import InnerTransactionBuilder @@ -489,203 +489,24 @@ def visit_temporary_variable(self, expr: awst_nodes.TemporaryVariable) -> TExpre return ValueTuple(expr.source_location, registers) def visit_app_state_expression(self, expr: awst_nodes.AppStateExpression) -> TExpression: - state_def = self.context.resolve_state(expr.field_name, expr.source_location) - # TODO: add specific (unsafe) optimisation flag to allow skipping this check - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - # TODO: keep encoding? modify AWST to add source location for key? - key = BytesConstant( - value=state_def.key, - source_location=expr.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - - # note: we manually construct temporary targets here since atype is any, - # but we "know" the type from the expression - value_atype = wtype_to_avm_type(expr.wtype) - value_tmp = mktemp( - self.context, - atype=value_atype, - source_location=expr.source_location, - description="app_global_get_ex_value", - ) - did_exist_tmp = mktemp( - self.context, - atype=AVMType.uint64, - source_location=expr.source_location, - description="app_global_get_ex_did_exist", - ) - assign_targets( - self.context, - source=Intrinsic( - op=AVMOp.app_global_get_ex, - args=[current_app_offset, key], - source_location=expr.source_location, - ), - targets=[value_tmp, did_exist_tmp], - assignment_location=expr.source_location, - ) - self.context.block_builder.add( - Intrinsic( - op=AVMOp.assert_, - args=[did_exist_tmp], - comment="check value exists", # TODO: add field name here - source_location=expr.source_location, - ) - ) - - return value_tmp + return state.visit_app_state_expression(self.context, expr) def visit_app_account_state_expression( self, expr: awst_nodes.AppAccountStateExpression ) -> TExpression: - state_def = self.context.resolve_state(expr.field_name, expr.source_location) - account = self.visit_and_materialise_single(expr.account) - - # TODO: add specific (unsafe) optimisation flag to allow skipping this check - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - # TODO: keep encoding? modify AWST to add source location for key? - key = BytesConstant( - value=state_def.key, - source_location=expr.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - - # note: we manually construct temporary targets here since atype is any, - # but we "know" the type from the expression - value_tmp = mktemp( - self.context, - atype=wtype_to_avm_type(expr.wtype), - source_location=expr.source_location, - description="app_local_get_ex_value", - ) - did_exist_tmp = mktemp( - self.context, - atype=AVMType.uint64, - source_location=expr.source_location, - description="app_local_get_ex_did_exist", - ) - assign_targets( - self.context, - source=Intrinsic( - op=AVMOp.app_local_get_ex, - args=[account, current_app_offset, key], - source_location=expr.source_location, - ), - targets=[value_tmp, did_exist_tmp], - assignment_location=expr.source_location, - ) - self.context.block_builder.add( - Intrinsic( - op=AVMOp.assert_, - args=[did_exist_tmp], - comment="check value exists", # TODO: add field name here - source_location=expr.source_location, - ) - ) - return value_tmp + return state.visit_app_account_state_expression(self.context, expr) def visit_state_get_ex(self, expr: awst_nodes.StateGetEx) -> TExpression: - subject = expr.field - state_def = self.context.resolve_state(subject.field_name, subject.source_location) - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - key = BytesConstant( - value=state_def.key, - source_location=subject.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - args: list[Value] = [current_app_offset, key] - if isinstance(subject, awst_nodes.AppStateExpression): - op = AVMOp.app_global_get_ex - else: - op = AVMOp.app_local_get_ex - account = self.visit_and_materialise_single(subject.account) - args.insert(0, account) - return Intrinsic( - op=op, - args=args, - source_location=expr.source_location, - ) + return state.visit_state_get_ex(self.context, expr) def visit_state_delete(self, statement: awst_nodes.StateDelete) -> TStatement: - subject = statement.field - state_def = self.context.resolve_state(subject.field_name, subject.source_location) - key = BytesConstant( - value=state_def.key, - source_location=subject.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - args: list[Value] = [key] - if isinstance(subject, awst_nodes.AppStateExpression): - op = AVMOp.app_global_del - else: - op = AVMOp.app_local_del - account = self.visit_and_materialise_single(subject.account) - args.insert(0, account) - self.context.block_builder.add( - Intrinsic( - op=op, - args=args, - source_location=statement.source_location, - ) - ) + return state.visit_state_delete(self.context, statement) def visit_state_get(self, expr: awst_nodes.StateGet) -> TExpression: - subject = expr.field - state_def = self.context.resolve_state(subject.field_name, subject.source_location) - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - - key = BytesConstant( - value=state_def.key, - source_location=subject.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - args: list[Value] = [current_app_offset, key] - if isinstance(subject, awst_nodes.AppStateExpression): - op = AVMOp.app_global_get_ex - else: - op = AVMOp.app_local_get_ex - account = self.visit_and_materialise_single(subject.account) - args.insert(0, account) - default = self.visit_and_materialise_single(expr.default) - maybe_value, exists = self.materialise_value_provider( - Intrinsic( - op=op, - args=args, - source_location=expr.source_location, - ), - description=f"{subject.field_name}_get_ex", - ) - return Intrinsic( - op=AVMOp.select, - args=[default, maybe_value, exists], - source_location=expr.source_location, - ) + return state.visit_state_get(self.context, expr) def visit_state_exists(self, expr: awst_nodes.StateExists) -> TExpression: - subject = expr.field - state_def = self.context.resolve_state(subject.field_name, subject.source_location) - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - key = BytesConstant( - value=state_def.key, - source_location=subject.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - args: list[Value] = [current_app_offset, key] - if isinstance(subject, awst_nodes.AppStateExpression): - op = AVMOp.app_global_get_ex - else: - op = AVMOp.app_local_get_ex - account = self.visit_and_materialise_single(subject.account) - args.insert(0, account) - _, exists = self.materialise_value_provider( - Intrinsic( - op=op, - args=args, - source_location=expr.source_location, - ), - description=f"{subject.field_name}_exists", - ) - return exists + return state.visit_state_exists(self.context, expr) def visit_new_array(self, expr: awst_nodes.NewArray) -> TExpression: raise TodoError(expr.source_location, "TODO: visit_new_array") diff --git a/src/puya/ir/builder/state.py b/src/puya/ir/builder/state.py new file mode 100644 index 0000000000..53d53a5a2e --- /dev/null +++ b/src/puya/ir/builder/state.py @@ -0,0 +1,217 @@ + +from puya.avm_type import AVMType +from puya.awst import nodes as awst_nodes +from puya.ir.avm_ops import AVMOp +from puya.ir.builder.utils import assign_targets, mktemp +from puya.ir.context import IRFunctionBuildContext +from puya.ir.models import BytesConstant, Intrinsic, UInt64Constant, Value, ValueProvider +from puya.ir.types_ import bytes_enc_to_avm_bytes_enc, wtype_to_avm_type + + +def visit_app_state_expression( + context: IRFunctionBuildContext, expr: awst_nodes.AppStateExpression +) -> ValueProvider: + state_def = context.resolve_state(expr.field_name, expr.source_location) + # TODO: add specific (unsafe) optimisation flag to allow skipping this check + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + key = BytesConstant( + value=state_def.key, + source_location=expr.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + + # note: we manually construct temporary targets here since atype is any, + # but we "know" the type from the expression + value_atype = wtype_to_avm_type(expr.wtype) + value_tmp = mktemp( + context, + atype=value_atype, + source_location=expr.source_location, + description="app_global_get_ex_value", + ) + did_exist_tmp = mktemp( + context, + atype=AVMType.uint64, + source_location=expr.source_location, + description="app_global_get_ex_did_exist", + ) + assign_targets( + context, + source=Intrinsic( + op=AVMOp.app_global_get_ex, + args=[current_app_offset, key], + source_location=expr.source_location, + ), + targets=[value_tmp, did_exist_tmp], + assignment_location=expr.source_location, + ) + context.block_builder.add( + Intrinsic( + op=AVMOp.assert_, + args=[did_exist_tmp], + comment=f"check {expr.field_name} exists", + source_location=expr.source_location, + ) + ) + + return value_tmp + + +def visit_app_account_state_expression( + context: IRFunctionBuildContext, expr: awst_nodes.AppAccountStateExpression +) -> ValueProvider: + state_def = context.resolve_state(expr.field_name, expr.source_location) + account = context.visitor.visit_and_materialise_single(expr.account) + + # TODO: add specific (unsafe) optimisation flag to allow skipping this check + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + key = BytesConstant( + value=state_def.key, + source_location=expr.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + + # note: we manually construct temporary targets here since atype is any, + # but we "know" the type from the expression + value_tmp = mktemp( + context, + atype=wtype_to_avm_type(expr.wtype), + source_location=expr.source_location, + description="app_local_get_ex_value", + ) + did_exist_tmp = mktemp( + context, + atype=AVMType.uint64, + source_location=expr.source_location, + description="app_local_get_ex_did_exist", + ) + assign_targets( + context, + source=Intrinsic( + op=AVMOp.app_local_get_ex, + args=[account, current_app_offset, key], + source_location=expr.source_location, + ), + targets=[value_tmp, did_exist_tmp], + assignment_location=expr.source_location, + ) + context.block_builder.add( + Intrinsic( + op=AVMOp.assert_, + args=[did_exist_tmp], + comment=f"check {expr.field_name} exists", + source_location=expr.source_location, + ) + ) + return value_tmp + + +def visit_state_get_ex( + context: IRFunctionBuildContext, expr: awst_nodes.StateGetEx +) -> ValueProvider: + subject = expr.field + state_def = context.resolve_state(subject.field_name, subject.source_location) + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [current_app_offset, key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_get_ex + else: + op = AVMOp.app_local_get_ex + account = context.visitor.visit_and_materialise_single(subject.account) + args.insert(0, account) + return Intrinsic( + op=op, + args=args, + source_location=expr.source_location, + ) + + +def visit_state_delete(context: IRFunctionBuildContext, statement: awst_nodes.StateDelete) -> None: + subject = statement.field + state_def = context.resolve_state(subject.field_name, subject.source_location) + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_del + else: + op = AVMOp.app_local_del + account = context.visitor.visit_and_materialise_single(subject.account) + args.insert(0, account) + context.block_builder.add( + Intrinsic( + op=op, + args=args, + source_location=statement.source_location, + ) + ) + + +def visit_state_get(context: IRFunctionBuildContext, expr: awst_nodes.StateGet) -> ValueProvider: + subject = expr.field + state_def = context.resolve_state(subject.field_name, subject.source_location) + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [current_app_offset, key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_get_ex + else: + op = AVMOp.app_local_get_ex + account = context.visitor.visit_and_materialise_single(subject.account) + args.insert(0, account) + default = context.visitor.visit_and_materialise_single(expr.default) + maybe_value, exists = context.visitor.materialise_value_provider( + Intrinsic( + op=op, + args=args, + source_location=expr.source_location, + ), + description=f"{subject.field_name}_get_ex", + ) + return Intrinsic( + op=AVMOp.select, + args=[default, maybe_value, exists], + source_location=expr.source_location, + ) + + +def visit_state_exists( + context: IRFunctionBuildContext, expr: awst_nodes.StateExists +) -> ValueProvider: + subject = expr.field + state_def = context.resolve_state(subject.field_name, subject.source_location) + current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) + key = BytesConstant( + value=state_def.key, + source_location=subject.source_location, + encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + ) + args: list[Value] = [current_app_offset, key] + if isinstance(subject, awst_nodes.AppStateExpression): + op = AVMOp.app_global_get_ex + else: + op = AVMOp.app_local_get_ex + account = context.visitor.visit_and_materialise_single(subject.account) + args.insert(0, account) + _, exists = context.visitor.materialise_value_provider( + Intrinsic( + op=op, + args=args, + source_location=expr.source_location, + ), + description=f"{subject.field_name}_exists", + ) + return exists From c309e67177cdc74daa2086198bfe422611df335c Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 18:35:38 +0800 Subject: [PATCH 21/40] wip --- .../amm/out/ConstantProductAMM.approval.mir | 58 +-- .../amm/out/ConstantProductAMM.approval.teal | 58 +-- .../amm/out/ConstantProductAMM.arc32.json | 2 +- .../out/ConstantProductAMM.destructured.ir | 58 +-- examples/amm/out/ConstantProductAMM.ssa.ir | 58 +-- .../out/ConstantProductAMM.ssa.opt_pass_1.ir | 58 +-- .../out_O2/ConstantProductAMM.approval.teal | 58 +-- .../out_O2/ConstantProductAMM.destructured.ir | 58 +-- .../ConstantProductAMM.approval.teal | 58 +-- .../ConstantProductAMM.destructured.ir | 58 +-- examples/auction/out/Auction.approval.mir | 22 +- examples/auction/out/Auction.approval.teal | 22 +- examples/auction/out/Auction.arc32.json | 2 +- examples/auction/out/Auction.destructured.ir | 22 +- examples/auction/out/Auction.ssa.ir | 22 +- .../auction/out/Auction.ssa.opt_pass_1.ir | 22 +- examples/auction/out_O2/Auction.approval.teal | 22 +- .../auction/out_O2/Auction.destructured.ir | 22 +- .../out_unoptimized/Auction.approval.teal | 22 +- .../out_unoptimized/Auction.destructured.ir | 22 +- .../out/AppStateContract.approval.mir | 372 ++++++++-------- .../out/AppStateContract.approval.teal | 8 +- .../out/AppStateContract.destructured.ir | 8 +- .../global_state/out/AppStateContract.ssa.ir | 8 +- .../out/AppStateContract.ssa.opt_pass_1.ir | 8 +- .../out_O2/AppStateContract.approval.teal | 8 +- .../out_O2/AppStateContract.destructured.ir | 8 +- .../AppStateContract.approval.teal | 8 +- .../AppStateContract.destructured.ir | 8 +- .../out/LocalStateContract.approval.mir | 405 +++++++++--------- .../out/LocalStateContract.approval.teal | 14 +- .../out/LocalStateContract.destructured.ir | 15 +- .../local_state/out/LocalStateContract.ssa.ir | 16 +- .../out/LocalStateContract.ssa.opt_pass_1.ir | 14 +- .../out/LocalStateContract.ssa.opt_pass_2.ir | 14 +- .../out/LocalStateWithOffsets.approval.mir | 403 +++++++++-------- .../out/LocalStateWithOffsets.approval.teal | 14 +- .../out/LocalStateWithOffsets.destructured.ir | 15 +- .../out/LocalStateWithOffsets.ssa.ir | 16 +- .../LocalStateWithOffsets.ssa.opt_pass_1.ir | 14 +- .../LocalStateWithOffsets.ssa.opt_pass_2.ir | 14 +- .../local_state/out/local_state_contract.awst | 2 +- .../out/local_state_with_offsets.awst | 2 +- .../out_O2/LocalStateContract.approval.teal | 12 +- .../out_O2/LocalStateContract.destructured.ir | 15 +- .../LocalStateWithOffsets.approval.teal | 12 +- .../LocalStateWithOffsets.destructured.ir | 15 +- .../LocalStateContract.approval.teal | 16 +- .../LocalStateContract.destructured.ir | 15 +- .../LocalStateWithOffsets.approval.teal | 16 +- .../LocalStateWithOffsets.destructured.ir | 15 +- examples/local_state/puya.log | 72 +--- examples/sizes.txt | 4 +- .../voting/out/VotingRoundApp.approval.mir | 46 +- .../voting/out/VotingRoundApp.approval.teal | 34 +- examples/voting/out/VotingRoundApp.arc32.json | 2 +- .../voting/out/VotingRoundApp.destructured.ir | 42 +- examples/voting/out/VotingRoundApp.ssa.ir | 42 +- .../out/VotingRoundApp.ssa.opt_pass_1.ir | 42 +- .../out/VotingRoundApp.ssa.opt_pass_2.ir | 42 +- examples/voting/out/voting.awst | 4 +- .../out_O2/VotingRoundApp.approval.teal | 34 +- .../out_O2/VotingRoundApp.destructured.ir | 42 +- .../VotingRoundApp.approval.teal | 34 +- .../VotingRoundApp.destructured.ir | 42 +- examples/voting/puya.log | 8 +- src/puya/awst_build/eb/app_account_state.py | 46 +- src/puya/ir/builder/state.py | 3 +- .../abi_routing/out/Reference.approval.mir | 4 +- .../abi_routing/out/Reference.approval.teal | 4 +- .../abi_routing/out/Reference.arc32.json | 2 +- .../abi_routing/out/Reference.destructured.ir | 4 +- test_cases/abi_routing/out/Reference.ssa.ir | 4 +- .../out/Reference.ssa.opt_pass_1.ir | 4 +- .../out/Reference.ssa.opt_pass_2.ir | 4 +- .../out/Reference.ssa.opt_pass_3.ir | 4 +- .../out/Reference.ssa.opt_pass_4.ir | 4 +- .../out_O2/Reference.approval.teal | 4 +- .../out_O2/Reference.destructured.ir | 4 +- .../out_unoptimized/Reference.approval.teal | 4 +- .../out_unoptimized/Reference.destructured.ir | 4 +- test_cases/asset/out/Reference.approval.mir | 4 +- test_cases/asset/out/Reference.approval.teal | 4 +- .../asset/out/Reference.destructured.ir | 4 +- test_cases/asset/out/Reference.ssa.ir | 4 +- .../asset/out/Reference.ssa.opt_pass_1.ir | 4 +- .../asset/out_O2/Reference.approval.teal | 4 +- .../asset/out_O2/Reference.destructured.ir | 4 +- .../out_unoptimized/Reference.approval.teal | 4 +- .../out_unoptimized/Reference.destructured.ir | 4 +- .../out/Augmented.approval.mir | 8 +- .../out/Augmented.approval.teal | 8 +- .../out/Augmented.destructured.ir | 8 +- .../augmented_assignment/out/Augmented.ssa.ir | 8 +- .../out_O2/Augmented.approval.teal | 8 +- .../out_O2/Augmented.destructured.ir | 8 +- .../out_unoptimized/Augmented.approval.teal | 8 +- .../out_unoptimized/Augmented.destructured.ir | 8 +- .../ConditionalExecutionContract.approval.mir | 28 +- ...ConditionalExecutionContract.approval.teal | 28 +- ...nditionalExecutionContract.destructured.ir | 28 +- .../out/ConditionalExecutionContract.ssa.ir | 28 +- ...itionalExecutionContract.ssa.opt_pass_1.ir | 28 +- ...itionalExecutionContract.ssa.opt_pass_2.ir | 28 +- ...ConditionalExecutionContract.approval.teal | 28 +- ...nditionalExecutionContract.destructured.ir | 28 +- ...ConditionalExecutionContract.approval.teal | 28 +- ...nditionalExecutionContract.destructured.ir | 28 +- .../everything/out/MyContract.approval.mir | 4 +- .../everything/out/MyContract.approval.teal | 4 +- .../everything/out/MyContract.arc32.json | 4 +- .../everything/out/MyContract.clear.mir | 50 +-- .../everything/out/MyContract.clear.teal | 2 +- .../everything/out/MyContract.destructured.ir | 6 +- test_cases/everything/out/MyContract.ssa.ir | 6 +- .../out/MyContract.ssa.opt_pass_1.ir | 6 +- .../out_O2/MyContract.approval.teal | 4 +- .../everything/out_O2/MyContract.clear.teal | 2 +- .../out_O2/MyContract.destructured.ir | 6 +- .../out_unoptimized/MyContract.approval.teal | 4 +- .../out_unoptimized/MyContract.clear.teal | 2 +- .../MyContract.destructured.ir | 6 +- .../out/Greeter.approval.mir | 6 +- .../out/Greeter.approval.teal | 6 +- .../inner_transactions/out/Greeter.arc32.json | 2 +- .../out/Greeter.destructured.ir | 6 +- .../inner_transactions/out/Greeter.ssa.ir | 6 +- .../out/Greeter.ssa.opt_pass_1.ir | 6 +- .../out/MyContract.approval.mir | 4 +- .../out/MyContract.approval.teal | 4 +- .../out/MyContract.destructured.ir | 4 +- .../inner_transactions/out/MyContract.ssa.ir | 4 +- .../out/MyContract.ssa.opt_pass_1.ir | 4 +- .../out/MyContract.ssa.opt_pass_2.ir | 4 +- .../out_O2/Greeter.approval.teal | 6 +- .../out_O2/Greeter.destructured.ir | 6 +- .../out_O2/MyContract.approval.teal | 4 +- .../out_O2/MyContract.destructured.ir | 4 +- .../out_unoptimized/Greeter.approval.teal | 6 +- .../out_unoptimized/Greeter.destructured.ir | 6 +- .../out_unoptimized/MyContract.approval.teal | 4 +- .../MyContract.destructured.ir | 4 +- test_cases/match/out/MyContract.approval.mir | 4 +- test_cases/match/out/MyContract.approval.teal | 4 +- .../match/out/MyContract.destructured.ir | 4 +- test_cases/match/out/MyContract.ssa.ir | 4 +- .../match/out/MyContract.ssa.opt_pass_1.ir | 4 +- .../match/out_O2/MyContract.approval.teal | 4 +- .../match/out_O2/MyContract.destructured.ir | 4 +- .../out_unoptimized/MyContract.approval.teal | 4 +- .../MyContract.destructured.ir | 4 +- test_cases/simplish/out/Simplish.approval.mir | 4 +- .../simplish/out/Simplish.approval.teal | 4 +- .../simplish/out/Simplish.destructured.ir | 4 +- test_cases/simplish/out/Simplish.ssa.ir | 4 +- .../simplish/out/Simplish.ssa.opt_pass_1.ir | 4 +- .../simplish/out/Simplish.ssa.opt_pass_2.ir | 4 +- .../simplish/out_O2/Simplish.approval.teal | 4 +- .../simplish/out_O2/Simplish.destructured.ir | 4 +- .../out_unoptimized/Simplish.approval.teal | 4 +- .../out_unoptimized/Simplish.destructured.ir | 4 +- 161 files changed, 1638 insertions(+), 1843 deletions(-) diff --git a/examples/amm/out/ConstantProductAMM.approval.mir b/examples/amm/out/ConstantProductAMM.approval.mir index edd10f4d7a..4528a97ba0 100644 --- a/examples/amm/out/ConstantProductAMM.approval.mir +++ b/examples/amm/out/ConstantProductAMM.approval.mir @@ -343,7 +343,7 @@ _check_is_governor_block@0: // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.governor amm/contract.py:267 // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.governor amm/contract.py:267 // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.governor amm/contract.py:267 - assert // check value exists // tmp%0#0,app_global_get_ex_value%1#0 self.governor amm/contract.py:267 + assert // check governor exists // tmp%0#0,app_global_get_ex_value%1#0 self.governor amm/contract.py:267 // virtual: load tmp%0#0 from l-stack (no copy) app_global_get_ex_value%1#0,tmp%0#0 Txn.sender == self.governor amm/contract.py:267 // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) tmp%0#0,app_global_get_ex_value%1#0 Txn.sender == self.governor amm/contract.py:267 == // {==} Txn.sender == self.governor amm/contract.py:267 @@ -364,7 +364,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:68 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:68 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:68 - assert // check value exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 self.pool_token amm/contract.py:68 + assert // check pool_token exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 self.pool_token amm/contract.py:68 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 not self.pool_token amm/contract.py:68 ! // (𝕡) seed#0,a_asset#0,b_asset#0 | {!} not self.pool_token amm/contract.py:68 // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%2#0 not self.pool_token amm/contract.py:68 @@ -422,7 +422,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%13#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%13#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:79 // virtual: store app_global_get_ex_value%12#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.asset_a amm/contract.py:79 // virtual: load app_global_get_ex_did_exist%13#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.asset_a amm/contract.py:79 - assert // check value exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0 self.asset_a amm/contract.py:79 + assert // check asset_a exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0 self.asset_a amm/contract.py:79 // virtual: load app_global_get_ex_value%12#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0 self._do_opt_in(self.asset_a) amm/contract.py:79 callsub _do_opt_in // (𝕡) seed#0,a_asset#0,b_asset#0 | self._do_opt_in(self.asset_a) amm/contract.py:79 int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.asset_b amm/contract.py:80 @@ -431,7 +431,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%15#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%15#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:80 // virtual: store app_global_get_ex_value%14#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.asset_b amm/contract.py:80 // virtual: load app_global_get_ex_did_exist%15#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.asset_b amm/contract.py:80 - assert // check value exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0 self.asset_b amm/contract.py:80 + assert // check asset_b exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0 self.asset_b amm/contract.py:80 // virtual: load app_global_get_ex_value%14#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0 self._do_opt_in(self.asset_b) amm/contract.py:80 callsub _do_opt_in // (𝕡) seed#0,a_asset#0,b_asset#0 | self._do_opt_in(self.asset_b) amm/contract.py:80 int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.pool_token amm/contract.py:81 @@ -440,7 +440,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%17#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%17#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:81 // virtual: store app_global_get_ex_value%16#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.pool_token amm/contract.py:81 // virtual: load app_global_get_ex_did_exist%17#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.pool_token amm/contract.py:81 - assert // check value exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0 self.pool_token amm/contract.py:81 + assert // check pool_token exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0 self.pool_token amm/contract.py:81 // virtual: load app_global_get_ex_value%16#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0 arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 itob // (𝕡) seed#0,a_asset#0,b_asset#0 | {itob} arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 // virtual: store val_as_bytes%18#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | val_as_bytes%18#0 arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 @@ -460,7 +460,7 @@ _create_pool_token_block@0: // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:274 // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.asset_a amm/contract.py:274 // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.asset_a amm/contract.py:274 - assert // check value exists // app_global_get_ex_value%4#0 self.asset_a amm/contract.py:274 + assert // check asset_a exists // app_global_get_ex_value%4#0 self.asset_a amm/contract.py:274 // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) app_global_get_ex_value%4#0 self.asset_a.unit_name amm/contract.py:274 asset_params_get AssetUnitName // {asset_params_get}.0,{asset_params_get}.1 self.asset_a.unit_name amm/contract.py:274 // virtual: store maybe_value_did_exist%3#0 to l-stack (no copy) maybe_value_did_exist%3#0,{asset_params_get}.0 self.asset_a.unit_name amm/contract.py:274 @@ -481,7 +481,7 @@ _create_pool_token_block@0: // virtual: store app_global_get_ex_did_exist%11#0 to l-stack (no copy) tmp%7#0,app_global_get_ex_did_exist%11#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:274 // virtual: store app_global_get_ex_value%10#0 to l-stack (no copy) tmp%7#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.asset_b amm/contract.py:274 // virtual: load app_global_get_ex_did_exist%11#0 from l-stack (no copy) tmp%7#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.asset_b amm/contract.py:274 - assert // check value exists // tmp%7#0,app_global_get_ex_value%10#0 self.asset_b amm/contract.py:274 + assert // check asset_b exists // tmp%7#0,app_global_get_ex_value%10#0 self.asset_b amm/contract.py:274 // virtual: load app_global_get_ex_value%10#0 from l-stack (no copy) tmp%7#0,app_global_get_ex_value%10#0 self.asset_b.unit_name amm/contract.py:274 asset_params_get AssetUnitName // tmp%7#0,{asset_params_get}.0,{asset_params_get}.1 self.asset_b.unit_name amm/contract.py:274 // virtual: store maybe_value_did_exist%9#0 to l-stack (no copy) tmp%7#0,maybe_value_did_exist%9#0,{asset_params_get}.0 self.asset_b.unit_name amm/contract.py:274 @@ -565,7 +565,7 @@ mint_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 - assert // check value exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 + assert // check pool_token exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 frame_dig -3 // load pool_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,pool_asset#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 swap // load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_asset#0,app_global_get_ex_value%0#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 @@ -578,7 +578,7 @@ mint_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:117 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:117 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:117 - assert // check value exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0 self.asset_a amm/contract.py:117 + assert // check asset_a exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0 self.asset_a amm/contract.py:117 frame_dig -2 // load a_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 swap // load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_asset#0,app_global_get_ex_value%3#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 @@ -591,7 +591,7 @@ mint_block@0: // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:118 // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:118 // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:118 - assert // check value exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0 self.asset_b amm/contract.py:118 + assert // check asset_b exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0 self.asset_b amm/contract.py:118 frame_dig -1 // load b_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 swap // load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_asset#0,app_global_get_ex_value%6#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 @@ -640,7 +640,7 @@ mint_block@0: // virtual: store app_global_get_ex_did_exist%20#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_did_exist%20#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:126 // virtual: store app_global_get_ex_value%19#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0,app_global_get_ex_did_exist%20#0 self.asset_a amm/contract.py:126 // virtual: load app_global_get_ex_did_exist%20#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0,app_global_get_ex_did_exist%20#0 self.asset_a amm/contract.py:126 - assert // check value exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0 self.asset_a amm/contract.py:126 + assert // check asset_a exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0 self.asset_a amm/contract.py:126 // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%19#0,tmp%18#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 // virtual: load app_global_get_ex_value%19#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 @@ -676,7 +676,7 @@ mint_block@0: // virtual: store app_global_get_ex_did_exist%29#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_did_exist%29#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:133 // virtual: store app_global_get_ex_value%28#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.asset_b amm/contract.py:133 // virtual: load app_global_get_ex_did_exist%29#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.asset_b amm/contract.py:133 - assert // check value exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0 self.asset_b amm/contract.py:133 + assert // check asset_b exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0 self.asset_b amm/contract.py:133 // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,app_global_get_ex_value%28#0,tmp%27#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 // virtual: load app_global_get_ex_value%28#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{==} b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 @@ -719,7 +719,7 @@ mint_block@0: // virtual: store app_global_get_ex_did_exist%41#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_did_exist%41#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 // virtual: store app_global_get_ex_value%40#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0,app_global_get_ex_did_exist%41#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 // virtual: load app_global_get_ex_did_exist%41#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0,app_global_get_ex_did_exist%41#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - assert // check value exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + assert // check pool_token exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,app_global_get_ex_value%40#0,tmp%39#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 // virtual: load app_global_get_ex_value%40#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 uncover 2 // load to_mint#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%39#0,app_global_get_ex_value%40#0,to_mint#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 @@ -739,7 +739,7 @@ _check_bootstrapped_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:255 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:255 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:255 - assert // check value exists // app_global_get_ex_value%0#0 self.pool_token amm/contract.py:255 + assert // check pool_token exists // app_global_get_ex_value%0#0 self.pool_token amm/contract.py:255 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) app_global_get_ex_value%0#0 assert self.pool_token, "bootstrap method needs to be called first" amm/contract.py:255 assert // bootstrap method needs to be called first // assert self.pool_token, "bootstrap method needs to be called first" amm/contract.py:255 retsub // @@ -758,7 +758,7 @@ _current_pool_balance_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:296 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.pool_token amm/contract.py:296 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.pool_token amm/contract.py:296 - assert // check value exists // tmp%2#0,app_global_get_ex_value%3#0 self.pool_token amm/contract.py:296 + assert // check pool_token exists // tmp%2#0,app_global_get_ex_value%3#0 self.pool_token amm/contract.py:296 // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%3#0,tmp%2#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 @@ -783,7 +783,7 @@ _current_a_balance_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:300 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:300 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:300 - assert // check value exists // tmp%2#0,app_global_get_ex_value%3#0 self.asset_a amm/contract.py:300 + assert // check asset_a exists // tmp%2#0,app_global_get_ex_value%3#0 self.asset_a amm/contract.py:300 // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%3#0,tmp%2#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 @@ -808,7 +808,7 @@ _current_b_balance_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:304 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:304 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:304 - assert // check value exists // tmp%2#0,app_global_get_ex_value%3#0 self.asset_b amm/contract.py:304 + assert // check asset_b exists // tmp%2#0,app_global_get_ex_value%3#0 self.asset_b amm/contract.py:304 // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%3#0,tmp%2#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 @@ -980,7 +980,7 @@ burn_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:174 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:174 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:174 - assert // check value exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 self.pool_token amm/contract.py:174 + assert // check pool_token exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 self.pool_token amm/contract.py:174 frame_dig -3 // load pool_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,pool_asset#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 swap // load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_asset#0,app_global_get_ex_value%0#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 @@ -993,7 +993,7 @@ burn_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:175 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:175 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:175 - assert // check value exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0 self.asset_a amm/contract.py:175 + assert // check asset_a exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0 self.asset_a amm/contract.py:175 frame_dig -2 // load a_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 swap // load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_asset#0,app_global_get_ex_value%3#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 @@ -1006,7 +1006,7 @@ burn_block@0: // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:176 // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:176 // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:176 - assert // check value exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0 self.asset_b amm/contract.py:176 + assert // check asset_b exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0 self.asset_b amm/contract.py:176 frame_dig -1 // load b_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 swap // load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_asset#0,app_global_get_ex_value%6#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 @@ -1042,7 +1042,7 @@ burn_block@0: // virtual: store app_global_get_ex_did_exist%16#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_did_exist%16#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:182 // virtual: store app_global_get_ex_value%15#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.pool_token amm/contract.py:182 // virtual: load app_global_get_ex_did_exist%16#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.pool_token amm/contract.py:182 - assert // check value exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0 self.pool_token amm/contract.py:182 + assert // check pool_token exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0 self.pool_token amm/contract.py:182 // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,app_global_get_ex_value%15#0,tmp%14#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 // virtual: load app_global_get_ex_value%15#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{==} pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 @@ -1084,7 +1084,7 @@ burn_block@0: // virtual: store app_global_get_ex_did_exist%27#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_did_exist%27#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 // virtual: store app_global_get_ex_value%26#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0,app_global_get_ex_did_exist%27#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 // virtual: load app_global_get_ex_did_exist%27#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0,app_global_get_ex_did_exist%27#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - assert // check value exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + assert // check asset_a exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 // virtual: load tmp%25#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,app_global_get_ex_value%26#0,tmp%25#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 // virtual: load app_global_get_ex_value%26#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 uncover 2 // load a_amt#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%25#0,app_global_get_ex_value%26#0,a_amt#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 @@ -1097,7 +1097,7 @@ burn_block@0: // virtual: store app_global_get_ex_did_exist%30#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_did_exist%30#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 // virtual: store app_global_get_ex_value%29#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0,app_global_get_ex_did_exist%30#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 // virtual: load app_global_get_ex_did_exist%30#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0,app_global_get_ex_did_exist%30#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - assert // check value exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + assert // check asset_b exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,app_global_get_ex_value%29#0,tmp%28#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 // virtual: load app_global_get_ex_value%29#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 uncover 2 // load b_amt#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%28#0,app_global_get_ex_value%29#0,b_amt#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 @@ -1145,7 +1145,7 @@ swap_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:227 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asset_a amm/contract.py:227 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asset_a amm/contract.py:227 - assert // check value exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0 self.asset_a amm/contract.py:227 + assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0 self.asset_a amm/contract.py:227 frame_dig -2 // load a_asset#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 swap // load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | a_asset#0,app_global_get_ex_value%0#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 @@ -1158,7 +1158,7 @@ swap_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:228 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:228 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:228 - assert // check value exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0 self.asset_b amm/contract.py:228 + assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0 self.asset_b amm/contract.py:228 frame_dig -1 // load b_asset#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 swap // load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | b_asset#0,app_global_get_ex_value%3#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 @@ -1192,14 +1192,14 @@ swap_block@0: // virtual: store app_global_get_ex_did_exist%12#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_did_exist%12#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:234 // virtual: store app_global_get_ex_value%11#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 self.asset_a amm/contract.py:234 // virtual: load app_global_get_ex_did_exist%12#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 self.asset_a amm/contract.py:234 - assert // check value exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0 self.asset_a amm/contract.py:234 + assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0 self.asset_a amm/contract.py:234 int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,0 self.asset_b amm/contract.py:238 byte "asset_b" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,0,"asset_b" self.asset_b amm/contract.py:238 app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:238 // virtual: store app_global_get_ex_did_exist%14#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_did_exist%14#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:238 // virtual: store app_global_get_ex_value%13#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,app_global_get_ex_did_exist%14#0 self.asset_b amm/contract.py:238 // virtual: load app_global_get_ex_did_exist%14#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,app_global_get_ex_did_exist%14#0 self.asset_b amm/contract.py:238 - assert // check value exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0 self.asset_b amm/contract.py:238 + assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0 self.asset_b amm/contract.py:238 frame_dig -3 // load swap_xfer#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,swap_xfer#0 swap_xfer.xfer_asset amm/contract.py:233 gtxns XferAsset // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,{gtxns} swap_xfer.xfer_asset amm/contract.py:233 // virtual: store awst_tmp%15#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,awst_tmp%15#0 swap_xfer.xfer_asset amm/contract.py:233 @@ -1220,7 +1220,7 @@ swap_switch_case_0@1: swap // store app_global_get_ex_did_exist%17#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%17#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:237 frame_bury 1 // store out_asset#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%17#0 self.asset_a amm/contract.py:237 // virtual: load app_global_get_ex_did_exist%17#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%17#0 self.asset_a amm/contract.py:237 - assert // check value exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_a amm/contract.py:237 + assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_a amm/contract.py:237 b swap_switch_case_next@4 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply#0 swap_switch_case_1@2: @@ -1234,7 +1234,7 @@ swap_switch_case_1@2: swap // store app_global_get_ex_did_exist%19#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%19#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:241 frame_bury 1 // store out_asset#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%19#0 self.asset_b amm/contract.py:241 // virtual: load app_global_get_ex_did_exist%19#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%19#0 self.asset_b amm/contract.py:241 - assert // check value exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_b amm/contract.py:241 + assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_b amm/contract.py:241 // Implicit fall through to swap_switch_case_next@4 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply#0 swap_switch_case_next@4: diff --git a/examples/amm/out/ConstantProductAMM.approval.teal b/examples/amm/out/ConstantProductAMM.approval.teal index e4ac78a49b..12cf20719a 100644 --- a/examples/amm/out/ConstantProductAMM.approval.teal +++ b/examples/amm/out/ConstantProductAMM.approval.teal @@ -252,7 +252,7 @@ _check_is_governor: int 0 byte "governor" app_global_get_ex - assert // check value exists + assert // check governor exists == // amm/contract.py:266-268 // assert ( @@ -275,7 +275,7 @@ bootstrap: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists ! assert // application has already been bootstrapped // amm/contract.py:69 @@ -328,21 +328,21 @@ bootstrap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists callsub _do_opt_in // amm/contract.py:80 // self._do_opt_in(self.asset_b) int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists callsub _do_opt_in // amm/contract.py:81 // return arc4.UInt64(self.pool_token.asset_id) int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists itob retsub @@ -370,7 +370,7 @@ _create_pool_token: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists asset_params_get AssetUnitName assert // asset exists byte "DPT-" @@ -381,7 +381,7 @@ _create_pool_token: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists asset_params_get AssetUnitName assert // asset exists concat @@ -540,7 +540,7 @@ mint: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists frame_dig -3 == assert // asset pool incorrect @@ -549,7 +549,7 @@ mint: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 == assert // asset a incorrect @@ -558,7 +558,7 @@ mint: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 == assert // asset b incorrect @@ -595,7 +595,7 @@ mint: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists == assert // asset a incorrect // amm/contract.py:127 @@ -625,7 +625,7 @@ mint: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists == assert // asset b incorrect // amm/contract.py:134 @@ -669,7 +669,7 @@ mint: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists uncover 2 callsub do_asset_transfer // amm/contract.py:147 @@ -689,7 +689,7 @@ _check_bootstrapped: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists assert // bootstrap method needs to be called first retsub @@ -706,7 +706,7 @@ _current_pool_balance: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -724,7 +724,7 @@ _current_a_balance: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -742,7 +742,7 @@ _current_b_balance: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -897,7 +897,7 @@ burn: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists frame_dig -3 == assert // asset pool incorrect @@ -906,7 +906,7 @@ burn: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 == assert // asset a incorrect @@ -915,7 +915,7 @@ burn: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 == assert // asset b incorrect @@ -945,7 +945,7 @@ burn: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists == assert // asset pool incorrect // amm/contract.py:183 @@ -993,7 +993,7 @@ burn: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists uncover 2 callsub do_asset_transfer // amm/contract.py:202-203 @@ -1003,7 +1003,7 @@ burn: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists uncover 2 callsub do_asset_transfer // amm/contract.py:204 @@ -1061,7 +1061,7 @@ swap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 == assert // asset a incorrect @@ -1070,7 +1070,7 @@ swap: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 == assert // asset b incorrect @@ -1094,13 +1094,13 @@ swap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists // amm/contract.py:238 // case self.asset_b: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists // amm/contract.py:233 // match swap_xfer.xfer_asset: frame_dig -3 @@ -1137,7 +1137,7 @@ swap_switch_case_0@1: app_global_get_ex swap frame_bury 1 - assert // check value exists + assert // check asset_a exists b swap_switch_case_next@4 swap_switch_case_1@2: @@ -1155,7 +1155,7 @@ swap_switch_case_1@2: app_global_get_ex swap frame_bury 1 - assert // check value exists + assert // check asset_b exists swap_switch_case_next@4: // amm/contract.py:245-247 diff --git a/examples/amm/out/ConstantProductAMM.arc32.json b/examples/amm/out/ConstantProductAMM.arc32.json index daa68a2c54..9248e938f5 100644 --- a/examples/amm/out/ConstantProductAMM.arc32.json +++ b/examples/amm/out/ConstantProductAMM.arc32.json @@ -65,7 +65,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTEKICAgIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIKICAgIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiCiAgICBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIKICAgIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIgogICAgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NldF9nb3Zlcm5vcl9yb3V0ZUA0IG1haW5fYm9vdHN0cmFwX3JvdXRlQDUgbWFpbl9taW50X3JvdXRlQDYgbWFpbl9idXJuX3JvdXRlQDcgbWFpbl9zd2FwX3JvdXRlQDgKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fc2V0X2dvdmVybm9yX3JvdXRlQDQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2dvdmVybm9yCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2Jvb3RzdHJhcF9yb3V0ZUA1OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYm9vdHN0cmFwCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX21pbnRfcm91dGVANjoKICAgIC8vIGFtbS9jb250cmFjdC5weTo4My04OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6ODMtODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIG1pbnQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYnVybl9yb3V0ZUA3OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0OS0xNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0OS0xNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIGJ1cm4KICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUA4OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNi0yMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNi0yMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTE6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc2V0X2dvdmVybm9yKG5ld19nb3Zlcm5vcjogYnl0ZXMpIC0+IHZvaWQ6CnNldF9nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzZXRfZ292ZXJub3Ioc2VsZiwgbmV3X2dvdmVybm9yOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDYKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYuZ292ZXJub3IgPSBuZXdfZ292ZXJub3IKICAgIGJ5dGUgImdvdmVybm9yIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfaXNfZ292ZXJub3IoKSAtPiB2b2lkOgpfY2hlY2tfaXNfZ292ZXJub3I6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY0LTI2NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfaXNfZ292ZXJub3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICB0eG4gU2VuZGVyCiAgICBpbnQgMAogICAgYnl0ZSAiZ292ZXJub3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5nb3Zlcm5vcgogICAgLy8gKSwgIk9ubHkgdGhlIGFjY291bnQgc2V0IGluIGdsb2JhbF9zdGF0ZS5nb3Zlcm5vciBtYXkgY2FsbCB0aGlzIG1ldGhvZCIKICAgIGFzc2VydCAvLyBPbmx5IHRoZSBhY2NvdW50IHNldCBpbiBnbG9iYWxfc3RhdGUuZ292ZXJub3IgbWF5IGNhbGwgdGhpcyBtZXRob2QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uYm9vdHN0cmFwKHNlZWQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpib290c3RyYXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDktNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYm9vdHN0cmFwKAogICAgLy8gICAgIHNlbGYsIHNlZWQ6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLCBhX2Fzc2V0OiBBc3NldCwgYl9hc3NldDogQXNzZXQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnBvb2xfdG9rZW4sICJhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGJvb3RzdHJhcHBlZCIKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGJvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBzZWxmLl9jaGVja19pc19nb3Zlcm5vcigpCiAgICBjYWxsc3ViIF9jaGVja19pc19nb3Zlcm5vcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBhc3NlcnQgR2xvYmFsLmdyb3VwX3NpemUgPT0gMiwgImdyb3VwIHNpemUgbm90IDIiCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnQgMgogICAgPT0KICAgIGFzc2VydCAvLyBncm91cCBzaXplIG5vdCAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzEKICAgIC8vIGFzc2VydCBzZWVkLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IHNlZWQuYW1vdW50ID49IDMwMF8wMDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IiAgIyAwLjMgQWxnb3MKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICBpbnQgMzAwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NAogICAgLy8gYXNzZXJ0IGFfYXNzZXQuYXNzZXRfaWQgPCBiX2Fzc2V0LmFzc2V0X2lkLCAiYXNzZXQgYSBtdXN0IGJlIGxlc3MgdGhhbiBhc3NldCBiIgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgIGFzc2VydCAvLyBhc3NldCBhIG11c3QgYmUgbGVzcyB0aGFuIGFzc2V0IGIKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NQogICAgLy8gc2VsZi5hc3NldF9hID0gYV9hc3NldAogICAgYnl0ZSAiYXNzZXRfYSIKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi5hc3NldF9iID0gYl9hc3NldAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5wb29sX3Rva2VuID0gc2VsZi5fY3JlYXRlX3Bvb2xfdG9rZW4oKQogICAgY2FsbHN1YiBfY3JlYXRlX3Bvb2xfdG9rZW4KICAgIGJ5dGUgInBvb2xfdG9rZW4iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBzZWxmLl9kb19vcHRfaW4oc2VsZi5hc3NldF9hKQogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgY2FsbHN1YiBfZG9fb3B0X2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2IpCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo4MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYucG9vbF90b2tlbi5hc3NldF9pZCkKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NyZWF0ZV9wb29sX3Rva2VuKCkgLT4gdWludDY0OgpfY3JlYXRlX3Bvb2xfdG9rZW46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcwLTI3MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3JlYXRlX3Bvb2xfdG9rZW4oc2VsZikgLT4gQXNzZXQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzMtMjgyCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFtbS9jb250cmFjdC5weToyNzQKICAgIC8vIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIGludCAwCiAgICBieXRlICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgYnl0ZSAiRFBULSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZSAiLSIKICAgIGNvbmNhdAogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzgKICAgIC8vIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc5CiAgICAvLyByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gdW5pdF9uYW1lPWIiZGJ0IiwKICAgIGJ5dGUgImRidCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIGludCBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc2CiAgICAvLyB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICBpbnQgMTAwMDAwMDAwMDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjgwCiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gZGVjaW1hbHM9MywKICAgIGludCAzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjczLTI4MgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3Mi0yODQKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgICAgICBmZWU9MCwKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXNzZXQKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2RvX29wdF9pbihhc3NldDogdWludDY0KSAtPiB2b2lkOgpfZG9fb3B0X2luOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2RvX29wdF9pbihzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyODkKICAgIC8vIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4OC0yOTIKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg4LTI5MgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LmRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRvX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1OS0zNjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZG9fYXNzZXRfdHJhbnNmZXIoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNjEtMzY2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzY1CiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM2MS0zNjYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5taW50KGFfeGZlcjogdWludDY0LCBiX3hmZXI6IHVpbnQ2NCwgcG9vbF9hc3NldDogdWludDY0LCBhX2Fzc2V0OiB1aW50NjQsIGJfYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKbWludDoKICAgIC8vIGFtbS9jb250cmFjdC5weTo4My05NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBtaW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYV94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBiX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIHBvb2xfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gNSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTEzCiAgICAvLyBzZWxmLl9jaGVja19ib290c3RyYXBwZWQoKQogICAgY2FsbHN1YiBfY2hlY2tfYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gIyB3ZWxsLWZvcm1lZCBtaW50CiAgICAvLyBhc3NlcnQgcG9vbF9hc3NldCA9PSBzZWxmLnBvb2xfdG9rZW4sICJhc3NldCBwb29sIGluY29ycmVjdCIKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE5CiAgICAvLyBhc3NlcnQgYV94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gYXNzZXJ0IGJfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjQKICAgIC8vIGFfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMi0xMjUKICAgIC8vICMgdmFsaWQgYXNzZXQgYSB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IGFfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludCAwCiAgICBieXRlICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjcKICAgIC8vIGFzc2VydCBhX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGludCAwCiAgICA+CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gYl94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI5LTEzMgogICAgLy8gIyB2YWxpZCBhc3NldCBiIHhmZXIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYl94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMzCiAgICAvLyBhc3NlcnQgYl94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5hc3NldF9iLCAiYXNzZXQgYiBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGJfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgaW50IDAKICAgID4KICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTM3CiAgICAvLyBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfcG9vbF9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTM4CiAgICAvLyBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTM5CiAgICAvLyBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTM2LTE0MgogICAgLy8gdG9fbWludCA9IHRva2Vuc190b19taW50KAogICAgLy8gICAgIHBvb2xfYmFsYW5jZT1zZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpLAogICAgLy8gICAgIGFfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgLy8gICAgIGJfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgLy8gICAgIGFfYW1vdW50PWFfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyAgICAgYl9hbW91bnQ9Yl94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjYWxsc3ViIHRva2Vuc190b19taW50CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQzCiAgICAvLyBhc3NlcnQgdG9fbWludCA+IDAsICJzZW5kIGFtb3VudCB0b28gbG93IgogICAgZHVwCiAgICBpbnQgMAogICAgPgogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyAjIG1pbnQgdG9rZW5zCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLnBvb2xfdG9rZW4sIGFtb3VudD10b19taW50KQogICAgdHhuIFNlbmRlcgogICAgaW50IDAKICAgIGJ5dGUgInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jaGVja19ib290c3RyYXBwZWQoKSAtPiB2b2lkOgpfY2hlY2tfYm9vdHN0cmFwcGVkOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1My0yNTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jvb3RzdHJhcHBlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU1CiAgICAvLyBhc3NlcnQgc2VsZi5wb29sX3Rva2VuLCAiYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QiCiAgICBpbnQgMAogICAgYnl0ZSAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9wb29sX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk0LTI5NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9wb29sX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk2CiAgICAvLyByZXR1cm4gc2VsZi5wb29sX3Rva2VuLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnQgMAogICAgYnl0ZSAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYV9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9hX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk4LTI5OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9hX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzAwCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9hLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYl9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9iX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzAyLTMwMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9iX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzA0CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9iLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC50b2tlbnNfdG9fbWludChwb29sX2JhbGFuY2U6IHVpbnQ2NCwgYV9iYWxhbmNlOiB1aW50NjQsIGJfYmFsYW5jZTogdWludDY0LCBhX2Ftb3VudDogdWludDY0LCBiX2Ftb3VudDogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19taW50OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyNS0zMzMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX21pbnQoCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBwb29sX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBiX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2Ftb3VudDogVUludDY0LAogICAgLy8gICAgIGJfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDUgMQogICAgYnl0ZSAiIgogICAgZHVwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM0CiAgICAvLyBpc19pbml0aWFsX21pbnQgPSBhX2JhbGFuY2UgPT0gYV9hbW91bnQgYW5kIGJfYmFsYW5jZSA9PSBiX2Ftb3VudAogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiB0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzCiAgICBpbnQgMQogICAgYiB0b2tlbnNfdG9fbWludF9ib29sX21lcmdlQDQKCnRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMzoKICAgIGludCAwCgp0b2tlbnNfdG9fbWludF9ib29sX21lcmdlQDQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM1CiAgICAvLyBpZiBpc19pbml0aWFsX21pbnQ6CiAgICBieiB0b2tlbnNfdG9fbWludF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzYKICAgIC8vIHJldHVybiBvcC5zcXJ0KGFfYW1vdW50ICogYl9hbW91bnQpIC0gU0NBTEUKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBzcXJ0CiAgICBpbnQgMTAwMAogICAgLQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRva2Vuc190b19taW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzcKICAgIC8vIGlzc3VlZCA9IFRPVEFMX1NVUFBMWSAtIHBvb2xfYmFsYW5jZQogICAgaW50IDEwMDAwMDAwMDAwCiAgICBmcmFtZV9kaWcgLTUKICAgIC0KICAgIC8vIGFtbS9jb250cmFjdC5weTozMzgKICAgIC8vIGFfcmF0aW8gPSBTQ0FMRSAqIGFfYW1vdW50IC8vIChhX2JhbGFuY2UgLSBhX2Ftb3VudCkKICAgIGludCAxMDAwCiAgICBmcmFtZV9kaWcgLTIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICAvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gYl9yYXRpbyA9IFNDQUxFICogYl9hbW91bnQgLy8gKGJfYmFsYW5jZSAtIGJfYW1vdW50KQogICAgaW50IDEwMDAKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQwCiAgICAvLyBpZiBhX3JhdGlvIDwgYl9yYXRpbzoKICAgIDwKICAgIGJ6IHRva2Vuc190b19taW50X2Vsc2VfYm9keUA4CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQxCiAgICAvLyByZXR1cm4gYV9yYXRpbyAqIGlzc3VlZCAvLyBTQ0FMRQogICAgZnJhbWVfZGlnIDAKICAgICoKICAgIGludCAxMDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9rZW5zX3RvX21pbnRfZWxzZV9ib2R5QDg6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQzCiAgICAvLyByZXR1cm4gYl9yYXRpbyAqIGlzc3VlZCAvLyBTQ0FMRQogICAgZnJhbWVfZGlnIDEKICAgICoKICAgIGludCAxMDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX3VwZGF0ZV9yYXRpbygpIC0+IHZvaWQ6Cl91cGRhdGVfcmF0aW86CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU3LTI1OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfdXBkYXRlX3JhdGlvKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTkKICAgIC8vIGFfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYwCiAgICAvLyBiX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gc2VsZi5yYXRpbyA9IGFfYmFsYW5jZSAqIFNDQUxFIC8vIGJfYmFsYW5jZQogICAgaW50IDEwMDAKICAgICoKICAgIHN3YXAKICAgIC8KICAgIGJ5dGUgInJhdGlvIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uYnVybihwb29sX3hmZXI6IHVpbnQ2NCwgcG9vbF9hc3NldDogdWludDY0LCBhX2Fzc2V0OiB1aW50NjQsIGJfYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYnVybjoKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDktMTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIGJ1cm4oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBwb29sX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIHBvb2xfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gNCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTcyCiAgICAvLyBzZWxmLl9jaGVja19ib290c3RyYXBwZWQoKQogICAgY2FsbHN1YiBfY2hlY2tfYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgcG9vbF9hc3NldCA9PSBzZWxmLnBvb2xfdG9rZW4sICJhc3NldCBwb29sIGluY29ycmVjdCIKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzYKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc5CiAgICAvLyBwb29sX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxNzgtMTgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHBvb2xfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gYXNzZXJ0IHBvb2xfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgaW50IDAKICAgID4KICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgyCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50IDAKICAgIGJ5dGUgInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gYXNzZXJ0IHBvb2xfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxODUtMTg3CiAgICAvLyAjIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBpc3N1ZWQKICAgIC8vICMgIWltcG9ydGFudDogdGhpcyBoYXBwZW5zIHByaW9yIHRvIHJlY2VpdmluZyB0aGUgY3VycmVudCBheGZlciBvZiBwb29sIHRva2VucwogICAgLy8gcG9vbF9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9wb29sX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxOTAKICAgIC8vIHN1cHBseT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxODgtMTkyCiAgICAvLyBhX2FtdCA9IHRva2Vuc190b19idXJuKAogICAgLy8gICAgIHBvb2xfYmFsYW5jZT1wb29sX2JhbGFuY2UsCiAgICAvLyAgICAgc3VwcGx5PXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICAvLyAgICAgYW1vdW50PXBvb2xfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMQogICAgc3dhcAogICAgZGlnIDMKICAgIGNhbGxzdWIgdG9rZW5zX3RvX2J1cm4KICAgIGNvdmVyIDIKICAgIC8vIGFtbS9jb250cmFjdC5weToxOTUKICAgIC8vIHN1cHBseT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxOTMtMTk3CiAgICAvLyBiX2FtdCA9IHRva2Vuc190b19idXJuKAogICAgLy8gICAgIHBvb2xfYmFsYW5jZT1wb29sX2JhbGFuY2UsCiAgICAvLyAgICAgc3VwcGx5PXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICAvLyAgICAgYW1vdW50PXBvb2xfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdG9rZW5zX3RvX2J1cm4KICAgIHN3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weToxOTktMjAwCiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGEKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYSwgYW1vdW50PWFfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjAyLTIwMwogICAgLy8gIyBTZW5kIGJhY2sgY29tbWVuc3VyYXRlIGFtdCBvZiBiCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLmFzc2V0X2IsIGFtb3VudD1iX2FtdCkKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19idXJuKHBvb2xfYmFsYW5jZTogdWludDY0LCBzdXBwbHk6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX2J1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ2LTM0NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fYnVybigqLCBwb29sX2JhbGFuY2U6IFVJbnQ2NCwgc3VwcGx5OiBVSW50NjQsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDgKICAgIC8vIGlzc3VlZCA9IFRPVEFMX1NVUFBMWSAtIHBvb2xfYmFsYW5jZSAtIGFtb3VudAogICAgaW50IDEwMDAwMDAwMDAwCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0OQogICAgLy8gcmV0dXJuIHN1cHBseSAqIGFtb3VudCAvLyBpc3N1ZWQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLnN3YXAoc3dhcF94ZmVyOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpzd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNi0yMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBzd2FwKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc3dhcF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgYnl0ZSAiIgogICAgZHVwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI1CiAgICAvLyBzZWxmLl9jaGVja19ib290c3RyYXBwZWQoKQogICAgY2FsbHN1YiBfY2hlY2tfYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI3CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludCAwCiAgICBieXRlICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IGJfYXNzZXQgPT0gc2VsZi5hc3NldF9iLCAiYXNzZXQgYiBpbmNvcnJlY3QiCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzAKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGludCAwCiAgICA+CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gYXNzZXJ0IHN3YXBfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzQKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2I6CiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjMzCiAgICAvLyBtYXRjaCBzd2FwX3hmZXIueGZlcl9hc3NldDoKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgWGZlckFzc2V0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjMzLTI0MwogICAgLy8gbWF0Y2ggc3dhcF94ZmVyLnhmZXJfYXNzZXQ6CiAgICAvLyAgICAgY2FzZSBzZWxmLmFzc2V0X2E6CiAgICAvLyAgICAgICAgIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIC8vICAgICAgICAgb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIC8vICAgICAgICAgb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9hCiAgICAvLyAgICAgY2FzZSBzZWxmLmFzc2V0X2I6CiAgICAvLyAgICAgICAgIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIC8vICAgICAgICAgb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIC8vICAgICAgICAgb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9iCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBhc3NlcnQgRmFsc2UsICJhc3NldCBpZCBpbmNvcnJlY3QiCiAgICBtYXRjaCBzd2FwX3N3aXRjaF9jYXNlXzBAMSBzd2FwX3N3aXRjaF9jYXNlXzFAMgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gYXNzZXJ0IEZhbHNlLCAiYXNzZXQgaWQgaW5jb3JyZWN0IgogICAgZXJyIC8vIGFzc2V0IGlkIGluY29ycmVjdAoKc3dhcF9zd2l0Y2hfY2FzZV8wQDE6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM1CiAgICAvLyBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM2CiAgICAvLyBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzcKICAgIC8vIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYQogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBiIHN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0Cgpzd2FwX3N3aXRjaF9jYXNlXzFAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzkKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDAKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9iCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKCnN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0NS0yNDcKICAgIC8vIHRvX3N3YXAgPSB0b2tlbnNfdG9fc3dhcCgKICAgIC8vICAgICBpbl9hbW91bnQ9c3dhcF94ZmVyLmFzc2V0X2Ftb3VudCwgaW5fc3VwcGx5PWluX3N1cHBseSwgb3V0X3N1cHBseT1vdXRfc3VwcGx5CiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0b2tlbnNfdG9fc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYXNzZXJ0IHRvX3N3YXAgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgaW50IDAKICAgID4KICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjUwCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1vdXRfYXNzZXQsIGFtb3VudD10b19zd2FwKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDEKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19zd2FwKGluX2Ftb3VudDogdWludDY0LCBpbl9zdXBwbHk6IHVpbnQ2NCwgb3V0X3N1cHBseTogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19zd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1Mi0zNTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX3N3YXAoKiwgaW5fYW1vdW50OiBVSW50NjQsIGluX3N1cHBseTogVUludDY0LCBvdXRfc3VwcGx5OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gaW5fdG90YWwgPSBTQ0FMRSAqIChpbl9zdXBwbHkgLSBpbl9hbW91bnQpICsgKGluX2Ftb3VudCAqIEZBQ1RPUikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICAtCiAgICBpbnQgMTAwMAogICAgKgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnQgOTk1CiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTUKICAgIC8vIG91dF90b3RhbCA9IGluX2Ftb3VudCAqIEZBQ1RPUiAqIG91dF9zdXBwbHkKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIG91dF90b3RhbCAvLyBpbl90b3RhbAogICAgc3dhcAogICAgLwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgwKQogICAgYnl0ZSAiYXNzZXRfYSIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0LTM1CiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBCCiAgICAvLyBzZWxmLmFzc2V0X2IgPSBBc3NldCgwKQogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyAjIFRoZSBjdXJyZW50IGdvdmVybm9yIG9mIHRoaXMgY29udHJhY3QsIGFsbG93ZWQgdG8gZG8gYWRtaW4gdHlwZSBhY3Rpb25zCiAgICAvLyBzZWxmLmdvdmVybm9yID0gVHhuLnNlbmRlcgogICAgYnl0ZSAiZ292ZXJub3IiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM4LTM5CiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiB0aGUgUG9vbCBUb2tlbiwgdXNlZCB0byB0cmFjayBzaGFyZSBvZiBwb29sIHRoZSBob2xkZXIgbWF5IHJlY292ZXIKICAgIC8vIHNlbGYucG9vbF90b2tlbiA9IEFzc2V0KDApCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlICJyYXRpbyIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTEKICAgIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIKICAgIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiCiAgICBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIKICAgIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIgogICAgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NldF9nb3Zlcm5vcl9yb3V0ZUA0IG1haW5fYm9vdHN0cmFwX3JvdXRlQDUgbWFpbl9taW50X3JvdXRlQDYgbWFpbl9idXJuX3JvdXRlQDcgbWFpbl9zd2FwX3JvdXRlQDgKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fc2V0X2dvdmVybm9yX3JvdXRlQDQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2dvdmVybm9yCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2Jvb3RzdHJhcF9yb3V0ZUA1OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYm9vdHN0cmFwCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX21pbnRfcm91dGVANjoKICAgIC8vIGFtbS9jb250cmFjdC5weTo4My04OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6ODMtODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIG1pbnQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYnVybl9yb3V0ZUA3OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0OS0xNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0OS0xNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIGJ1cm4KICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUA4OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNi0yMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNi0yMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTE6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc2V0X2dvdmVybm9yKG5ld19nb3Zlcm5vcjogYnl0ZXMpIC0+IHZvaWQ6CnNldF9nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzZXRfZ292ZXJub3Ioc2VsZiwgbmV3X2dvdmVybm9yOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDYKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYuZ292ZXJub3IgPSBuZXdfZ292ZXJub3IKICAgIGJ5dGUgImdvdmVybm9yIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfaXNfZ292ZXJub3IoKSAtPiB2b2lkOgpfY2hlY2tfaXNfZ292ZXJub3I6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY0LTI2NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfaXNfZ292ZXJub3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICB0eG4gU2VuZGVyCiAgICBpbnQgMAogICAgYnl0ZSAiZ292ZXJub3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGdvdmVybm9yIGV4aXN0cwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT0gc2VsZi5nb3Zlcm5vcgogICAgLy8gKSwgIk9ubHkgdGhlIGFjY291bnQgc2V0IGluIGdsb2JhbF9zdGF0ZS5nb3Zlcm5vciBtYXkgY2FsbCB0aGlzIG1ldGhvZCIKICAgIGFzc2VydCAvLyBPbmx5IHRoZSBhY2NvdW50IHNldCBpbiBnbG9iYWxfc3RhdGUuZ292ZXJub3IgbWF5IGNhbGwgdGhpcyBtZXRob2QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uYm9vdHN0cmFwKHNlZWQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpib290c3RyYXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDktNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYm9vdHN0cmFwKAogICAgLy8gICAgIHNlbGYsIHNlZWQ6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLCBhX2Fzc2V0OiBBc3NldCwgYl9hc3NldDogQXNzZXQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnBvb2xfdG9rZW4sICJhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGJvb3RzdHJhcHBlZCIKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBwb29sX3Rva2VuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjkKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzAKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAyLCAiZ3JvdXAgc2l6ZSBub3QgMiIKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIHNpemUgbm90IDIKICAgIC8vIGFtbS9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IHNlZWQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgc2VlZC5hbW91bnQgPj0gMzAwXzAwMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiICAjIDAuMyBBbGdvcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIGludCAzMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgYV9hc3NldC5hc3NldF9pZCA8IGJfYXNzZXQuYXNzZXRfaWQsICJhc3NldCBhIG11c3QgYmUgbGVzcyB0aGFuIGFzc2V0IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYXNzZXJ0IC8vIGFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYgogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLmFzc2V0X2EgPSBhX2Fzc2V0CiAgICBieXRlICJhc3NldF9hIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBzZWxmLmFzc2V0X2IgPSBiX2Fzc2V0CiAgICBieXRlICJhc3NldF9iIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBzZWxmLl9jcmVhdGVfcG9vbF90b2tlbigpCiAgICBjYWxsc3ViIF9jcmVhdGVfcG9vbF90b2tlbgogICAgYnl0ZSAicG9vbF90b2tlbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzkKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2EpCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXNzZXRfYSBleGlzdHMKICAgIGNhbGxzdWIgX2RvX29wdF9pbgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLl9kb19vcHRfaW4oc2VsZi5hc3NldF9iKQogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2IgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo4MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYucG9vbF90b2tlbi5hc3NldF9pZCkKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBwb29sX3Rva2VuIGV4aXN0cwogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3JlYXRlX3Bvb2xfdG9rZW4oKSAtPiB1aW50NjQ6Cl9jcmVhdGVfcG9vbF90b2tlbjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzAtMjcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jcmVhdGVfcG9vbF90b2tlbihzZWxmKSAtPiBBc3NldDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3My0yODIKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGJ5dGUgIkRQVC0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGUgIi0iCiAgICBjb25jYXQKICAgIGludCAwCiAgICBieXRlICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9iIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzgKICAgIC8vIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc5CiAgICAvLyByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gdW5pdF9uYW1lPWIiZGJ0IiwKICAgIGJ5dGUgImRidCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIGludCBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc2CiAgICAvLyB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICBpbnQgMTAwMDAwMDAwMDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjgwCiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gZGVjaW1hbHM9MywKICAgIGludCAzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjczLTI4MgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3Mi0yODQKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgICAgICBmZWU9MCwKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXNzZXQKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2RvX29wdF9pbihhc3NldDogdWludDY0KSAtPiB2b2lkOgpfZG9fb3B0X2luOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2RvX29wdF9pbihzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyODkKICAgIC8vIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4OC0yOTIKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg4LTI5MgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LmRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRvX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1OS0zNjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZG9fYXNzZXRfdHJhbnNmZXIoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNjEtMzY2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzY1CiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM2MS0zNjYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5taW50KGFfeGZlcjogdWludDY0LCBiX3hmZXI6IHVpbnQ2NCwgcG9vbF9hc3NldDogdWludDY0LCBhX2Fzc2V0OiB1aW50NjQsIGJfYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKbWludDoKICAgIC8vIGFtbS9jb250cmFjdC5weTo4My05NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBtaW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYV94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBiX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIHBvb2xfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gNSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTEzCiAgICAvLyBzZWxmLl9jaGVja19ib290c3RyYXBwZWQoKQogICAgY2FsbHN1YiBfY2hlY2tfYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gIyB3ZWxsLWZvcm1lZCBtaW50CiAgICAvLyBhc3NlcnQgcG9vbF9hc3NldCA9PSBzZWxmLnBvb2xfdG9rZW4sICJhc3NldCBwb29sIGluY29ycmVjdCIKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBwb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludCAwCiAgICBieXRlICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludCAwCiAgICBieXRlICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE5CiAgICAvLyBhc3NlcnQgYV94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gYXNzZXJ0IGJfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjQKICAgIC8vIGFfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMi0xMjUKICAgIC8vICMgdmFsaWQgYXNzZXQgYSB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IGFfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludCAwCiAgICBieXRlICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9hIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gYXNzZXJ0IGFfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgaW50IDAKICAgID4KICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMxCiAgICAvLyBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjktMTMyCiAgICAvLyAjIHZhbGlkIGFzc2V0IGIgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCBiX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXNzZXRfYiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBiX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGludCAwCiAgICA+CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNi0xNDIKICAgIC8vIHRvX21pbnQgPSB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2Ftb3VudD1hX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gICAgIGJfYW1vdW50PWJfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiB0b2tlbnNfdG9fbWludAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gYXNzZXJ0IHRvX21pbnQgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgaW50IDAKICAgID4KICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gIyBtaW50IHRva2VucwogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5wb29sX3Rva2VuLCBhbW91bnQ9dG9fbWludCkKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBwb29sX3Rva2VuIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jaGVja19ib290c3RyYXBwZWQoKSAtPiB2b2lkOgpfY2hlY2tfYm9vdHN0cmFwcGVkOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1My0yNTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jvb3RzdHJhcHBlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU1CiAgICAvLyBhc3NlcnQgc2VsZi5wb29sX3Rva2VuLCAiYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QiCiAgICBpbnQgMAogICAgYnl0ZSAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcG9vbF90b2tlbiBleGlzdHMKICAgIGFzc2VydCAvLyBib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9wb29sX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X3Bvb2xfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X3Bvb2xfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTYKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludCAwCiAgICBieXRlICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBwb29sX3Rva2VuIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2FfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYV9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5OC0yOTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYV9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMwMAogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYl9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9iX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzAyLTMwMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9iX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzA0CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9iLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXNzZXRfYiBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19taW50KHBvb2xfYmFsYW5jZTogdWludDY0LCBhX2JhbGFuY2U6IHVpbnQ2NCwgYl9iYWxhbmNlOiB1aW50NjQsIGFfYW1vdW50OiB1aW50NjQsIGJfYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX21pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzI1LTMzMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICAqLAogICAgLy8gICAgIHBvb2xfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGJfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYW1vdW50OiBVSW50NjQsCiAgICAvLyAgICAgYl9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gNSAxCiAgICBieXRlICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzQKICAgIC8vIGlzX2luaXRpYWxfbWludCA9IGFfYmFsYW5jZSA9PSBhX2Ftb3VudCBhbmQgYl9iYWxhbmNlID09IGJfYW1vdW50CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiB0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDMKICAgIGludCAxCiAgICBiIHRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANAoKdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzOgogICAgaW50IDAKCnRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANDoKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzUKICAgIC8vIGlmIGlzX2luaXRpYWxfbWludDoKICAgIGJ6IHRva2Vuc190b19taW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gcmV0dXJuIG9wLnNxcnQoYV9hbW91bnQgKiBiX2Ftb3VudCkgLSBTQ0FMRQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHNxcnQKICAgIGludCAxMDAwCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlCiAgICBpbnQgMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtNQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gYV9yYXRpbyA9IFNDQUxFICogYV9hbW91bnQgLy8gKGFfYmFsYW5jZSAtIGFfYW1vdW50KQogICAgaW50IDEwMDAKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIC8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM5CiAgICAvLyBiX3JhdGlvID0gU0NBTEUgKiBiX2Ftb3VudCAvLyAoYl9iYWxhbmNlIC0gYl9hbW91bnQpCiAgICBpbnQgMTAwMAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDAKICAgIC8vIGlmIGFfcmF0aW8gPCBiX3JhdGlvOgogICAgPAogICAgYnogdG9rZW5zX3RvX21pbnRfZWxzZV9ib2R5QDgKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDEKICAgIC8vIHJldHVybiBhX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMAogICAgKgogICAgaW50IDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAODoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDMKICAgIC8vIHJldHVybiBiX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMQogICAgKgogICAgaW50IDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fdXBkYXRlX3JhdGlvKCkgLT4gdm9pZDoKX3VwZGF0ZV9yYXRpbzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTctMjU4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF91cGRhdGVfcmF0aW8oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYV9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjAKICAgIC8vIGJfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICBzd2FwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYyCiAgICAvLyBzZWxmLnJhdGlvID0gYV9iYWxhbmNlICogU0NBTEUgLy8gYl9iYWxhbmNlCiAgICBpbnQgMTAwMAogICAgKgogICAgc3dhcAogICAgLwogICAgYnl0ZSAicmF0aW8iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5idXJuKHBvb2xfeGZlcjogdWludDY0LCBwb29sX2Fzc2V0OiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpidXJuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0OS0xNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgYnVybigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHBvb2xfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgcG9vbF9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYV9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYl9hc3NldDogQXNzZXQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzIKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgaW50IDAKICAgIGJ5dGUgInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHBvb2xfdG9rZW4gZXhpc3RzCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgcG9vbCBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzUKICAgIC8vIGFzc2VydCBhX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzYKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzkKICAgIC8vIHBvb2xfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3OC0xODAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgxCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBpbnQgMAogICAgPgogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxODIKICAgIC8vIGFzc2VydCBwb29sX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLnBvb2xfdG9rZW4sICJhc3NldCBwb29sIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnQgMAogICAgYnl0ZSAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcG9vbF90b2tlbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgcG9vbCBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxODMKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg1LTE4NwogICAgLy8gIyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgaXNzdWVkCiAgICAvLyAjICFpbXBvcnRhbnQ6IHRoaXMgaGFwcGVucyBwcmlvciB0byByZWNlaXZpbmcgdGhlIGN1cnJlbnQgYXhmZXIgb2YgcG9vbCB0b2tlbnMKICAgIC8vIHBvb2xfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfcG9vbF9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkwCiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg4LTE5MgogICAgLy8gYV9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICBjb3ZlciAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTk1CiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkzLTE5NwogICAgLy8gYl9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICBzd2FwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTk5LTIwMAogICAgLy8gIyBTZW5kIGJhY2sgY29tbWVuc3VyYXRlIGFtdCBvZiBhCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLmFzc2V0X2EsIGFtb3VudD1hX2FtdCkKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9hIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjAyLTIwMwogICAgLy8gIyBTZW5kIGJhY2sgY29tbWVuc3VyYXRlIGFtdCBvZiBiCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLmFzc2V0X2IsIGFtb3VudD1iX2FtdCkKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9iIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX2J1cm4ocG9vbF9iYWxhbmNlOiB1aW50NjQsIHN1cHBseTogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogp0b2tlbnNfdG9fYnVybjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDYtMzQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRva2Vuc190b19idXJuKCosIHBvb2xfYmFsYW5jZTogVUludDY0LCBzdXBwbHk6IFVJbnQ2NCwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlIC0gYW1vdW50CiAgICBpbnQgMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ5CiAgICAvLyByZXR1cm4gc3VwcGx5ICogYW1vdW50IC8vIGlzc3VlZAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHN3YXAKICAgIC8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc3dhcChzd2FwX3hmZXI6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA2LTIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIHN3YXAoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzd2FwX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBieXRlICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjUKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCBhX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzAKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGludCAwCiAgICA+CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gYXNzZXJ0IHN3YXBfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzQKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgaW50IDAKICAgIGJ5dGUgImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2EgZXhpc3RzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM4CiAgICAvLyBjYXNlIHNlbGYuYXNzZXRfYjoKICAgIGludCAwCiAgICBieXRlICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9iIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gbWF0Y2ggc3dhcF94ZmVyLnhmZXJfYXNzZXQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMy0yNDMKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYQogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYgogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiYXNzZXQgaWQgaW5jb3JyZWN0IgogICAgbWF0Y2ggc3dhcF9zd2l0Y2hfY2FzZV8wQDEgc3dhcF9zd2l0Y2hfY2FzZV8xQDIKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDMKICAgIC8vIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIGVyciAvLyBhc3NldCBpZCBpbmNvcnJlY3QKCnN3YXBfc3dpdGNoX2Nhc2VfMEAxOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM3CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIGludCAwCiAgICBieXRlICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIGFzc2V0X2EgZXhpc3RzCiAgICBiIHN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0Cgpzd2FwX3N3aXRjaF9jYXNlXzFAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzkKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDAKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9iCiAgICBpbnQgMAogICAgYnl0ZSAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBhc3NldF9iIGV4aXN0cwoKc3dhcF9zd2l0Y2hfY2FzZV9uZXh0QDQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ1LTI0NwogICAgLy8gdG9fc3dhcCA9IHRva2Vuc190b19zd2FwKAogICAgLy8gICAgIGluX2Ftb3VudD1zd2FwX3hmZXIuYXNzZXRfYW1vdW50LCBpbl9zdXBwbHk9aW5fc3VwcGx5LCBvdXRfc3VwcGx5PW91dF9zdXBwbHkKICAgIC8vICkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRva2Vuc190b19zd2FwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ4CiAgICAvLyBhc3NlcnQgdG9fc3dhcCA+IDAsICJzZW5kIGFtb3VudCB0b28gbG93IgogICAgZHVwCiAgICBpbnQgMAogICAgPgogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTAKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PW91dF9hc3NldCwgYW1vdW50PXRvX3N3YXApCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjUxCiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX3N3YXAoaW5fYW1vdW50OiB1aW50NjQsIGluX3N1cHBseTogdWludDY0LCBvdXRfc3VwcGx5OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX3N3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUyLTM1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fc3dhcCgqLCBpbl9hbW91bnQ6IFVJbnQ2NCwgaW5fc3VwcGx5OiBVSW50NjQsIG91dF9zdXBwbHk6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU0CiAgICAvLyBpbl90b3RhbCA9IFNDQUxFICogKGluX3N1cHBseSAtIGluX2Ftb3VudCkgKyAoaW5fYW1vdW50ICogRkFDVE9SKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGludCAxMDAwCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIGludCA5OTUKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gb3V0X3RvdGFsID0gaW5fYW1vdW50ICogRkFDVE9SICogb3V0X3N1cHBseQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU2CiAgICAvLyByZXR1cm4gb3V0X3RvdGFsIC8vIGluX3RvdGFsCiAgICBzd2FwCiAgICAvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjgKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzItMzMKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEEKICAgIC8vIHNlbGYuYXNzZXRfYSA9IEFzc2V0KDApCiAgICBieXRlICJhc3NldF9hIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KDApCiAgICBieXRlICJhc3NldF9iIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzYtMzcKICAgIC8vICMgVGhlIGN1cnJlbnQgZ292ZXJub3Igb2YgdGhpcyBjb250cmFjdCwgYWxsb3dlZCB0byBkbyBhZG1pbiB0eXBlIGFjdGlvbnMKICAgIC8vIHNlbGYuZ292ZXJub3IgPSBUeG4uc2VuZGVyCiAgICBieXRlICJnb3Zlcm5vciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzgtMzkKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIHRoZSBQb29sIFRva2VuLCB1c2VkIHRvIHRyYWNrIHNoYXJlIG9mIHBvb2wgdGhlIGhvbGRlciBtYXkgcmVjb3ZlcgogICAgLy8gc2VsZi5wb29sX3Rva2VuID0gQXNzZXQoMCkKICAgIGJ5dGUgInBvb2xfdG9rZW4iCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo0MC00MQogICAgLy8gIyBUaGUgcmF0aW8gYmV0d2VlbiBhc3NldHMgKEEqU2NhbGUvQikKICAgIC8vIHNlbGYucmF0aW8gPSBVSW50NjQoMCkKICAgIGJ5dGUgInJhdGlvIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/amm/out/ConstantProductAMM.destructured.ir b/examples/amm/out/ConstantProductAMM.destructured.ir index 8fafb84123..35b514a1d9 100644 --- a/examples/amm/out/ConstantProductAMM.destructured.ir +++ b/examples/amm/out/ConstantProductAMM.destructured.ir @@ -132,7 +132,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L264 let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check governor exists let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return @@ -140,7 +140,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() @@ -161,13 +161,13 @@ contract examples.amm.contract.ConstantProductAMM: let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check asset_a exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check asset_b exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check pool_token exists let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) return val_as_bytes%18#0 @@ -175,13 +175,13 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L270 itxn_begin let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check asset_a exists let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check asset_b exists let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) @@ -220,15 +220,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) @@ -245,7 +245,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check value exists + (assert app_global_get_ex_did_exist%20#0) // check asset_a exists let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) @@ -257,7 +257,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check asset_b exists let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) @@ -271,7 +271,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check value exists + (assert app_global_get_ex_did_exist%41#0) // check pool_token exists examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -279,7 +279,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first return @@ -287,7 +287,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check pool_token exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -296,7 +296,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -305,7 +305,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -364,15 +364,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) @@ -384,7 +384,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check pool_token exists let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) @@ -398,11 +398,11 @@ contract examples.amm.contract.ConstantProductAMM: let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%12#0) let tmp%25#0: bytes = (txn Sender) let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check value exists + (assert app_global_get_ex_did_exist%27#0) // check asset_a exists examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check value exists + (assert app_global_get_ex_did_exist%30#0) // check asset_b exists examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -419,11 +419,11 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asset_a exists let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset a incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) @@ -434,22 +434,22 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check asset_a exists let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check value exists + (assert app_global_get_ex_did_exist%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => fail // asset id incorrect} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let (out_asset#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check asset_a exists goto block@4 block@2: // switch_case_1_L239 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let (out_asset#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check value exists + (assert app_global_get_ex_did_exist%19#0) // check asset_b exists goto block@4 block@4: // switch_case_next_L233 let to_swap#0: uint64 = examples.amm.contract.tokens_to_swap(tmp%6#0, in_supply#0, out_supply#0) diff --git a/examples/amm/out/ConstantProductAMM.ssa.ir b/examples/amm/out/ConstantProductAMM.ssa.ir index 000bb5d315..0554d87f4a 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.ir @@ -145,7 +145,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L264 let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check governor exists let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return @@ -153,7 +153,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() @@ -174,13 +174,13 @@ contract examples.amm.contract.ConstantProductAMM: let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check asset_a exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check asset_b exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check pool_token exists let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) return val_as_bytes%18#0 @@ -197,13 +197,13 @@ contract examples.amm.contract.ConstantProductAMM: let inner_txn_params%1%%AssetAmount_length#0: uint64 = 0u let inner_txn_params%1%%AssetCloseTo_length#0: uint64 = 0u let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check asset_a exists let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check asset_b exists let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) @@ -472,15 +472,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) @@ -497,7 +497,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check value exists + (assert app_global_get_ex_did_exist%20#0) // check asset_a exists let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) @@ -509,7 +509,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check asset_b exists let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) @@ -525,7 +525,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check value exists + (assert app_global_get_ex_did_exist%41#0) // check pool_token exists examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -533,7 +533,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first return @@ -541,7 +541,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check pool_token exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -550,7 +550,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -559,7 +559,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -618,15 +618,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) @@ -638,7 +638,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check pool_token exists let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) @@ -654,11 +654,11 @@ contract examples.amm.contract.ConstantProductAMM: let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%24#0) let tmp%25#0: bytes = (txn Sender) let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check value exists + (assert app_global_get_ex_did_exist%27#0) // check asset_a exists examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check value exists + (assert app_global_get_ex_did_exist%30#0) // check asset_b exists examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -675,11 +675,11 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asset_a exists let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset a incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) @@ -690,23 +690,23 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check asset_a exists let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check value exists + (assert app_global_get_ex_did_exist%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => block@3} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check asset_a exists let out_asset#0: uint64 = app_global_get_ex_value%16#0 goto block@4 block@2: // switch_case_1_L239 let in_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let (app_global_get_ex_value%18#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check value exists + (assert app_global_get_ex_did_exist%19#0) // check asset_b exists let out_asset#1: uint64 = app_global_get_ex_value%18#0 goto block@4 block@3: // switch_case_default_L233 diff --git a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir index 5990ab4f9f..a1487bceae 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir @@ -132,7 +132,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L264 let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check governor exists let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return @@ -140,7 +140,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() @@ -161,13 +161,13 @@ contract examples.amm.contract.ConstantProductAMM: let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check asset_a exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check asset_b exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check pool_token exists let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) return val_as_bytes%18#0 @@ -175,13 +175,13 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L270 itxn_begin let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check asset_a exists let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check asset_b exists let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) @@ -220,15 +220,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) @@ -245,7 +245,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check value exists + (assert app_global_get_ex_did_exist%20#0) // check asset_a exists let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) @@ -257,7 +257,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check asset_b exists let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) @@ -271,7 +271,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check value exists + (assert app_global_get_ex_did_exist%41#0) // check pool_token exists examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -279,7 +279,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first return @@ -287,7 +287,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check pool_token exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -296,7 +296,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -305,7 +305,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -363,15 +363,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) @@ -383,7 +383,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check pool_token exists let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) @@ -397,11 +397,11 @@ contract examples.amm.contract.ConstantProductAMM: let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%12#0) let tmp%25#0: bytes = (txn Sender) let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check value exists + (assert app_global_get_ex_did_exist%27#0) // check asset_a exists examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check value exists + (assert app_global_get_ex_did_exist%30#0) // check asset_b exists examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -418,11 +418,11 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asset_a exists let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset a incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) @@ -433,22 +433,22 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check asset_a exists let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check value exists + (assert app_global_get_ex_did_exist%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => fail // asset id incorrect} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let (out_asset#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check asset_a exists goto block@4 block@2: // switch_case_1_L239 let in_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let (out_asset#1: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check value exists + (assert app_global_get_ex_did_exist%19#0) // check asset_b exists goto block@4 block@4: // switch_case_next_L233 let in_supply#2: uint64 = φ(in_supply#0 <- block@1, in_supply#1 <- block@2) diff --git a/examples/amm/out_O2/ConstantProductAMM.approval.teal b/examples/amm/out_O2/ConstantProductAMM.approval.teal index b2296bf8c0..12f57f4982 100644 --- a/examples/amm/out_O2/ConstantProductAMM.approval.teal +++ b/examples/amm/out_O2/ConstantProductAMM.approval.teal @@ -172,7 +172,7 @@ _check_is_governor: int 0 byte "governor" app_global_get_ex - assert // check value exists + assert // check governor exists == assert // Only the account set in global_state.governor may call this method retsub @@ -184,7 +184,7 @@ bootstrap: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists ! assert // application has already been bootstrapped callsub _check_is_governor @@ -219,17 +219,17 @@ bootstrap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists callsub _do_opt_in int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists callsub _do_opt_in int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists itob retsub @@ -241,7 +241,7 @@ _create_pool_token: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists asset_params_get AssetUnitName assert // asset exists byte "DPT-" @@ -252,7 +252,7 @@ _create_pool_token: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists asset_params_get AssetUnitName assert // asset exists concat @@ -311,21 +311,21 @@ mint: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists frame_dig -3 == assert // asset pool incorrect int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 == assert // asset a incorrect int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 == assert // asset b incorrect @@ -349,7 +349,7 @@ mint: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists == assert // asset a incorrect frame_dig -5 @@ -368,7 +368,7 @@ mint: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists == assert // asset b incorrect frame_dig -4 @@ -391,7 +391,7 @@ mint: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists uncover 2 callsub do_asset_transfer callsub _update_ratio @@ -404,7 +404,7 @@ _check_bootstrapped: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists assert // bootstrap method needs to be called first retsub @@ -416,7 +416,7 @@ _current_pool_balance: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -429,7 +429,7 @@ _current_a_balance: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -442,7 +442,7 @@ _current_b_balance: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -541,21 +541,21 @@ burn: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists frame_dig -3 == assert // asset pool incorrect int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 == assert // asset a incorrect int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 == assert // asset b incorrect @@ -575,7 +575,7 @@ burn: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists == assert // asset pool incorrect frame_dig -4 @@ -598,14 +598,14 @@ burn: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists uncover 2 callsub do_asset_transfer txn Sender int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists uncover 2 callsub do_asset_transfer callsub _update_ratio @@ -637,14 +637,14 @@ swap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 == assert // asset a incorrect int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 == assert // asset b incorrect @@ -662,11 +662,11 @@ swap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -3 gtxns XferAsset match swap_switch_case_0@1 swap_switch_case_1@2 @@ -681,7 +681,7 @@ swap_switch_case_0@1: app_global_get_ex swap frame_bury 1 - assert // check value exists + assert // check asset_a exists b swap_switch_case_next@4 swap_switch_case_1@2: @@ -693,7 +693,7 @@ swap_switch_case_1@2: app_global_get_ex swap frame_bury 1 - assert // check value exists + assert // check asset_b exists swap_switch_case_next@4: frame_dig 2 diff --git a/examples/amm/out_O2/ConstantProductAMM.destructured.ir b/examples/amm/out_O2/ConstantProductAMM.destructured.ir index 8fafb84123..35b514a1d9 100644 --- a/examples/amm/out_O2/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_O2/ConstantProductAMM.destructured.ir @@ -132,7 +132,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L264 let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check governor exists let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return @@ -140,7 +140,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() @@ -161,13 +161,13 @@ contract examples.amm.contract.ConstantProductAMM: let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check asset_a exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check asset_b exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check pool_token exists let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) return val_as_bytes%18#0 @@ -175,13 +175,13 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L270 itxn_begin let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check asset_a exists let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check asset_b exists let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) @@ -220,15 +220,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) @@ -245,7 +245,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check value exists + (assert app_global_get_ex_did_exist%20#0) // check asset_a exists let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) @@ -257,7 +257,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check asset_b exists let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) @@ -271,7 +271,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check value exists + (assert app_global_get_ex_did_exist%41#0) // check pool_token exists examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -279,7 +279,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first return @@ -287,7 +287,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check pool_token exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -296,7 +296,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -305,7 +305,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -364,15 +364,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) @@ -384,7 +384,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check pool_token exists let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) @@ -398,11 +398,11 @@ contract examples.amm.contract.ConstantProductAMM: let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%12#0) let tmp%25#0: bytes = (txn Sender) let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check value exists + (assert app_global_get_ex_did_exist%27#0) // check asset_a exists examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check value exists + (assert app_global_get_ex_did_exist%30#0) // check asset_b exists examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -419,11 +419,11 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asset_a exists let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset a incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) @@ -434,22 +434,22 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check asset_a exists let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check value exists + (assert app_global_get_ex_did_exist%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => fail // asset id incorrect} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let (out_asset#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check asset_a exists goto block@4 block@2: // switch_case_1_L239 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let (out_asset#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check value exists + (assert app_global_get_ex_did_exist%19#0) // check asset_b exists goto block@4 block@4: // switch_case_next_L233 let to_swap#0: uint64 = examples.amm.contract.tokens_to_swap(tmp%6#0, in_supply#0, out_supply#0) diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal b/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal index e91bebe55a..c1e96b4991 100644 --- a/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal +++ b/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal @@ -292,7 +292,7 @@ _check_is_governor: int 0 byte "governor" app_global_get_ex - assert // check value exists + assert // check governor exists == // amm/contract.py:266-268 // assert ( @@ -315,7 +315,7 @@ bootstrap: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists ! assert // application has already been bootstrapped // amm/contract.py:69 @@ -368,21 +368,21 @@ bootstrap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists callsub _do_opt_in // amm/contract.py:80 // self._do_opt_in(self.asset_b) int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists callsub _do_opt_in // amm/contract.py:81 // return arc4.UInt64(self.pool_token.asset_id) int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists itob retsub @@ -410,7 +410,7 @@ _create_pool_token: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists asset_params_get AssetUnitName assert // asset exists byte "DPT-" @@ -421,7 +421,7 @@ _create_pool_token: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists asset_params_get AssetUnitName assert // asset exists concat @@ -584,7 +584,7 @@ mint: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists frame_dig -3 swap == @@ -594,7 +594,7 @@ mint: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 swap == @@ -604,7 +604,7 @@ mint: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 swap == @@ -642,7 +642,7 @@ mint: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists == assert // asset a incorrect // amm/contract.py:127 @@ -671,7 +671,7 @@ mint: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists == assert // asset b incorrect // amm/contract.py:134 @@ -725,7 +725,7 @@ mint: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists uncover 2 callsub do_asset_transfer // amm/contract.py:147 @@ -745,7 +745,7 @@ _check_bootstrapped: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists assert // bootstrap method needs to be called first retsub @@ -762,7 +762,7 @@ _current_pool_balance: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -780,7 +780,7 @@ _current_a_balance: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -798,7 +798,7 @@ _current_b_balance: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists asset_holding_get AssetBalance assert // account opted into asset retsub @@ -955,7 +955,7 @@ burn: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists frame_dig -3 swap == @@ -965,7 +965,7 @@ burn: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 swap == @@ -975,7 +975,7 @@ burn: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 swap == @@ -1005,7 +1005,7 @@ burn: int 0 byte "pool_token" app_global_get_ex - assert // check value exists + assert // check pool_token exists == assert // asset pool incorrect // amm/contract.py:183 @@ -1063,7 +1063,7 @@ burn: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists uncover 2 callsub do_asset_transfer // amm/contract.py:202-203 @@ -1073,7 +1073,7 @@ burn: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists uncover 2 callsub do_asset_transfer // amm/contract.py:204 @@ -1131,7 +1131,7 @@ swap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_dig -2 swap == @@ -1141,7 +1141,7 @@ swap: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_dig -1 swap == @@ -1165,13 +1165,13 @@ swap: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists // amm/contract.py:238 // case self.asset_b: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists // amm/contract.py:233 // match swap_xfer.xfer_asset: frame_dig -3 @@ -1209,7 +1209,7 @@ swap_switch_case_0@1: int 0 byte "asset_a" app_global_get_ex - assert // check value exists + assert // check asset_a exists frame_bury 1 b swap_switch_case_next@4 @@ -1226,7 +1226,7 @@ swap_switch_case_1@2: int 0 byte "asset_b" app_global_get_ex - assert // check value exists + assert // check asset_b exists frame_bury 1 b swap_switch_case_next@4 diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir index e1002dbf5e..325d263d09 100644 --- a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir @@ -150,7 +150,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L264 let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check governor exists let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return @@ -158,7 +158,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() @@ -179,13 +179,13 @@ contract examples.amm.contract.ConstantProductAMM: let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check asset_a exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check asset_b exists examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check pool_token exists let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) return val_as_bytes%18#0 @@ -193,13 +193,13 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L270 itxn_begin let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check asset_a exists let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check asset_b exists let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) @@ -252,15 +252,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) @@ -277,7 +277,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check value exists + (assert app_global_get_ex_did_exist%20#0) // check asset_a exists let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) @@ -289,7 +289,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check asset_b exists let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) @@ -305,7 +305,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check value exists + (assert app_global_get_ex_did_exist%41#0) // check pool_token exists examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -313,7 +313,7 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first return @@ -321,7 +321,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check pool_token exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -330,7 +330,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -339,7 +339,7 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -397,15 +397,15 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check pool_token exists let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset pool incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_a exists let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset a incorrect let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asset_b exists let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) @@ -417,7 +417,7 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check pool_token exists let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) @@ -433,11 +433,11 @@ contract examples.amm.contract.ConstantProductAMM: let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%24#0) let tmp%25#0: bytes = (txn Sender) let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check value exists + (assert app_global_get_ex_did_exist%27#0) // check asset_a exists examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check value exists + (assert app_global_get_ex_did_exist%30#0) // check asset_b exists examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -454,11 +454,11 @@ contract examples.amm.contract.ConstantProductAMM: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asset_a exists let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) (assert tmp%2#0) // asset a incorrect let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asset_b exists let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) @@ -469,23 +469,23 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check asset_a exists let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check value exists + (assert app_global_get_ex_did_exist%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => block@3} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check asset_a exists let out_asset#0: uint64 = app_global_get_ex_value%16#0 goto block@4 block@2: // switch_case_1_L239 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let (app_global_get_ex_value%18#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check value exists + (assert app_global_get_ex_did_exist%19#0) // check asset_b exists let out_asset#0: uint64 = app_global_get_ex_value%18#0 goto block@4 block@3: // switch_case_default_L233 diff --git a/examples/auction/out/Auction.approval.mir b/examples/auction/out/Auction.approval.mir index 93bdd03432..ec079d1abc 100644 --- a/examples/auction/out/Auction.approval.mir +++ b/examples/auction/out/Auction.approval.mir @@ -226,7 +226,7 @@ opt_into_asset_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - assert // check value exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 @@ -271,7 +271,7 @@ start_auction_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - assert // check value exists // (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + assert // check auction_end exists // (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0 e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 ! // (𝕡) starting_price#0,length#0,axfer#0 | {!} e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%5#0 e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 @@ -336,7 +336,7 @@ bid_block@0: // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - assert // check value exists // (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + assert // check auction_end exists // (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) pay#0 | app_global_get_ex_value%1#0,tmp%0#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 < // (𝕡) pay#0 | {<} e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 @@ -363,7 +363,7 @@ bid_block@0: // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.previous_bid auction/contract.py:74 // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:74 // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:74 - assert // check value exists // (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0 self.previous_bid auction/contract.py:74 + assert // check previous_bid exists // (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0 self.previous_bid auction/contract.py:74 dig 1 // load tmp%7#0 from l-stack (copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0,tmp%7#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 swap // load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,tmp%7#0,app_global_get_ex_value%8#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 > // (𝕡) pay#0 | tmp%4#0,tmp%7#0,{>} pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 @@ -401,7 +401,7 @@ claim_bids_block@0: cover 2 // store original_amount#0 to l-stack (copy) original_amount#0,app_local_get_ex_did_exist%2#0,original_amount#0 self.claimable_amount[Txn.sender] auction/contract.py:85 cover 2 // store original_amount#0 to f-stack (𝕗) original_amount#0 | original_amount#0,app_local_get_ex_did_exist%2#0 self.claimable_amount[Txn.sender] auction/contract.py:85 // virtual: load app_local_get_ex_did_exist%2#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,app_local_get_ex_did_exist%2#0 self.claimable_amount[Txn.sender] auction/contract.py:85 - assert // check value exists // (𝕗) original_amount#0 | original_amount#0 self.claimable_amount[Txn.sender] auction/contract.py:85 + assert // check claimable_amount exists for account // (𝕗) original_amount#0 | original_amount#0 self.claimable_amount[Txn.sender] auction/contract.py:85 txn Sender // (𝕗) original_amount#0 | original_amount#0,{txn} ubtract previous bid if sender is previous bidder\nif Txn.sender auction/contract.py:87-88 // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0 ubtract previous bid if sender is previous bidder\nif Txn.sender auction/contract.py:87-88 int 0 // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 @@ -410,7 +410,7 @@ claim_bids_block@0: // virtual: store app_global_get_ex_did_exist%6#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_did_exist%6#0,{app_global_get_ex}.0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 // virtual: store app_global_get_ex_value%5#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 // virtual: load app_global_get_ex_did_exist%6#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - assert // check value exists // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + assert // check previous_bidder exists // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,app_global_get_ex_value%5#0,tmp%4#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 // virtual: load app_global_get_ex_value%5#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 == // (𝕗) original_amount#0 | original_amount#0,{==} ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 @@ -428,7 +428,7 @@ claim_bids_if_body@1: // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.previous_bid auction/contract.py:89 // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:89 // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:89 - assert // check value exists // (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0 self.previous_bid auction/contract.py:89 + assert // check previous_bid exists // (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0 self.previous_bid auction/contract.py:89 frame_dig 0 // load original_amount#0 from f-stack (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0,original_amount#0 amount -= self.previous_bid auction/contract.py:89 swap // load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | original_amount#0,app_global_get_ex_value%8#0 amount -= self.previous_bid auction/contract.py:89 - // (𝕗) original_amount#0,amount#1 | {-} amount -= self.previous_bid auction/contract.py:89 @@ -475,7 +475,7 @@ claim_asset_block@0: // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.auction_end auction/contract.py:101 // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.auction_end auction/contract.py:101 // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.auction_end auction/contract.py:101 - assert // check value exists // (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0 self.auction_end auction/contract.py:101 + assert // check auction_end exists // (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0 self.auction_end auction/contract.py:101 // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%1#0,tmp%0#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 > // (𝕡) asset#0 | {>} Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 @@ -489,21 +489,21 @@ claim_asset_block@0: // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.asa_amount auction/contract.py:108 // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asa_amount auction/contract.py:108 // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asa_amount auction/contract.py:108 - assert // check value exists // (𝕡) asset#0 | app_global_get_ex_value%6#0 self.asa_amount auction/contract.py:108 + assert // check asa_amount exists // (𝕡) asset#0 | app_global_get_ex_value%6#0 self.asa_amount auction/contract.py:108 int 0 // (𝕡) asset#0 | app_global_get_ex_value%6#0,0 self.previous_bidder auction/contract.py:106 byte "previous_bidder" // (𝕡) asset#0 | app_global_get_ex_value%6#0,0,"previous_bidder" self.previous_bidder auction/contract.py:106 app_global_get_ex // (𝕡) asset#0 | app_global_get_ex_value%6#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bidder auction/contract.py:106 // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.previous_bidder auction/contract.py:106 // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bidder auction/contract.py:106 // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bidder auction/contract.py:106 - assert // check value exists // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0 self.previous_bidder auction/contract.py:106 + assert // check previous_bidder exists // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0 self.previous_bidder auction/contract.py:106 int 0 // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,0 self.previous_bidder auction/contract.py:107 byte "previous_bidder" // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,0,"previous_bidder" self.previous_bidder auction/contract.py:107 app_global_get_ex // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bidder auction/contract.py:107 // virtual: store app_global_get_ex_did_exist%11#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%11#0,{app_global_get_ex}.0 self.previous_bidder auction/contract.py:107 // virtual: store app_global_get_ex_value%10#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.previous_bidder auction/contract.py:107 // virtual: load app_global_get_ex_did_exist%11#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.previous_bidder auction/contract.py:107 - assert // check value exists // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 self.previous_bidder auction/contract.py:107 + assert // check previous_bidder exists // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 self.previous_bidder auction/contract.py:107 frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,asset#0 itxn_field XferAsset // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 int axfer // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,axfer # Send ASA to previous bidder\nitxn.AssetTransfer auction/contract.py:102-103 diff --git a/examples/auction/out/Auction.approval.teal b/examples/auction/out/Auction.approval.teal index d429c3808b..7a8f2edf8e 100644 --- a/examples/auction/out/Auction.approval.teal +++ b/examples/auction/out/Auction.approval.teal @@ -164,7 +164,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in // auction/contract.py:31-32 @@ -230,7 +230,7 @@ start_auction: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists ! assert // auction already started // auction/contract.py:55 @@ -294,7 +294,7 @@ bid: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists < assert // auction has ended // auction/contract.py:72-73 @@ -313,7 +313,7 @@ bid: int 0 byte "previous_bid" app_global_get_ex - assert // check value exists + assert // check previous_bid exists dig 1 < assert // Bid must be higher than previous bid @@ -353,7 +353,7 @@ claim_bids: swap dup uncover 2 - assert // check value exists + assert // check claimable_amount exists for account // auction/contract.py:87-88 // # subtract previous bid if sender is previous bidder // if Txn.sender == self.previous_bidder: @@ -361,7 +361,7 @@ claim_bids: int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists == bz claim_bids_after_if_else@2 // auction/contract.py:89 @@ -369,7 +369,7 @@ claim_bids: int 0 byte "previous_bid" app_global_get_ex - assert // check value exists + assert // check previous_bid exists frame_dig 0 swap - @@ -429,7 +429,7 @@ claim_asset: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists > assert // auction has not ended // auction/contract.py:102-109 @@ -447,19 +447,19 @@ claim_asset: int 0 byte "asa_amount" app_global_get_ex - assert // check value exists + assert // check asa_amount exists // auction/contract.py:106 // asset_close_to=self.previous_bidder, int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists // auction/contract.py:107 // asset_receiver=self.previous_bidder, int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists frame_dig -1 itxn_field XferAsset // auction/contract.py:102-103 diff --git a/examples/auction/out/Auction.arc32.json b/examples/auction/out/Auction.arc32.json index ad7d1faa48..00df83a1a4 100644 --- a/examples/auction/out/Auction.arc32.json +++ b/examples/auction/out/Auction.arc32.json @@ -32,7 +32,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9lbnRyeXBvaW50QDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fZW50cnlwb2ludEAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEyCiAgICBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiCiAgICBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIgogICAgbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICBtZXRob2QgImJpZChwYXkpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2ludG9fYXNzZXRfcm91dGVANCBtYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANSBtYWluX29wdF9pbl9yb3V0ZUA2IG1haW5fYmlkX3JvdXRlQDcgbWFpbl9jbGFpbV9iaWRzX3JvdXRlQDggbWFpbl9jbGFpbV9hc3NldF9yb3V0ZUA5CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTUKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fb3B0X2luX3JvdXRlQDY6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JpZF9yb3V0ZUA3OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBiaWQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYmlkc19yb3V0ZUA4OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltX2JpZHMKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYXNzZXRfcm91dGVAOToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xhaW1fYXNzZXQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmFzc2V0X2lkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludCAwCiAgICBieXRlICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZSAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zOQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnQgYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzgKICAgIC8vIGZlZT0wLAogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzQtMzkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5zdGFydF9hdWN0aW9uKHN0YXJ0aW5nX3ByaWNlOiBieXRlcywgbGVuZ3RoOiBieXRlcywgYXhmZXI6IHVpbnQ2NCkgLT4gdm9pZDoKc3RhcnRfYXVjdGlvbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDEtNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHN0YXJ0X2F1Y3Rpb24oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzdGFydGluZ19wcmljZTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbGVuZ3RoOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBheGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJhdWN0aW9uIG11c3QgYmUgc3RhcnRlZCBieSBjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGF1Y3Rpb24gbXVzdCBiZSBzdGFydGVkIGJ5IGNyZWF0b3IKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTAtNTEKICAgIC8vICMgRW5zdXJlIHRoZSBhdWN0aW9uIGhhc24ndCBhbHJlYWR5IGJlZW4gc3RhcnRlZAogICAgLy8gYXNzZXJ0IHNlbGYuYXVjdGlvbl9lbmQgPT0gMCwgImF1Y3Rpb24gYWxyZWFkeSBzdGFydGVkIgogICAgaW50IDAKICAgIGJ5dGUgImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhdWN0aW9uIGFscmVhZHkgc3RhcnRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo1NQogICAgLy8gYXhmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTMtNTYKICAgIC8vICMgVmVyaWZ5IGF4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwIgogICAgYXNzZXJ0IC8vIGF4ZmVyIG11c3QgdHJhbnNmZXIgdG8gdGhpcyBhcHAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTgtNTkKICAgIC8vICMgU2V0IGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2FfYW1vdW50ID0gYXhmZXIuYXNzZXRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBieXRlICJhc2FfYW1vdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjAKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGxlbmd0aC5kZWNvZGUoKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICArCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHN0YXJ0aW5nX3ByaWNlLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ0b2kKICAgIGJ5dGUgInByZXZpb3VzX2JpZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24ub3B0X2luKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2My02NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3B0X2luKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5iaWQocGF5OiB1aW50NjQpIC0+IHZvaWQ6CmJpZDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjctNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJpZChzZWxmLCBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjY5LTcwCiAgICAvLyAjIEVuc3VyZSBhdWN0aW9uIGhhc24ndCBlbmRlZAogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5hdWN0aW9uX2VuZCwgImF1Y3Rpb24gaGFzIGVuZGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50IDAKICAgIGJ5dGUgImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIDwKICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBlbmRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBWZXJpZnkgcGF5bWVudCB0cmFuc2FjdGlvbgogICAgLy8gYXNzZXJ0IHBheS5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInBheW1lbnQgc2VuZGVyIG11c3QgbWF0Y2ggdHJhbnNhY3Rpb24gc2VuZGVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBTZW5kZXIKICAgIGR1cAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NAogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPiBzZWxmLnByZXZpb3VzX2JpZCwgIkJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnQgMAogICAgYnl0ZSAicHJldmlvdXNfYmlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGRpZyAxCiAgICA8CiAgICBhc3NlcnQgLy8gQmlkIG11c3QgYmUgaGlnaGVyIHRoYW4gcHJldmlvdXMgYmlkCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc2LTc3CiAgICAvLyAjIHNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkID0gcGF5LmFtb3VudAogICAgYnl0ZSAicHJldmlvdXNfYmlkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IHBheS5zZW5kZXIKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODAtODEKICAgIC8vICMgVXBkYXRlIGNsYWltYWJsZSBhbW91bnQKICAgIC8vIHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXSA9IHBheS5hbW91bnQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGUgImNsYWltYWJsZV9hbW91bnQiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9iaWRzKCkgLT4gdm9pZDoKY2xhaW1fYmlkczoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODMtODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsYWltX2JpZHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4NQogICAgLy8gYW1vdW50ID0gb3JpZ2luYWxfYW1vdW50ID0gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdCiAgICB0eG4gU2VuZGVyCiAgICBpbnQgMAogICAgYnl0ZSAiY2xhaW1hYmxlX2Ftb3VudCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg3LTg4CiAgICAvLyAjIHN1YnRyYWN0IHByZXZpb3VzIGJpZCBpZiBzZW5kZXIgaXMgcHJldmlvdXMgYmlkZGVyCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYucHJldmlvdXNfYmlkZGVyOgogICAgdHhuIFNlbmRlcgogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICA9PQogICAgYnogY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODkKICAgIC8vIGFtb3VudCAtPSBzZWxmLnByZXZpb3VzX2JpZAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpjbGFpbV9iaWRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTEtOTUKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MQogICAgLy8gaXR4bi5QYXltZW50KAogICAgaW50IHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gZmVlPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkxLTk1CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXSA9IG9yaWdpbmFsX2Ftb3VudCAtIGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIHR4biBTZW5kZXIKICAgIGJ5dGUgImNsYWltYWJsZV9hbW91bnQiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbGFpbV9hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAxCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgbm90IGVuZGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50IDAKICAgIGJ5dGUgImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAyLTEwOQogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIGludCAwCiAgICBieXRlICJhc2FfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NldF9jbG9zZV90bz1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludCAwCiAgICBieXRlICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMi0xMDMKICAgIC8vICMgU2VuZCBBU0EgdG8gcHJldmlvdXMgYmlkZGVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnQgYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDItMTA5CiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gVUludDY0KDApCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxOAogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBVSW50NjQoMCkKICAgIGJ5dGUgInByZXZpb3VzX2JpZCIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxOQogICAgLy8gc2VsZi5hc2FfYW1vdW50ID0gVUludDY0KDApCiAgICBieXRlICJhc2FfYW1vdW50IgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmFzYSA9IEFzc2V0KDApCiAgICBieXRlICJhc2EiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjEtMjIKICAgIC8vICMgVXNlIHplcm8gYWRkcmVzcyByYXRoZXIgdGhhbiBhbiBlbXB0eSBzdHJpbmcgZm9yIEFjY291bnQgdHlwZSBzYWZldHkKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkZGVyID0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgYnl0ZSAicHJldmlvdXNfYmlkZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9lbnRyeXBvaW50QDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fZW50cnlwb2ludEAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEyCiAgICBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiCiAgICBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIgogICAgbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICBtZXRob2QgImJpZChwYXkpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2ludG9fYXNzZXRfcm91dGVANCBtYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANSBtYWluX29wdF9pbl9yb3V0ZUA2IG1haW5fYmlkX3JvdXRlQDcgbWFpbl9jbGFpbV9iaWRzX3JvdXRlQDggbWFpbl9jbGFpbV9hc3NldF9yb3V0ZUA5CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTUKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fb3B0X2luX3JvdXRlQDY6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JpZF9yb3V0ZUA3OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBiaWQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYmlkc19yb3V0ZUA4OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltX2JpZHMKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYXNzZXRfcm91dGVAOToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xhaW1fYXNzZXQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmFzc2V0X2lkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludCAwCiAgICBieXRlICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzYSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBBU0EgYWxyZWFkeSBvcHRlZCBpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozMS0zMgogICAgLy8gIyBTYXZlIEFTQSBJRCBpbiBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhID0gYXNzZXQKICAgIGJ5dGUgImFzYSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzQtMzkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM1CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM5CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogYnl0ZXMsIGxlbmd0aDogYnl0ZXMsIGF4ZmVyOiB1aW50NjQpIC0+IHZvaWQ6CnN0YXJ0X2F1Y3Rpb246CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQxLTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzdGFydF9hdWN0aW9uKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc3RhcnRpbmdfcHJpY2U6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYXhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBhdWN0aW9uIG11c3QgYmUgc3RhcnRlZCBieSBjcmVhdG9yCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUwLTUxCiAgICAvLyAjIEVuc3VyZSB0aGUgYXVjdGlvbiBoYXNuJ3QgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKICAgIC8vIGFzc2VydCBzZWxmLmF1Y3Rpb25fZW5kID09IDAsICJhdWN0aW9uIGFscmVhZHkgc3RhcnRlZCIKICAgIGludCAwCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTUKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUzLTU2CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU4LTU5CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZSAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGguZGVjb2RlKCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgKwogICAgYnl0ZSAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLm9wdF9pbigpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYmlkKHBheTogdWludDY0KSAtPiB2b2lkOgpiaWQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjY3LTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBiaWQoc2VsZiwgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2OS03MAogICAgLy8gIyBFbnN1cmUgYXVjdGlvbiBoYXNuJ3QgZW5kZWQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuYXVjdGlvbl9lbmQsICJhdWN0aW9uIGhhcyBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludCAwCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzQKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkIGV4aXN0cwogICAgZGlnIDEKICAgIDwKICAgIGFzc2VydCAvLyBCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzYtNzcKICAgIC8vICMgc2V0IGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBwYXkuYW1vdW50CiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzgKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkZGVyID0gcGF5LnNlbmRlcgogICAgYnl0ZSAicHJldmlvdXNfYmlkZGVyIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MC04MQogICAgLy8gIyBVcGRhdGUgY2xhaW1hYmxlIGFtb3VudAogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gcGF5LmFtb3VudAogICAgdHhuIFNlbmRlcgogICAgYnl0ZSAiY2xhaW1hYmxlX2Ftb3VudCIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2JpZHMoKSAtPiB2b2lkOgpjbGFpbV9iaWRzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYmlkcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBhbW91bnQgPSBvcmlnaW5hbF9hbW91bnQgPSBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0KICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJjbGFpbWFibGVfYW1vdW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBjbGFpbWFibGVfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Ny04OAogICAgLy8gIyBzdWJ0cmFjdCBwcmV2aW91cyBiaWQgaWYgc2VuZGVyIGlzIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLnByZXZpb3VzX2JpZGRlcjoKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHByZXZpb3VzX2JpZGRlciBleGlzdHMKICAgID09CiAgICBieiBjbGFpbV9iaWRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4OQogICAgLy8gYW1vdW50IC09IHNlbGYucHJldmlvdXNfYmlkCiAgICBpbnQgMAogICAgYnl0ZSAicHJldmlvdXNfYmlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBwcmV2aW91c19iaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpjbGFpbV9iaWRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTEtOTUKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MQogICAgLy8gaXR4bi5QYXltZW50KAogICAgaW50IHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gZmVlPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkxLTk1CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXSA9IG9yaWdpbmFsX2Ftb3VudCAtIGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIHR4biBTZW5kZXIKICAgIGJ5dGUgImNsYWltYWJsZV9hbW91bnQiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbGFpbV9hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAxCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgbm90IGVuZGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50IDAKICAgIGJ5dGUgImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAyLTEwOQogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIGludCAwCiAgICBieXRlICJhc2FfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc2FfYW1vdW50IGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDYKICAgIC8vIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDItMTAzCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gZmVlPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAyLTEwOQogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gc2VsZi5hdWN0aW9uX2VuZCA9IFVJbnQ2NCgwKQogICAgYnl0ZSAiYXVjdGlvbl9lbmQiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkID0gVUludDY0KDApCiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTkKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZSAiYXNhX2Ftb3VudCIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyMAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgwKQogICAgYnl0ZSAiYXNhIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIxLTIyCiAgICAvLyAjIFVzZSB6ZXJvIGFkZHJlc3MgcmF0aGVyIHRoYW4gYW4gZW1wdHkgc3RyaW5nIGZvciBBY2NvdW50IHR5cGUgc2FmZXR5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTIwCiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/auction/out/Auction.destructured.ir b/examples/auction/out/Auction.destructured.ir index a01b3aa12e..43e28c628b 100644 --- a/examples/auction/out/Auction.destructured.ir +++ b/examples/auction/out/Auction.destructured.ir @@ -95,7 +95,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -115,7 +115,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check auction_end exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) @@ -140,7 +140,7 @@ contract examples.auction.contract.Auction: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) @@ -149,7 +149,7 @@ contract examples.auction.contract.Auction: (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid (app_global_put "previous_bid" tmp%7#0) @@ -162,16 +162,16 @@ contract examples.auction.contract.Auction: block@0: // L83 let tmp%0#0: bytes = (txn Sender) let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") - (assert app_local_get_ex_did_exist%2#0) // check value exists + (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) let amount#1: uint64 = original_amount#0 goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let amount#1: uint64 = (- original_amount#0 app_global_get_ex_value%8#0) goto block@2 block@2: // after_if_else_L87 @@ -191,16 +191,16 @@ contract examples.auction.contract.Auction: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists ((itxn_field XferAsset) asset#0) ((itxn_field TypeEnum) axfer) ((itxn_field Fee) 0u) diff --git a/examples/auction/out/Auction.ssa.ir b/examples/auction/out/Auction.ssa.ir index 702a6f47f0..0a9b138798 100644 --- a/examples/auction/out/Auction.ssa.ir +++ b/examples/auction/out/Auction.ssa.ir @@ -105,7 +105,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -243,7 +243,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check auction_end exists let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) @@ -268,7 +268,7 @@ contract examples.auction.contract.Auction: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) @@ -277,7 +277,7 @@ contract examples.auction.contract.Auction: (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid let new_state_value%11#0: uint64 = ((gtxns Amount) pay#0) @@ -293,18 +293,18 @@ contract examples.auction.contract.Auction: block@0: // L83 let tmp%0#0: bytes = (txn Sender) let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") - (assert app_local_get_ex_did_exist%2#0) // check value exists + (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let awst_tmp%3#0: uint64 = app_local_get_ex_value%1#0 let original_amount#0: uint64 = awst_tmp%3#0 let amount#0: uint64 = awst_tmp%3#0 let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let amount#1: uint64 = (- amount#0 app_global_get_ex_value%8#0) goto block@2 block@2: // after_if_else_L87 @@ -443,7 +443,7 @@ contract examples.auction.contract.Auction: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin @@ -455,16 +455,16 @@ contract examples.auction.contract.Auction: let inner_txn_params%5%%ApprovalProgramPages_length#0: uint64 = 0u let inner_txn_params%5%%Applications_length#0: uint64 = 0u let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists let inner_txn_params%5%%param_AssetAmount_idx_0#0: uint64 = app_global_get_ex_value%6#0 let inner_txn_params%5%%AssetAmount_length#0: uint64 = 1u let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists let inner_txn_params%5%%param_AssetCloseTo_idx_0#0: bytes = app_global_get_ex_value%8#0 let inner_txn_params%5%%AssetCloseTo_length#0: uint64 = 1u let inner_txn_params%5%%ConfigAssetName_length#0: uint64 = 0u let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists let inner_txn_params%5%%param_AssetReceiver_idx_0#0: bytes = app_global_get_ex_value%10#0 let inner_txn_params%5%%AssetReceiver_length#0: uint64 = 1u let inner_txn_params%5%%AssetSender_length#0: uint64 = 0u diff --git a/examples/auction/out/Auction.ssa.opt_pass_1.ir b/examples/auction/out/Auction.ssa.opt_pass_1.ir index 15cbf94e9d..0e759becc8 100644 --- a/examples/auction/out/Auction.ssa.opt_pass_1.ir +++ b/examples/auction/out/Auction.ssa.opt_pass_1.ir @@ -95,7 +95,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -115,7 +115,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check auction_end exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) @@ -140,7 +140,7 @@ contract examples.auction.contract.Auction: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) @@ -149,7 +149,7 @@ contract examples.auction.contract.Auction: (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid (app_global_put "previous_bid" tmp%7#0) @@ -162,15 +162,15 @@ contract examples.auction.contract.Auction: block@0: // L83 let tmp%0#0: bytes = (txn Sender) let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") - (assert app_local_get_ex_did_exist%2#0) // check value exists + (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let amount#1: uint64 = (- original_amount#0 app_global_get_ex_value%8#0) goto block@2 block@2: // after_if_else_L87 @@ -191,16 +191,16 @@ contract examples.auction.contract.Auction: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists ((itxn_field XferAsset) asset#0) ((itxn_field TypeEnum) axfer) ((itxn_field Fee) 0u) diff --git a/examples/auction/out_O2/Auction.approval.teal b/examples/auction/out_O2/Auction.approval.teal index 86a7a5a45d..da8cfba6f7 100644 --- a/examples/auction/out_O2/Auction.approval.teal +++ b/examples/auction/out_O2/Auction.approval.teal @@ -123,7 +123,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in byte "asa" @@ -152,7 +152,7 @@ start_auction: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists ! assert // auction already started frame_dig -1 @@ -193,7 +193,7 @@ bid: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists < assert // auction has ended frame_dig -1 @@ -207,7 +207,7 @@ bid: int 0 byte "previous_bid" app_global_get_ex - assert // check value exists + assert // check previous_bid exists dig 1 < assert // Bid must be higher than previous bid @@ -234,18 +234,18 @@ claim_bids: swap dup uncover 2 - assert // check value exists + assert // check claimable_amount exists for account txn Sender int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists == bz claim_bids_after_if_else@2 int 0 byte "previous_bid" app_global_get_ex - assert // check value exists + assert // check previous_bid exists frame_dig 0 swap - @@ -280,22 +280,22 @@ claim_asset: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists > assert // auction has not ended itxn_begin int 0 byte "asa_amount" app_global_get_ex - assert // check value exists + assert // check asa_amount exists int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists frame_dig -1 itxn_field XferAsset int axfer diff --git a/examples/auction/out_O2/Auction.destructured.ir b/examples/auction/out_O2/Auction.destructured.ir index a01b3aa12e..43e28c628b 100644 --- a/examples/auction/out_O2/Auction.destructured.ir +++ b/examples/auction/out_O2/Auction.destructured.ir @@ -95,7 +95,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -115,7 +115,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check auction_end exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) @@ -140,7 +140,7 @@ contract examples.auction.contract.Auction: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) @@ -149,7 +149,7 @@ contract examples.auction.contract.Auction: (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid (app_global_put "previous_bid" tmp%7#0) @@ -162,16 +162,16 @@ contract examples.auction.contract.Auction: block@0: // L83 let tmp%0#0: bytes = (txn Sender) let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") - (assert app_local_get_ex_did_exist%2#0) // check value exists + (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) let amount#1: uint64 = original_amount#0 goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let amount#1: uint64 = (- original_amount#0 app_global_get_ex_value%8#0) goto block@2 block@2: // after_if_else_L87 @@ -191,16 +191,16 @@ contract examples.auction.contract.Auction: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists ((itxn_field XferAsset) asset#0) ((itxn_field TypeEnum) axfer) ((itxn_field Fee) 0u) diff --git a/examples/auction/out_unoptimized/Auction.approval.teal b/examples/auction/out_unoptimized/Auction.approval.teal index 118d4e732b..32376c419d 100644 --- a/examples/auction/out_unoptimized/Auction.approval.teal +++ b/examples/auction/out_unoptimized/Auction.approval.teal @@ -193,7 +193,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists int 0 == assert // ASA already opted in @@ -262,7 +262,7 @@ start_auction: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists int 0 == assert // auction already started @@ -327,7 +327,7 @@ bid: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists < assert // auction has ended // auction/contract.py:72-73 @@ -345,7 +345,7 @@ bid: int 0 byte "previous_bid" app_global_get_ex - assert // check value exists + assert // check previous_bid exists > assert // Bid must be higher than previous bid // auction/contract.py:76-77 @@ -387,7 +387,7 @@ claim_bids: int 0 byte "claimable_amount" app_local_get_ex - assert // check value exists + assert // check claimable_amount exists for account dup swap dup @@ -399,7 +399,7 @@ claim_bids: int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists == bz claim_bids_after_if_else@2 // auction/contract.py:89 @@ -407,7 +407,7 @@ claim_bids: int 0 byte "previous_bid" app_global_get_ex - assert // check value exists + assert // check previous_bid exists frame_dig 1 swap - @@ -468,7 +468,7 @@ claim_asset: int 0 byte "auction_end" app_global_get_ex - assert // check value exists + assert // check auction_end exists > assert // auction has not ended // auction/contract.py:102-109 @@ -486,19 +486,19 @@ claim_asset: int 0 byte "asa_amount" app_global_get_ex - assert // check value exists + assert // check asa_amount exists // auction/contract.py:106 // asset_close_to=self.previous_bidder, int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists // auction/contract.py:107 // asset_receiver=self.previous_bidder, int 0 byte "previous_bidder" app_global_get_ex - assert // check value exists + assert // check previous_bidder exists // auction/contract.py:104 // fee=0, int 0 diff --git a/examples/auction/out_unoptimized/Auction.destructured.ir b/examples/auction/out_unoptimized/Auction.destructured.ir index f46f28f44e..2fd05b6cc8 100644 --- a/examples/auction/out_unoptimized/Auction.destructured.ir +++ b/examples/auction/out_unoptimized/Auction.destructured.ir @@ -107,7 +107,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -132,7 +132,7 @@ contract examples.auction.contract.Auction: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check auction_end exists let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) @@ -157,7 +157,7 @@ contract examples.auction.contract.Auction: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) @@ -166,7 +166,7 @@ contract examples.auction.contract.Auction: (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid let new_state_value%11#0: uint64 = ((gtxns Amount) pay#0) @@ -182,19 +182,19 @@ contract examples.auction.contract.Auction: block@0: // L83 let tmp%0#0: bytes = (txn Sender) let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") - (assert app_local_get_ex_did_exist%2#0) // check value exists + (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let awst_tmp%3#0: uint64 = app_local_get_ex_value%1#0 let original_amount#0: uint64 = awst_tmp%3#0 let amount#0: uint64 = awst_tmp%3#0 let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) let amount#5: uint64 = amount#0 goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists let amount#0: uint64 = (- amount#0 app_global_get_ex_value%8#0) let amount#5: uint64 = amount#0 goto block@2 @@ -221,18 +221,18 @@ contract examples.auction.contract.Auction: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check auction_end exists let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists let inner_txn_params%5%%param_AssetAmount_idx_0#0: uint64 = app_global_get_ex_value%6#0 let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists let inner_txn_params%5%%param_AssetCloseTo_idx_0#0: bytes = app_global_get_ex_value%8#0 let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check value exists + (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists let inner_txn_params%5%%param_AssetReceiver_idx_0#0: bytes = app_global_get_ex_value%10#0 let inner_txn_params%5%%param_Fee_idx_0#0: uint64 = 0u let inner_txn_params%5%%param_TypeEnum_idx_0#0: uint64 = axfer diff --git a/examples/global_state/out/AppStateContract.approval.mir b/examples/global_state/out/AppStateContract.approval.mir index 541164354d..45e6dfdce2 100644 --- a/examples/global_state/out/AppStateContract.approval.mir +++ b/examples/global_state/out/AppStateContract.approval.mir @@ -1,202 +1,202 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.global_state.contract.AppStateContract.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} - // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 - bnz main_entrypoint@2 // - // Implicit fall through to main_on_create@1 // + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + bnz main_entrypoint@2 // + // Implicit fall through to main_on_create@1 // main_on_create@1: - callsub __init__ // - // Implicit fall through to main_entrypoint@2 // + callsub __init__ // + // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - int 0 // 0 self.global_int_simplified global_state/contract.py:15 - byte "global_int_simplified" // 0,"global_int_simplified" self.global_int_simplified global_state/contract.py:15 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_simplified global_state/contract.py:15 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.global_int_simplified global_state/contract.py:15 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 - assert // check value exists // app_global_get_ex_value%1#0 self.global_int_simplified global_state/contract.py:15 - // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) app_global_get_ex_value%1#0 self.global_int_simplified == 33 global_state/contract.py:15 - int 33 // app_global_get_ex_value%1#0,33 33 global_state/contract.py:15 - == // {==} self.global_int_simplified == 33 global_state/contract.py:15 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 self.global_int_simplified == 33 global_state/contract.py:15 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 assert self.global_int_simplified == 33 global_state/contract.py:15 - assert // assert self.global_int_simplified == 33 global_state/contract.py:15 - int 0 // 0 self.global_int_full global_state/contract.py:16 - byte "global_int_full" // 0,"global_int_full" self.global_int_full global_state/contract.py:16 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:16 - swap // store global_int_full_exists%5#0 to l-stack (no copy) global_int_full_exists%5#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:16 - pop // global_int_full_exists%5#0 self.global_int_full global_state/contract.py:16 - // virtual: load global_int_full_exists%5#0 from l-stack (no copy) global_int_full_exists%5#0 assert self.global_int_full global_state/contract.py:16 - assert // assert self.global_int_full global_state/contract.py:16 - int 0 // 0 self.global_int_full global_state/contract.py:17 - byte "global_int_full" // 0,"global_int_full" self.global_int_full global_state/contract.py:17 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:17 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:17 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 - assert // check value exists // app_global_get_ex_value%6#0 self.global_int_full global_state/contract.py:17 - // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) app_global_get_ex_value%6#0 self.global_int_full.value == 55 global_state/contract.py:17 - int 55 // app_global_get_ex_value%6#0,55 55 global_state/contract.py:17 - == // {==} self.global_int_full.value == 55 global_state/contract.py:17 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 self.global_int_full.value == 55 global_state/contract.py:17 - // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 assert self.global_int_full.value == 55 global_state/contract.py:17 - assert // assert self.global_int_full.value == 55 global_state/contract.py:17 - int 0 // 0 not self.global_int_no_default global_state/contract.py:18 - byte "global_int_no_default" // 0,"global_int_no_default" not self.global_int_no_default global_state/contract.py:18 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_int_no_default global_state/contract.py:18 - swap // store global_int_no_default_exists%10#0 to l-stack (no copy) global_int_no_default_exists%10#0,{app_global_get_ex}.0 not self.global_int_no_default global_state/contract.py:18 - pop // global_int_no_default_exists%10#0 not self.global_int_no_default global_state/contract.py:18 - // virtual: load global_int_no_default_exists%10#0 from l-stack (no copy) global_int_no_default_exists%10#0 not self.global_int_no_default global_state/contract.py:18 - ! // {!} not self.global_int_no_default global_state/contract.py:18 - // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 not self.global_int_no_default global_state/contract.py:18 - // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 assert not self.global_int_no_default global_state/contract.py:18 - assert // assert not self.global_int_no_default global_state/contract.py:18 - byte "global_int_no_default" // "global_int_no_default" self.global_int_no_default global_state/contract.py:19 - int 44 // "global_int_no_default",44 44 global_state/contract.py:19 - app_global_put // self.global_int_no_default.value = UInt64(44) global_state/contract.py:19 - int 0 // 0 self.global_int_no_default.maybe() global_state/contract.py:20 - byte "global_int_no_default" // 0,"global_int_no_default" self.global_int_no_default global_state/contract.py:20 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_no_default.maybe() global_state/contract.py:20 - // virtual: store i_exists#0 to l-stack (no copy) i_exists#0,{app_global_get_ex}.0 self.global_int_no_default.maybe() global_state/contract.py:20 - // virtual: store i_value#0 to l-stack (no copy) i_value#0,i_exists#0 self.global_int_no_default.maybe() global_state/contract.py:20 - // virtual: load i_exists#0 from l-stack (no copy) i_value#0,i_exists#0 assert i_exists global_state/contract.py:21 - assert // i_value#0 assert i_exists global_state/contract.py:21 - // virtual: load i_value#0 from l-stack (no copy) i_value#0 i_value == 44 global_state/contract.py:22 - int 44 // i_value#0,44 44 global_state/contract.py:22 - == // {==} i_value == 44 global_state/contract.py:22 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 i_value == 44 global_state/contract.py:22 - // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 assert i_value == 44 global_state/contract.py:22 - assert // assert i_value == 44 global_state/contract.py:22 - int 0 // 0 self.global_bytes_simplified global_state/contract.py:24 - byte "global_bytes_simplified" // 0,"global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:24 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_simplified global_state/contract.py:24 - // virtual: store app_global_get_ex_did_exist%16#0 to l-stack (no copy) app_global_get_ex_did_exist%16#0,{app_global_get_ex}.0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: store app_global_get_ex_value%15#0 to l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: load app_global_get_ex_did_exist%16#0 from l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 - assert // check value exists // app_global_get_ex_value%15#0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: load app_global_get_ex_value%15#0 from l-stack (no copy) app_global_get_ex_value%15#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - byte "Hello" // app_global_get_ex_value%15#0,"Hello" b"Hello" global_state/contract.py:24 - == // {==} self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - assert // assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - int 0 // 0 self.global_bytes_full global_state/contract.py:25 - byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:25 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:25 - swap // store global_bytes_full_exists%19#0 to l-stack (no copy) global_bytes_full_exists%19#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:25 - pop // global_bytes_full_exists%19#0 self.global_bytes_full global_state/contract.py:25 - // virtual: load global_bytes_full_exists%19#0 from l-stack (no copy) global_bytes_full_exists%19#0 assert self.global_bytes_full global_state/contract.py:25 - assert // assert self.global_bytes_full global_state/contract.py:25 - int 0 // 0 self.global_bytes_full global_state/contract.py:26 - byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:26 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:26 - // virtual: store app_global_get_ex_did_exist%21#0 to l-stack (no copy) app_global_get_ex_did_exist%21#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:26 - // virtual: store app_global_get_ex_value%20#0 to l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 - // virtual: load app_global_get_ex_did_exist%21#0 from l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 - assert // check value exists // app_global_get_ex_value%20#0 self.global_bytes_full global_state/contract.py:26 - // virtual: load app_global_get_ex_value%20#0 from l-stack (no copy) app_global_get_ex_value%20#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - byte "Hello" // app_global_get_ex_value%20#0,"Hello" b"Hello" global_state/contract.py:26 - == // {==} self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - assert // assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - int 0 // 0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:27 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - swap // store global_bytes_full_get_ex%24#0 to l-stack (no copy) global_bytes_full_get_ex%24#0,{app_global_get_ex}.0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - // virtual: store global_bytes_full_get_ex%23#0 to l-stack (no copy) global_bytes_full_get_ex%24#0,global_bytes_full_get_ex%23#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - byte "default" // global_bytes_full_get_ex%24#0,global_bytes_full_get_ex%23#0,"default" b"default" global_state/contract.py:27 - swap // load global_bytes_full_get_ex%23#0 from l-stack (no copy) global_bytes_full_get_ex%24#0,"default",global_bytes_full_get_ex%23#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - uncover 2 // load global_bytes_full_get_ex%24#0 from l-stack (no copy) "default",global_bytes_full_get_ex%23#0,global_bytes_full_get_ex%24#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - select // {select} self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 - // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - byte "Hello" // tmp%25#0,"Hello" b"Hello" global_state/contract.py:27 - == // {==} self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - assert // assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 - int 0 // 0 not self.global_bytes_no_default global_state/contract.py:28 - byte "global_bytes_no_default" // 0,"global_bytes_no_default" not self.global_bytes_no_default global_state/contract.py:28 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_bytes_no_default global_state/contract.py:28 - swap // store global_bytes_no_default_exists%28#0 to l-stack (no copy) global_bytes_no_default_exists%28#0,{app_global_get_ex}.0 not self.global_bytes_no_default global_state/contract.py:28 - pop // global_bytes_no_default_exists%28#0 not self.global_bytes_no_default global_state/contract.py:28 - // virtual: load global_bytes_no_default_exists%28#0 from l-stack (no copy) global_bytes_no_default_exists%28#0 not self.global_bytes_no_default global_state/contract.py:28 - ! // {!} not self.global_bytes_no_default global_state/contract.py:28 - // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 not self.global_bytes_no_default global_state/contract.py:28 - // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 assert not self.global_bytes_no_default global_state/contract.py:28 - assert // assert not self.global_bytes_no_default global_state/contract.py:28 - byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:29 - byte "World" // "global_bytes_no_default","World" b"World" global_state/contract.py:29 - app_global_put // self.global_bytes_no_default.value = Bytes(b"World") global_state/contract.py:29 - int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:30 - byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:30 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:30 - // virtual: store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:30 - // virtual: store b_value#0 to l-stack (no copy) b_value#0,b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:30 - // virtual: load b_exists#0 from l-stack (no copy) b_value#0,b_exists#0 assert b_exists global_state/contract.py:31 - assert // b_value#0 assert b_exists global_state/contract.py:31 - // virtual: load b_value#0 from l-stack (no copy) b_value#0 b_value == b"World" global_state/contract.py:32 - byte "World" // b_value#0,"World" b"World" global_state/contract.py:32 - == // {==} b_value == b"World" global_state/contract.py:32 - // virtual: store tmp%32#0 to l-stack (no copy) tmp%32#0 b_value == b"World" global_state/contract.py:32 - // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 assert b_value == b"World" global_state/contract.py:32 - assert // assert b_value == b"World" global_state/contract.py:32 - byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:33 - app_global_del // del self.global_bytes_no_default.value global_state/contract.py:33 - int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:34 - byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:34 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:34 - swap // store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:34 - pop // b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:34 - // virtual: load b_exists#0 from l-stack (no copy) b_exists#0 not b_exists global_state/contract.py:35 - ! // {!} not b_exists global_state/contract.py:35 - // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 not b_exists global_state/contract.py:35 - // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 assert not b_exists global_state/contract.py:35 - assert // assert not b_exists global_state/contract.py:35 - int 0 // 0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:37 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - swap // store global_bytes_no_default_get_ex%37#0 to l-stack (no copy) global_bytes_no_default_get_ex%37#0,{app_global_get_ex}.0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - // virtual: store global_bytes_no_default_get_ex%36#0 to l-stack (no copy) global_bytes_no_default_get_ex%37#0,global_bytes_no_default_get_ex%36#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - byte "default" // global_bytes_no_default_get_ex%37#0,global_bytes_no_default_get_ex%36#0,"default" b"default" global_state/contract.py:37 - swap // load global_bytes_no_default_get_ex%36#0 from l-stack (no copy) global_bytes_no_default_get_ex%37#0,"default",global_bytes_no_default_get_ex%36#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - uncover 2 // load global_bytes_no_default_get_ex%37#0 from l-stack (no copy) "default",global_bytes_no_default_get_ex%36#0,global_bytes_no_default_get_ex%37#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - select // {select} self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - // virtual: store tmp%38#0 to l-stack (no copy) tmp%38#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 - // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - byte "default" // tmp%38#0,"default" b"default" global_state/contract.py:37 - == // {==} self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - assert // assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 - int 1 // 1 True global_state/contract.py:38 - return // return True global_state/contract.py:38 + int 0 // 0 self.global_int_simplified global_state/contract.py:15 + byte "global_int_simplified" // 0,"global_int_simplified" self.global_int_simplified global_state/contract.py:15 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_simplified global_state/contract.py:15 + // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.global_int_simplified global_state/contract.py:15 + // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 + // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 + assert // check global_int_simplified exists // app_global_get_ex_value%1#0 self.global_int_simplified global_state/contract.py:15 + // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) app_global_get_ex_value%1#0 self.global_int_simplified == 33 global_state/contract.py:15 + int 33 // app_global_get_ex_value%1#0,33 33 global_state/contract.py:15 + == // {==} self.global_int_simplified == 33 global_state/contract.py:15 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 self.global_int_simplified == 33 global_state/contract.py:15 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 assert self.global_int_simplified == 33 global_state/contract.py:15 + assert // assert self.global_int_simplified == 33 global_state/contract.py:15 + int 0 // 0 self.global_int_full global_state/contract.py:16 + byte "global_int_full" // 0,"global_int_full" self.global_int_full global_state/contract.py:16 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:16 + swap // store global_int_full_exists%5#0 to l-stack (no copy) global_int_full_exists%5#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:16 + pop // global_int_full_exists%5#0 self.global_int_full global_state/contract.py:16 + // virtual: load global_int_full_exists%5#0 from l-stack (no copy) global_int_full_exists%5#0 assert self.global_int_full global_state/contract.py:16 + assert // assert self.global_int_full global_state/contract.py:16 + int 0 // 0 self.global_int_full global_state/contract.py:17 + byte "global_int_full" // 0,"global_int_full" self.global_int_full global_state/contract.py:17 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:17 + // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:17 + // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 + // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 + assert // check global_int_full exists // app_global_get_ex_value%6#0 self.global_int_full global_state/contract.py:17 + // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) app_global_get_ex_value%6#0 self.global_int_full.value == 55 global_state/contract.py:17 + int 55 // app_global_get_ex_value%6#0,55 55 global_state/contract.py:17 + == // {==} self.global_int_full.value == 55 global_state/contract.py:17 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 self.global_int_full.value == 55 global_state/contract.py:17 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 assert self.global_int_full.value == 55 global_state/contract.py:17 + assert // assert self.global_int_full.value == 55 global_state/contract.py:17 + int 0 // 0 not self.global_int_no_default global_state/contract.py:18 + byte "global_int_no_default" // 0,"global_int_no_default" not self.global_int_no_default global_state/contract.py:18 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_int_no_default global_state/contract.py:18 + swap // store global_int_no_default_exists%10#0 to l-stack (no copy) global_int_no_default_exists%10#0,{app_global_get_ex}.0 not self.global_int_no_default global_state/contract.py:18 + pop // global_int_no_default_exists%10#0 not self.global_int_no_default global_state/contract.py:18 + // virtual: load global_int_no_default_exists%10#0 from l-stack (no copy) global_int_no_default_exists%10#0 not self.global_int_no_default global_state/contract.py:18 + ! // {!} not self.global_int_no_default global_state/contract.py:18 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 not self.global_int_no_default global_state/contract.py:18 + // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 assert not self.global_int_no_default global_state/contract.py:18 + assert // assert not self.global_int_no_default global_state/contract.py:18 + byte "global_int_no_default" // "global_int_no_default" self.global_int_no_default global_state/contract.py:19 + int 44 // "global_int_no_default",44 44 global_state/contract.py:19 + app_global_put // self.global_int_no_default.value = UInt64(44) global_state/contract.py:19 + int 0 // 0 self.global_int_no_default.maybe() global_state/contract.py:20 + byte "global_int_no_default" // 0,"global_int_no_default" self.global_int_no_default global_state/contract.py:20 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_no_default.maybe() global_state/contract.py:20 + // virtual: store i_exists#0 to l-stack (no copy) i_exists#0,{app_global_get_ex}.0 self.global_int_no_default.maybe() global_state/contract.py:20 + // virtual: store i_value#0 to l-stack (no copy) i_value#0,i_exists#0 self.global_int_no_default.maybe() global_state/contract.py:20 + // virtual: load i_exists#0 from l-stack (no copy) i_value#0,i_exists#0 assert i_exists global_state/contract.py:21 + assert // i_value#0 assert i_exists global_state/contract.py:21 + // virtual: load i_value#0 from l-stack (no copy) i_value#0 i_value == 44 global_state/contract.py:22 + int 44 // i_value#0,44 44 global_state/contract.py:22 + == // {==} i_value == 44 global_state/contract.py:22 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 i_value == 44 global_state/contract.py:22 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 assert i_value == 44 global_state/contract.py:22 + assert // assert i_value == 44 global_state/contract.py:22 + int 0 // 0 self.global_bytes_simplified global_state/contract.py:24 + byte "global_bytes_simplified" // 0,"global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:24 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_simplified global_state/contract.py:24 + // virtual: store app_global_get_ex_did_exist%16#0 to l-stack (no copy) app_global_get_ex_did_exist%16#0,{app_global_get_ex}.0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: store app_global_get_ex_value%15#0 to l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: load app_global_get_ex_did_exist%16#0 from l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 + assert // check global_bytes_simplified exists // app_global_get_ex_value%15#0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: load app_global_get_ex_value%15#0 from l-stack (no copy) app_global_get_ex_value%15#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + byte "Hello" // app_global_get_ex_value%15#0,"Hello" b"Hello" global_state/contract.py:24 + == // {==} self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + assert // assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + int 0 // 0 self.global_bytes_full global_state/contract.py:25 + byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:25 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:25 + swap // store global_bytes_full_exists%19#0 to l-stack (no copy) global_bytes_full_exists%19#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:25 + pop // global_bytes_full_exists%19#0 self.global_bytes_full global_state/contract.py:25 + // virtual: load global_bytes_full_exists%19#0 from l-stack (no copy) global_bytes_full_exists%19#0 assert self.global_bytes_full global_state/contract.py:25 + assert // assert self.global_bytes_full global_state/contract.py:25 + int 0 // 0 self.global_bytes_full global_state/contract.py:26 + byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:26 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:26 + // virtual: store app_global_get_ex_did_exist%21#0 to l-stack (no copy) app_global_get_ex_did_exist%21#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:26 + // virtual: store app_global_get_ex_value%20#0 to l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 + // virtual: load app_global_get_ex_did_exist%21#0 from l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 + assert // check global_bytes_full exists // app_global_get_ex_value%20#0 self.global_bytes_full global_state/contract.py:26 + // virtual: load app_global_get_ex_value%20#0 from l-stack (no copy) app_global_get_ex_value%20#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + byte "Hello" // app_global_get_ex_value%20#0,"Hello" b"Hello" global_state/contract.py:26 + == // {==} self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + assert // assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + int 0 // 0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:27 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + swap // store global_bytes_full_get_ex%24#0 to l-stack (no copy) global_bytes_full_get_ex%24#0,{app_global_get_ex}.0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + // virtual: store global_bytes_full_get_ex%23#0 to l-stack (no copy) global_bytes_full_get_ex%24#0,global_bytes_full_get_ex%23#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + byte "default" // global_bytes_full_get_ex%24#0,global_bytes_full_get_ex%23#0,"default" b"default" global_state/contract.py:27 + swap // load global_bytes_full_get_ex%23#0 from l-stack (no copy) global_bytes_full_get_ex%24#0,"default",global_bytes_full_get_ex%23#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + uncover 2 // load global_bytes_full_get_ex%24#0 from l-stack (no copy) "default",global_bytes_full_get_ex%23#0,global_bytes_full_get_ex%24#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + select // {select} self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + byte "Hello" // tmp%25#0,"Hello" b"Hello" global_state/contract.py:27 + == // {==} self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + assert // assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" global_state/contract.py:27 + int 0 // 0 not self.global_bytes_no_default global_state/contract.py:28 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" not self.global_bytes_no_default global_state/contract.py:28 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 not self.global_bytes_no_default global_state/contract.py:28 + swap // store global_bytes_no_default_exists%28#0 to l-stack (no copy) global_bytes_no_default_exists%28#0,{app_global_get_ex}.0 not self.global_bytes_no_default global_state/contract.py:28 + pop // global_bytes_no_default_exists%28#0 not self.global_bytes_no_default global_state/contract.py:28 + // virtual: load global_bytes_no_default_exists%28#0 from l-stack (no copy) global_bytes_no_default_exists%28#0 not self.global_bytes_no_default global_state/contract.py:28 + ! // {!} not self.global_bytes_no_default global_state/contract.py:28 + // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 not self.global_bytes_no_default global_state/contract.py:28 + // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 assert not self.global_bytes_no_default global_state/contract.py:28 + assert // assert not self.global_bytes_no_default global_state/contract.py:28 + byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:29 + byte "World" // "global_bytes_no_default","World" b"World" global_state/contract.py:29 + app_global_put // self.global_bytes_no_default.value = Bytes(b"World") global_state/contract.py:29 + int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:30 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:30 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:30 + // virtual: store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:30 + // virtual: store b_value#0 to l-stack (no copy) b_value#0,b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:30 + // virtual: load b_exists#0 from l-stack (no copy) b_value#0,b_exists#0 assert b_exists global_state/contract.py:31 + assert // b_value#0 assert b_exists global_state/contract.py:31 + // virtual: load b_value#0 from l-stack (no copy) b_value#0 b_value == b"World" global_state/contract.py:32 + byte "World" // b_value#0,"World" b"World" global_state/contract.py:32 + == // {==} b_value == b"World" global_state/contract.py:32 + // virtual: store tmp%32#0 to l-stack (no copy) tmp%32#0 b_value == b"World" global_state/contract.py:32 + // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 assert b_value == b"World" global_state/contract.py:32 + assert // assert b_value == b"World" global_state/contract.py:32 + byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:33 + app_global_del // del self.global_bytes_no_default.value global_state/contract.py:33 + int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:34 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:34 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:34 + swap // store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:34 + pop // b_exists#0 self.global_bytes_no_default.maybe() global_state/contract.py:34 + // virtual: load b_exists#0 from l-stack (no copy) b_exists#0 not b_exists global_state/contract.py:35 + ! // {!} not b_exists global_state/contract.py:35 + // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 not b_exists global_state/contract.py:35 + // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 assert not b_exists global_state/contract.py:35 + assert // assert not b_exists global_state/contract.py:35 + int 0 // 0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:37 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + swap // store global_bytes_no_default_get_ex%37#0 to l-stack (no copy) global_bytes_no_default_get_ex%37#0,{app_global_get_ex}.0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + // virtual: store global_bytes_no_default_get_ex%36#0 to l-stack (no copy) global_bytes_no_default_get_ex%37#0,global_bytes_no_default_get_ex%36#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + byte "default" // global_bytes_no_default_get_ex%37#0,global_bytes_no_default_get_ex%36#0,"default" b"default" global_state/contract.py:37 + swap // load global_bytes_no_default_get_ex%36#0 from l-stack (no copy) global_bytes_no_default_get_ex%37#0,"default",global_bytes_no_default_get_ex%36#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + uncover 2 // load global_bytes_no_default_get_ex%37#0 from l-stack (no copy) "default",global_bytes_no_default_get_ex%36#0,global_bytes_no_default_get_ex%37#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + select // {select} self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + // virtual: store tmp%38#0 to l-stack (no copy) tmp%38#0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + byte "default" // tmp%38#0,"default" b"default" global_state/contract.py:37 + == // {==} self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + assert // assert self.global_bytes_no_default.get(Bytes(b"default")) == b"default" global_state/contract.py:37 + int 1 // 1 True global_state/contract.py:38 + return // return True global_state/contract.py:38 // examples.global_state.contract.AppStateContract.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: global_state/contract.py:5 + proto 0 0 // def __init__(self) -> None: global_state/contract.py:5 __init___block@0: - byte "global_int_full" // "global_int_full" self.global_int_full global_state/contract.py:6 - int 55 // "global_int_full",55 55 global_state/contract.py:6 - app_global_put // self.global_int_full = GlobalState(UInt64(55)) global_state/contract.py:6 - byte "global_int_simplified" // "global_int_simplified" self.global_int_simplified global_state/contract.py:7 - int 33 // "global_int_simplified",33 33 global_state/contract.py:7 - app_global_put // self.global_int_simplified = UInt64(33) global_state/contract.py:7 - byte "global_bytes_full" // "global_bytes_full" self.global_bytes_full global_state/contract.py:10 - byte "Hello" // "global_bytes_full","Hello" b"Hello" global_state/contract.py:10 - app_global_put // self.global_bytes_full = GlobalState(Bytes(b"Hello")) global_state/contract.py:10 - byte "global_bytes_simplified" // "global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:11 - byte "Hello" // "global_bytes_simplified","Hello" b"Hello" global_state/contract.py:11 - app_global_put // self.global_bytes_simplified = Bytes(b"Hello") global_state/contract.py:11 - retsub // + byte "global_int_full" // "global_int_full" self.global_int_full global_state/contract.py:6 + int 55 // "global_int_full",55 55 global_state/contract.py:6 + app_global_put // self.global_int_full = GlobalState(UInt64(55)) global_state/contract.py:6 + byte "global_int_simplified" // "global_int_simplified" self.global_int_simplified global_state/contract.py:7 + int 33 // "global_int_simplified",33 33 global_state/contract.py:7 + app_global_put // self.global_int_simplified = UInt64(33) global_state/contract.py:7 + byte "global_bytes_full" // "global_bytes_full" self.global_bytes_full global_state/contract.py:10 + byte "Hello" // "global_bytes_full","Hello" b"Hello" global_state/contract.py:10 + app_global_put // self.global_bytes_full = GlobalState(Bytes(b"Hello")) global_state/contract.py:10 + byte "global_bytes_simplified" // "global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:11 + byte "Hello" // "global_bytes_simplified","Hello" b"Hello" global_state/contract.py:11 + app_global_put // self.global_bytes_simplified = Bytes(b"Hello") global_state/contract.py:11 + retsub // diff --git a/examples/global_state/out/AppStateContract.approval.teal b/examples/global_state/out/AppStateContract.approval.teal index 8fcb627b1f..09b9eac49a 100644 --- a/examples/global_state/out/AppStateContract.approval.teal +++ b/examples/global_state/out/AppStateContract.approval.teal @@ -11,7 +11,7 @@ main_entrypoint@2: int 0 byte "global_int_simplified" app_global_get_ex - assert // check value exists + assert // check global_int_simplified exists int 33 == assert @@ -27,7 +27,7 @@ main_entrypoint@2: int 0 byte "global_int_full" app_global_get_ex - assert // check value exists + assert // check global_int_full exists int 55 == assert @@ -62,7 +62,7 @@ main_entrypoint@2: int 0 byte "global_bytes_simplified" app_global_get_ex - assert // check value exists + assert // check global_bytes_simplified exists byte "Hello" == assert @@ -78,7 +78,7 @@ main_entrypoint@2: int 0 byte "global_bytes_full" app_global_get_ex - assert // check value exists + assert // check global_bytes_full exists byte "Hello" == assert diff --git a/examples/global_state/out/AppStateContract.destructured.ir b/examples/global_state/out/AppStateContract.destructured.ir index 63d66eb11a..17a1ce8b86 100644 --- a/examples/global_state/out/AppStateContract.destructured.ir +++ b/examples/global_state/out/AppStateContract.destructured.ir @@ -9,13 +9,13 @@ contract examples.global_state.contract.AppStateContract: goto block@2 block@2: // entrypoint_L5 let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -27,13 +27,13 @@ contract examples.global_state.contract.AppStateContract: let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") diff --git a/examples/global_state/out/AppStateContract.ssa.ir b/examples/global_state/out/AppStateContract.ssa.ir index 95c7e72760..22472e90ff 100644 --- a/examples/global_state/out/AppStateContract.ssa.ir +++ b/examples/global_state/out/AppStateContract.ssa.ir @@ -9,13 +9,13 @@ contract examples.global_state.contract.AppStateContract: goto block@2 block@2: // entrypoint_L5 let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -29,13 +29,13 @@ contract examples.global_state.contract.AppStateContract: let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") diff --git a/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir b/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir index b9688d8274..6f2bc7a081 100644 --- a/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir +++ b/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir @@ -9,13 +9,13 @@ contract examples.global_state.contract.AppStateContract: goto block@2 block@2: // entrypoint_L5 let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -27,13 +27,13 @@ contract examples.global_state.contract.AppStateContract: let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") diff --git a/examples/global_state/out_O2/AppStateContract.approval.teal b/examples/global_state/out_O2/AppStateContract.approval.teal index 859a79d022..cc5276a2d4 100644 --- a/examples/global_state/out_O2/AppStateContract.approval.teal +++ b/examples/global_state/out_O2/AppStateContract.approval.teal @@ -9,7 +9,7 @@ main_entrypoint@2: int 0 byte "global_int_simplified" app_global_get_ex - assert // check value exists + assert // check global_int_simplified exists int 33 == assert @@ -21,7 +21,7 @@ main_entrypoint@2: int 0 byte "global_int_full" app_global_get_ex - assert // check value exists + assert // check global_int_full exists int 55 == assert @@ -44,7 +44,7 @@ main_entrypoint@2: int 0 byte "global_bytes_simplified" app_global_get_ex - assert // check value exists + assert // check global_bytes_simplified exists byte "Hello" == assert @@ -56,7 +56,7 @@ main_entrypoint@2: int 0 byte "global_bytes_full" app_global_get_ex - assert // check value exists + assert // check global_bytes_full exists byte "Hello" == assert diff --git a/examples/global_state/out_O2/AppStateContract.destructured.ir b/examples/global_state/out_O2/AppStateContract.destructured.ir index 63d66eb11a..17a1ce8b86 100644 --- a/examples/global_state/out_O2/AppStateContract.destructured.ir +++ b/examples/global_state/out_O2/AppStateContract.destructured.ir @@ -9,13 +9,13 @@ contract examples.global_state.contract.AppStateContract: goto block@2 block@2: // entrypoint_L5 let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -27,13 +27,13 @@ contract examples.global_state.contract.AppStateContract: let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") diff --git a/examples/global_state/out_unoptimized/AppStateContract.approval.teal b/examples/global_state/out_unoptimized/AppStateContract.approval.teal index 811ccb6330..e35d3bfa73 100644 --- a/examples/global_state/out_unoptimized/AppStateContract.approval.teal +++ b/examples/global_state/out_unoptimized/AppStateContract.approval.teal @@ -11,7 +11,7 @@ main_entrypoint@2: int 0 byte "global_int_simplified" app_global_get_ex - assert // check value exists + assert // check global_int_simplified exists int 33 == assert @@ -28,7 +28,7 @@ main_entrypoint@2: int 0 byte "global_int_full" app_global_get_ex - assert // check value exists + assert // check global_int_full exists int 55 == assert @@ -64,7 +64,7 @@ main_entrypoint@2: int 0 byte "global_bytes_simplified" app_global_get_ex - assert // check value exists + assert // check global_bytes_simplified exists byte "Hello" == assert @@ -81,7 +81,7 @@ main_entrypoint@2: int 0 byte "global_bytes_full" app_global_get_ex - assert // check value exists + assert // check global_bytes_full exists byte "Hello" == assert diff --git a/examples/global_state/out_unoptimized/AppStateContract.destructured.ir b/examples/global_state/out_unoptimized/AppStateContract.destructured.ir index 95b82656d2..b3c0672358 100644 --- a/examples/global_state/out_unoptimized/AppStateContract.destructured.ir +++ b/examples/global_state/out_unoptimized/AppStateContract.destructured.ir @@ -9,13 +9,13 @@ contract examples.global_state.contract.AppStateContract: goto block@2 block@2: // entrypoint_L5 let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") @@ -29,13 +29,13 @@ contract examples.global_state.contract.AppStateContract: let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check value exists + (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") diff --git a/examples/local_state/out/LocalStateContract.approval.mir b/examples/local_state/out/LocalStateContract.approval.mir index 83e86f7eb6..45873de663 100644 --- a/examples/local_state/out/LocalStateContract.approval.mir +++ b/examples/local_state/out/LocalStateContract.approval.mir @@ -1,300 +1,289 @@ -// Op // Op Description Stack (out) Live (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: main: - int 0 // allocate 1 to stack (𝕗) method#0 | + int 0 // allocate 1 to stack (𝕗) method#0 | main_block@0: - txn ApplicationID // (𝕗) method#0 | {txn} - // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) method#0 | app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) method#0 | app_id%0#0 - bnz main_entrypoint@2 // (𝕗) method#0 | - // Implicit fall through to main_on_create@1 // (𝕗) method#0 | + txn ApplicationID // (𝕗) method#0 | {txn} + // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) method#0 | app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) method#0 | app_id%0#0 + bnz main_entrypoint@2 // (𝕗) method#0 | + // Implicit fall through to main_on_create@1 // (𝕗) method#0 | main_on_create@1: - callsub __init__ // (𝕗) method#0 | - // Implicit fall through to main_entrypoint@2 // (𝕗) method#0 | + callsub __init__ // (𝕗) method#0 | + // Implicit fall through to main_entrypoint@2 // (𝕗) method#0 | main_entrypoint@2: - txn ApplicationID // (𝕗) method#0 | {txn} Txn.application_id local_state/local_state_contract.py:18 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) method#0 | tmp%1#0 Txn.application_id local_state/local_state_contract.py:18 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) method#0 | tmp%1#0 if Txn.application_id == 0: local_state/local_state_contract.py:18 - bnz main_after_if_else@4 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 - // Implicit fall through to main_if_body@3 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 + txn ApplicationID // (𝕗) method#0 | {txn} Txn.application_id local_state/local_state_contract.py:18 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) method#0 | tmp%1#0 Txn.application_id local_state/local_state_contract.py:18 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) method#0 | tmp%1#0 if Txn.application_id == 0: local_state/local_state_contract.py:18 + bnz main_after_if_else@4 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 + // Implicit fall through to main_if_body@3 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 main_if_body@3: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:19 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:19 + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:19 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:19 main_after_if_else@4: - txn OnCompletion // (𝕗) method#0 | {txn} Txn.on_completion local_state/local_state_contract.py:20 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) method#0 | tmp%3#0 Txn.on_completion local_state/local_state_contract.py:20 - dup // load tmp%3#0 from l-stack (copy) (𝕗) method#0 | tmp%3#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - ! // (𝕗) method#0 | tmp%3#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - swap // store contains%4#0 to l-stack (no copy) (𝕗) method#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) method#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - int OptIn // (𝕗) method#0 | contains%4#0,tmp%3#0,OptIn OnCompleteAction.OptIn local_state/local_state_contract.py:20 - == // (𝕗) method#0 | contains%4#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: store is_equal%5#0 to l-stack (no copy) (𝕗) method#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load contains%4#0 from l-stack (no copy) (𝕗) method#0 | is_equal%5#0,contains%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load is_equal%5#0 from l-stack (no copy) (𝕗) method#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - || // (𝕗) method#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - bnz main_after_if_else@6 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // Implicit fall through to main_if_body@5 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + txn OnCompletion // (𝕗) method#0 | {txn} Txn.on_completion local_state/local_state_contract.py:20 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) method#0 | tmp%3#0 Txn.on_completion local_state/local_state_contract.py:20 + dup // load tmp%3#0 from l-stack (copy) (𝕗) method#0 | tmp%3#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + ! // (𝕗) method#0 | tmp%3#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + swap // store contains%4#0 to l-stack (no copy) (𝕗) method#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) method#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + int OptIn // (𝕗) method#0 | contains%4#0,tmp%3#0,OptIn OnCompleteAction.OptIn local_state/local_state_contract.py:20 + == // (𝕗) method#0 | contains%4#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: store is_equal%5#0 to l-stack (no copy) (𝕗) method#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load contains%4#0 from l-stack (no copy) (𝕗) method#0 | is_equal%5#0,contains%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load is_equal%5#0 from l-stack (no copy) (𝕗) method#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + || // (𝕗) method#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + bnz main_after_if_else@6 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // Implicit fall through to main_if_body@5 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 main_if_body@5: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:21 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:21 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:21 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:21 main_after_if_else@6: - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:22 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0 | tmp%7#0 Txn.num_app_args local_state/local_state_contract.py:22 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0 | tmp%7#0 if Txn.num_app_args == 0: local_state/local_state_contract.py:22 - bnz main_after_if_else@8 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 - // Implicit fall through to main_if_body@7 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:22 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0 | tmp%7#0 Txn.num_app_args local_state/local_state_contract.py:22 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0 | tmp%7#0 if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + bnz main_after_if_else@8 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + // Implicit fall through to main_if_body@7 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 main_if_body@7: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:23 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:23 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:23 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:23 main_after_if_else@8: - txna ApplicationArgs 0 // (𝕗) method#0 | {txna} Txn.application_args(0) local_state/local_state_contract.py:25 - bury 1 // store method#0 to f-stack (𝕗) method#0 | method = Txn.application_args(0) local_state/local_state_contract.py:25 - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:26 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args local_state/local_state_contract.py:26 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 - int 1 // (𝕗) method#0 | tmp%9#0,1 1 local_state/local_state_contract.py:26 - == // (𝕗) method#0 | {==} Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0 | tmp%10#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0 | tmp%10#0 if Txn.num_app_args == 1: local_state/local_state_contract.py:26 - bz main_else_body@19 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // Implicit fall through to main_if_body@9 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + txna ApplicationArgs 0 // (𝕗) method#0 | {txna} Txn.application_args(0) local_state/local_state_contract.py:25 + bury 1 // store method#0 to f-stack (𝕗) method#0 | method = Txn.application_args(0) local_state/local_state_contract.py:25 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:26 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args local_state/local_state_contract.py:26 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 + int 1 // (𝕗) method#0 | tmp%9#0,1 1 local_state/local_state_contract.py:26 + == // (𝕗) method#0 | {==} Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0 | tmp%10#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0 | tmp%10#0 if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + bz main_else_body@19 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // Implicit fall through to main_if_body@9 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 main_if_body@9: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - byte "get_guaranteed_data" // (𝕗) method#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_contract.py:27 - == // (𝕗) method#0 | {==} method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0 | tmp%11#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0 | tmp%11#0 if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - bz main_else_body@11 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // Implicit fall through to main_if_body@10 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + byte "get_guaranteed_data" // (𝕗) method#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_contract.py:27 + == // (𝕗) method#0 | {==} method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0 | tmp%11#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0 | tmp%11#0 if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + bz main_else_body@11 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // Implicit fall through to main_if_body@10 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 main_if_body@10: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:28 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0 | tmp%12#0 Txn.sender local_state/local_state_contract.py:28 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0 | tmp%12#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - callsub get_guaranteed_data // (𝕗) method#0 | {get_guaranteed_data} self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0 | tmp%13#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0 | tmp%13#0 log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 - log // (𝕗) method#0 | log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 - b main_after_if_else@18 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:28 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0 | tmp%12#0 Txn.sender local_state/local_state_contract.py:28 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0 | tmp%12#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + callsub get_guaranteed_data // (𝕗) method#0 | {get_guaranteed_data} self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0 | tmp%13#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0 | tmp%13#0 log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 + log // (𝕗) method#0 | log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 + b main_after_if_else@18 // (𝕗) method#0 | main_else_body@11: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 - byte "get_data_or_assert" // (𝕗) method#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_contract.py:29 - == // (𝕗) method#0 | {==} method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0 | tmp%14#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0 | tmp%14#0 elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 - bz main_else_body@13 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // Implicit fall through to main_if_body@12 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 + byte "get_data_or_assert" // (𝕗) method#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_contract.py:29 + == // (𝕗) method#0 | {==} method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0 | tmp%14#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0 | tmp%14#0 elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + bz main_else_body@13 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // Implicit fall through to main_if_body@12 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 main_if_body@12: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:30 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0 | tmp%15#0 Txn.sender local_state/local_state_contract.py:30 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0 | tmp%15#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - callsub get_data_or_assert // (𝕗) method#0 | {get_data_or_assert} self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0 | tmp%16#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0 | tmp%16#0 log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 - log // (𝕗) method#0 | log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 - b main_after_if_else@18 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:30 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0 | tmp%15#0 Txn.sender local_state/local_state_contract.py:30 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0 | tmp%15#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + callsub get_data_or_assert // (𝕗) method#0 | {get_data_or_assert} self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0 | tmp%16#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0 | tmp%16#0 log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 + log // (𝕗) method#0 | log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 + b main_after_if_else@18 // (𝕗) method#0 | main_else_body@13: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"delete_data": local_state/local_state_contract.py:31 - byte "delete_data" // (𝕗) method#0 | method#0,"delete_data" b"delete_data" local_state/local_state_contract.py:31 - == // (𝕗) method#0 | {==} method == b"delete_data": local_state/local_state_contract.py:31 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0 | tmp%17#0 method == b"delete_data": local_state/local_state_contract.py:31 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0 | tmp%17#0 elif method == b"delete_data": local_state/local_state_contract.py:31 - bz main_else_body@15 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 - // Implicit fall through to main_if_body@14 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"delete_data": local_state/local_state_contract.py:31 + byte "delete_data" // (𝕗) method#0 | method#0,"delete_data" b"delete_data" local_state/local_state_contract.py:31 + == // (𝕗) method#0 | {==} method == b"delete_data": local_state/local_state_contract.py:31 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0 | tmp%17#0 method == b"delete_data": local_state/local_state_contract.py:31 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0 | tmp%17#0 elif method == b"delete_data": local_state/local_state_contract.py:31 + bz main_else_body@15 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 + // Implicit fall through to main_if_body@14 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 main_if_body@14: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:32 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.sender local_state/local_state_contract.py:32 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0 | tmp%18#0 self.delete_data(Txn.sender) local_state/local_state_contract.py:32 - callsub delete_data // (𝕗) method#0 | self.delete_data(Txn.sender) local_state/local_state_contract.py:32 - byte "Deleted" // (𝕗) method#0 | "Deleted" b"Deleted" local_state/local_state_contract.py:33 - log // (𝕗) method#0 | log(b"Deleted") local_state/local_state_contract.py:33 - b main_after_if_else@18 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:32 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.sender local_state/local_state_contract.py:32 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0 | tmp%18#0 self.delete_data(Txn.sender) local_state/local_state_contract.py:32 + callsub delete_data // (𝕗) method#0 | self.delete_data(Txn.sender) local_state/local_state_contract.py:32 + byte "Deleted" // (𝕗) method#0 | "Deleted" b"Deleted" local_state/local_state_contract.py:33 + log // (𝕗) method#0 | log(b"Deleted") local_state/local_state_contract.py:33 + b main_after_if_else@18 // (𝕗) method#0 | main_else_body@15: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:35 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:35 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:35 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:35 main_after_if_else@18: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:36 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:36 + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:36 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:36 main_else_body@19: - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:37 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args local_state/local_state_contract.py:37 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 - int 2 // (𝕗) method#0 | tmp%19#0,2 2 local_state/local_state_contract.py:37 - == // (𝕗) method#0 | {==} Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0 | tmp%20#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0 | tmp%20#0 elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 - bz main_else_body@27 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // Implicit fall through to main_if_body@20 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:37 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args local_state/local_state_contract.py:37 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 + int 2 // (𝕗) method#0 | tmp%19#0,2 2 local_state/local_state_contract.py:37 + == // (𝕗) method#0 | {==} Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0 | tmp%20#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0 | tmp%20#0 elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + bz main_else_body@27 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // Implicit fall through to main_if_body@20 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 main_if_body@20: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"set_data": local_state/local_state_contract.py:38 - byte "set_data" // (𝕗) method#0 | method#0,"set_data" b"set_data" local_state/local_state_contract.py:38 - == // (𝕗) method#0 | {==} method == b"set_data": local_state/local_state_contract.py:38 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0 method == b"set_data": local_state/local_state_contract.py:38 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0 | tmp%21#0 if method == b"set_data": local_state/local_state_contract.py:38 - bz main_else_body@22 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 - // Implicit fall through to main_if_body@21 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"set_data": local_state/local_state_contract.py:38 + byte "set_data" // (𝕗) method#0 | method#0,"set_data" b"set_data" local_state/local_state_contract.py:38 + == // (𝕗) method#0 | {==} method == b"set_data": local_state/local_state_contract.py:38 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0 method == b"set_data": local_state/local_state_contract.py:38 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0 | tmp%21#0 if method == b"set_data": local_state/local_state_contract.py:38 + bz main_else_body@22 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 + // Implicit fall through to main_if_body@21 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 main_if_body@21: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:39 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0 | tmp%22#0 Txn.sender local_state/local_state_contract.py:39 - txna ApplicationArgs 1 // (𝕗) method#0 | tmp%22#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:39 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%23#0 Txn.application_args(1) local_state/local_state_contract.py:39 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0 | tmp%23#0,tmp%22#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%23#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - callsub set_data // (𝕗) method#0 | self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - b main_after_if_else@26 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:39 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0 | tmp%22#0 Txn.sender local_state/local_state_contract.py:39 + txna ApplicationArgs 1 // (𝕗) method#0 | tmp%22#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:39 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%23#0 Txn.application_args(1) local_state/local_state_contract.py:39 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0 | tmp%23#0,tmp%22#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%23#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + callsub set_data // (𝕗) method#0 | self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + b main_after_if_else@26 // (𝕗) method#0 | main_else_body@22: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 - byte "get_data_with_default" // (𝕗) method#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_contract.py:40 - == // (𝕗) method#0 | {==} method == b"get_data_with_default": local_state/local_state_contract.py:40 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) method#0 | tmp%24#0 elif method == b"get_data_with_default": local_state/local_state_contract.py:40 - bz main_else_body@24 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 - // Implicit fall through to main_if_body@23 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 + byte "get_data_with_default" // (𝕗) method#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_contract.py:40 + == // (𝕗) method#0 | {==} method == b"get_data_with_default": local_state/local_state_contract.py:40 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) method#0 | tmp%24#0 elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + bz main_else_body@24 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + // Implicit fall through to main_if_body@23 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 main_if_body@23: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:41 - // virtual: store tmp%25#0 to l-stack (no copy) (𝕗) method#0 | tmp%25#0 Txn.sender local_state/local_state_contract.py:41 - txna ApplicationArgs 1 // (𝕗) method#0 | tmp%25#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:41 - // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%26#0 Txn.application_args(1) local_state/local_state_contract.py:41 - // virtual: load tmp%25#0 from l-stack (no copy) (𝕗) method#0 | tmp%26#0,tmp%25#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: load tmp%26#0 from l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%26#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - callsub get_data_with_default // (𝕗) method#0 | {get_data_with_default} self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: store tmp%27#0 to l-stack (no copy) (𝕗) method#0 | tmp%27#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕗) method#0 | tmp%27#0 log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 - log // (𝕗) method#0 | log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 - b main_after_if_else@26 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:41 + // virtual: store tmp%25#0 to l-stack (no copy) (𝕗) method#0 | tmp%25#0 Txn.sender local_state/local_state_contract.py:41 + txna ApplicationArgs 1 // (𝕗) method#0 | tmp%25#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:41 + // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%26#0 Txn.application_args(1) local_state/local_state_contract.py:41 + // virtual: load tmp%25#0 from l-stack (no copy) (𝕗) method#0 | tmp%26#0,tmp%25#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: load tmp%26#0 from l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%26#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + callsub get_data_with_default // (𝕗) method#0 | {get_data_with_default} self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: store tmp%27#0 to l-stack (no copy) (𝕗) method#0 | tmp%27#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: load tmp%27#0 from l-stack (no copy) (𝕗) method#0 | tmp%27#0 log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 + log // (𝕗) method#0 | log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 + b main_after_if_else@26 // (𝕗) method#0 | main_else_body@24: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:43 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:43 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:43 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:43 main_after_if_else@26: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:44 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:44 + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:44 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:44 main_else_body@27: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:46 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:46 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:46 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:46 // examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: get_guaranteed_data: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:51-52 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:51-52 get_guaranteed_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_contract.py:53 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_contract.py:53 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_contract.py:53 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 - assert // check value exists // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 - retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_contract.py:53 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_contract.py:53 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_contract.py:53 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 + assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 + retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 // examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: get_data_or_assert: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:59-60 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:59-60 get_data_or_assert_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_contract.py:61 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_contract.py:62 - assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_contract.py:62 - // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_contract.py:63 - retsub // result#0 return result local_state/local_state_contract.py:63 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_contract.py:61 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_contract.py:62 + assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_contract.py:62 + // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_contract.py:63 + retsub // result#0 return result local_state/local_state_contract.py:63 // examples.local_state.local_state_contract.LocalStateContract.delete_data(for_account: bytes) -> void: delete_data: - proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: Account) -> None: local_state/local_state_contract.py:69-70 + proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: Account) -> None: local_state/local_state_contract.py:69-70 delete_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_contract.py:71 - byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:71 - app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_contract.py:71 - retsub // + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_contract.py:71 + byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:71 + app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_contract.py:71 + retsub // // examples.local_state.local_state_contract.LocalStateContract.set_data(for_account: bytes, value: bytes) -> void: set_data: - proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: Account, value: Bytes) -> None: local_state/local_state_contract.py:65-66 + proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: Account, value: Bytes) -> None: local_state/local_state_contract.py:65-66 set_data_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_contract.py:67 - byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:67 - frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_contract.py:67 - app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_contract.py:67 - retsub // + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_contract.py:67 + byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:67 + frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_contract.py:67 + app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_contract.py:67 + retsub // // examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: get_data_with_default: - proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: Account, default: Bytes) -> Bytes: local_state/local_state_contract.py:55-56 + proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: Account, default: Bytes) -> Bytes: local_state/local_state_contract.py:55-56 get_data_with_default_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_contract.py:57 - app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: store awst_tmp%0.1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | awst_tmp%0.1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: store awst_tmp%0.0#0 to f-stack (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | awst_tmp%0.1#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: load awst_tmp%0.1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | awst_tmp%0.1#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - bz get_data_with_default_ternary_false@2 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | self.local.get(for_account, default) local_state/local_state_contract.py:57 - // Implicit fall through to get_data_with_default_ternary_true@1 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | self.local.get(for_account, default) local_state/local_state_contract.py:57 - -get_data_with_default_ternary_true@1: - frame_dig 0 // load awst_tmp%0.0#0 from f-stack (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | awst_tmp%0.0#0 - // virtual: store ternary_result%1#2 to x-stack (no copy) (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | - b get_data_with_default_ternary_merge@3 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | ternary_result%1#2 - -get_data_with_default_ternary_false@2: - frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | default#0 - // virtual: store ternary_result%1#2 to x-stack (no copy) (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | - // Implicit fall through to get_data_with_default_ternary_merge@3 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | ternary_result%1#2 - -get_data_with_default_ternary_merge@3: - // virtual: load ternary_result%1#2 from x-stack (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | ternary_result%1#2 ternary_result%1#2 return self.local.get(for_account, default) local_state/local_state_contract.py:57 - swap - retsub // ternary_result%1#2 return self.local.get(for_account, default) local_state/local_state_contract.py:57 + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_contract.py:57 + app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_contract.py:57 + swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 + retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 // examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: local_state/local_state_contract.py:14 + proto 0 0 // def __init__(self) -> None: local_state/local_state_contract.py:14 __init___block@0: - retsub // + retsub // diff --git a/examples/local_state/out/LocalStateContract.approval.teal b/examples/local_state/out/LocalStateContract.approval.teal index e875025b2a..9e7dd484c3 100644 --- a/examples/local_state/out/LocalStateContract.approval.teal +++ b/examples/local_state/out/LocalStateContract.approval.teal @@ -175,7 +175,7 @@ get_guaranteed_data: int 0 byte "local" app_local_get_ex - assert // check value exists + assert // check local exists for account retsub @@ -240,17 +240,11 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - bz get_data_with_default_ternary_false@2 - frame_dig 0 - b get_data_with_default_ternary_merge@3 - -get_data_with_default_ternary_false@2: + swap frame_dig -1 - -get_data_with_default_ternary_merge@3: - // local_state/local_state_contract.py:57 - // return self.local.get(for_account, default) swap + uncover 2 + select retsub diff --git a/examples/local_state/out/LocalStateContract.destructured.ir b/examples/local_state/out/LocalStateContract.destructured.ir index e911a4d24a..70be5a321c 100644 --- a/examples/local_state/out/LocalStateContract.destructured.ir +++ b/examples/local_state/out/LocalStateContract.destructured.ir @@ -89,7 +89,7 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: @@ -110,16 +110,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: block@0: // L55 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L57 - let ternary_result%1#2: bytes = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L57 - let ternary_result%1#2: bytes = default#0 - goto block@3 - block@3: // ternary_merge_L57 - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: block@0: // L14 diff --git a/examples/local_state/out/LocalStateContract.ssa.ir b/examples/local_state/out/LocalStateContract.ssa.ir index e9177df86c..abd4d2126f 100644 --- a/examples/local_state/out/LocalStateContract.ssa.ir +++ b/examples/local_state/out/LocalStateContract.ssa.ir @@ -97,7 +97,7 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: @@ -120,17 +120,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: block@0: // L55 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L57 - let ternary_result%1#0: any = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L57 - let ternary_result%1#1: bytes = default#0 - goto block@3 - block@3: // ternary_merge_L57 - let ternary_result%1#2: bytes = φ(ternary_result%1#0 <- block@1, ternary_result%1#1 <- block@2) - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: block@0: // L14 diff --git a/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir b/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir index 39b9cac0d1..63cb2e541f 100644 --- a/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir +++ b/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir @@ -91,7 +91,7 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: @@ -112,15 +112,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: block@0: // L55 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L57 - goto block@3 - block@2: // ternary_false_L57 - goto block@3 - block@3: // ternary_merge_L57 - let ternary_result%1#2: bytes = φ(awst_tmp%0.0#0 <- block@1, default#0 <- block@2) - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: block@0: // L14 diff --git a/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir b/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir index 9ffa8bcf7a..70be5a321c 100644 --- a/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir +++ b/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir @@ -89,7 +89,7 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: @@ -110,15 +110,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: block@0: // L55 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L57 - goto block@3 - block@2: // ternary_false_L57 - goto block@3 - block@3: // ternary_merge_L57 - let ternary_result%1#2: bytes = φ(awst_tmp%0.0#0 <- block@1, default#0 <- block@2) - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: block@0: // L14 diff --git a/examples/local_state/out/LocalStateWithOffsets.approval.mir b/examples/local_state/out/LocalStateWithOffsets.approval.mir index 0a6f706767..7ee40c44b0 100644 --- a/examples/local_state/out/LocalStateWithOffsets.approval.mir +++ b/examples/local_state/out/LocalStateWithOffsets.approval.mir @@ -1,300 +1,289 @@ -// Op // Op Description Stack (out) Live (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: main: int 0 - byte "" // allocate 2 to stack (𝕗) method#0,offset#0 | + byte "" // allocate 2 to stack (𝕗) method#0,offset#0 | main_block@0: - txn ApplicationID // (𝕗) method#0,offset#0 | {txn} - // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) method#0,offset#0 | app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) method#0,offset#0 | app_id%0#0 - bnz main_entrypoint@2 // (𝕗) method#0,offset#0 | - // Implicit fall through to main_on_create@1 // (𝕗) method#0,offset#0 | + txn ApplicationID // (𝕗) method#0,offset#0 | {txn} + // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) method#0,offset#0 | app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) method#0,offset#0 | app_id%0#0 + bnz main_entrypoint@2 // (𝕗) method#0,offset#0 | + // Implicit fall through to main_on_create@1 // (𝕗) method#0,offset#0 | main_on_create@1: - callsub __init__ // (𝕗) method#0,offset#0 | - // Implicit fall through to main_entrypoint@2 // (𝕗) method#0,offset#0 | + callsub __init__ // (𝕗) method#0,offset#0 | + // Implicit fall through to main_entrypoint@2 // (𝕗) method#0,offset#0 | main_entrypoint@2: - txn ApplicationID // (𝕗) method#0,offset#0 | {txn} Txn.application_id local_state/local_state_with_offsets.py:19 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%1#0 Txn.application_id local_state/local_state_with_offsets.py:19 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%1#0 if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 - bnz main_after_if_else@4 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 - // Implicit fall through to main_if_body@3 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + txn ApplicationID // (𝕗) method#0,offset#0 | {txn} Txn.application_id local_state/local_state_with_offsets.py:19 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%1#0 Txn.application_id local_state/local_state_with_offsets.py:19 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%1#0 if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + bnz main_after_if_else@4 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + // Implicit fall through to main_if_body@3 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 main_if_body@3: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:20 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:20 + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:20 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:20 main_after_if_else@4: - txn OnCompletion // (𝕗) method#0,offset#0 | {txn} Txn.on_completion local_state/local_state_with_offsets.py:21 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%3#0 Txn.on_completion local_state/local_state_with_offsets.py:21 - dup // load tmp%3#0 from l-stack (copy) (𝕗) method#0,offset#0 | tmp%3#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - ! // (𝕗) method#0,offset#0 | tmp%3#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - swap // store contains%4#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - int OptIn // (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0,OptIn OnCompleteAction.OptIn local_state/local_state_with_offsets.py:21 - == // (𝕗) method#0,offset#0 | contains%4#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: store is_equal%5#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load contains%4#0 from l-stack (no copy) (𝕗) method#0,offset#0 | is_equal%5#0,contains%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load is_equal%5#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - || // (𝕗) method#0,offset#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - bnz main_after_if_else@6 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // Implicit fall through to main_if_body@5 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + txn OnCompletion // (𝕗) method#0,offset#0 | {txn} Txn.on_completion local_state/local_state_with_offsets.py:21 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%3#0 Txn.on_completion local_state/local_state_with_offsets.py:21 + dup // load tmp%3#0 from l-stack (copy) (𝕗) method#0,offset#0 | tmp%3#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + ! // (𝕗) method#0,offset#0 | tmp%3#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + swap // store contains%4#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + int OptIn // (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0,OptIn OnCompleteAction.OptIn local_state/local_state_with_offsets.py:21 + == // (𝕗) method#0,offset#0 | contains%4#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: store is_equal%5#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load contains%4#0 from l-stack (no copy) (𝕗) method#0,offset#0 | is_equal%5#0,contains%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load is_equal%5#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + || // (𝕗) method#0,offset#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + bnz main_after_if_else@6 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // Implicit fall through to main_if_body@5 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 main_if_body@5: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:22 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:22 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:22 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:22 main_after_if_else@6: - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:23 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args local_state/local_state_with_offsets.py:23 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - int 1 // (𝕗) method#0,offset#0 | tmp%7#0,1 1 local_state/local_state_with_offsets.py:23 - < // (𝕗) method#0,offset#0 | {<} Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - bz main_after_if_else@8 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // Implicit fall through to main_if_body@7 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:23 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args local_state/local_state_with_offsets.py:23 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + int 1 // (𝕗) method#0,offset#0 | tmp%7#0,1 1 local_state/local_state_with_offsets.py:23 + < // (𝕗) method#0,offset#0 | {<} Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + bz main_after_if_else@8 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // Implicit fall through to main_if_body@7 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 main_if_body@7: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:24 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:24 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:24 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:24 main_after_if_else@8: - txna ApplicationArgs 0 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(0) local_state/local_state_with_offsets.py:26 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.application_args(0) local_state/local_state_with_offsets.py:26 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - btoi // (𝕗) method#0,offset#0 | {btoi} op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - bury 1 // store offset#0 to f-stack (𝕗) method#0,offset#0 | offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - txna ApplicationArgs 1 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(1) local_state/local_state_with_offsets.py:27 - bury 2 // store method#0 to f-stack (𝕗) method#0,offset#0 | method = Txn.application_args(1) local_state/local_state_with_offsets.py:27 - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:28 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args local_state/local_state_with_offsets.py:28 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - int 2 // (𝕗) method#0,offset#0 | tmp%10#0,2 2 local_state/local_state_with_offsets.py:28 - == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - bz main_else_body@19 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // Implicit fall through to main_if_body@9 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + txna ApplicationArgs 0 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(0) local_state/local_state_with_offsets.py:26 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.application_args(0) local_state/local_state_with_offsets.py:26 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + btoi // (𝕗) method#0,offset#0 | {btoi} op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + bury 1 // store offset#0 to f-stack (𝕗) method#0,offset#0 | offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + txna ApplicationArgs 1 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(1) local_state/local_state_with_offsets.py:27 + bury 2 // store method#0 to f-stack (𝕗) method#0,offset#0 | method = Txn.application_args(1) local_state/local_state_with_offsets.py:27 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:28 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args local_state/local_state_with_offsets.py:28 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + int 2 // (𝕗) method#0,offset#0 | tmp%10#0,2 2 local_state/local_state_with_offsets.py:28 + == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + bz main_else_body@19 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // Implicit fall through to main_if_body@9 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 main_if_body@9: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - byte "get_guaranteed_data" // (𝕗) method#0,offset#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_with_offsets.py:29 - == // (𝕗) method#0,offset#0 | {==} method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - bz main_else_body@11 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // Implicit fall through to main_if_body@10 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + byte "get_guaranteed_data" // (𝕗) method#0,offset#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_with_offsets.py:29 + == // (𝕗) method#0,offset#0 | {==} method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + bz main_else_body@11 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // Implicit fall through to main_if_body@10 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 main_if_body@10: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - callsub get_guaranteed_data // (𝕗) method#0,offset#0 | {get_guaranteed_data} self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 - log // (𝕗) method#0,offset#0 | log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 - b main_after_if_else@18 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + callsub get_guaranteed_data // (𝕗) method#0,offset#0 | {get_guaranteed_data} self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 + log // (𝕗) method#0,offset#0 | log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 + b main_after_if_else@18 // (𝕗) method#0,offset#0 | main_else_body@11: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - byte "get_data_or_assert" // (𝕗) method#0,offset#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_with_offsets.py:31 - == // (𝕗) method#0,offset#0 | {==} method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - bz main_else_body@13 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // Implicit fall through to main_if_body@12 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + byte "get_data_or_assert" // (𝕗) method#0,offset#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_with_offsets.py:31 + == // (𝕗) method#0,offset#0 | {==} method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + bz main_else_body@13 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // Implicit fall through to main_if_body@12 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 main_if_body@12: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - callsub get_data_or_assert // (𝕗) method#0,offset#0 | {get_data_or_assert} self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 - log // (𝕗) method#0,offset#0 | log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 - b main_after_if_else@18 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + callsub get_data_or_assert // (𝕗) method#0,offset#0 | {get_data_or_assert} self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 + log // (𝕗) method#0,offset#0 | log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 + b main_after_if_else@18 // (𝕗) method#0,offset#0 | main_else_body@13: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 - byte "delete_data" // (𝕗) method#0,offset#0 | method#0,"delete_data" b"delete_data" local_state/local_state_with_offsets.py:33 - == // (𝕗) method#0,offset#0 | {==} method == b"delete_data": local_state/local_state_with_offsets.py:33 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 elif method == b"delete_data": local_state/local_state_with_offsets.py:33 - bz main_else_body@15 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 - // Implicit fall through to main_if_body@14 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 + byte "delete_data" // (𝕗) method#0,offset#0 | method#0,"delete_data" b"delete_data" local_state/local_state_with_offsets.py:33 + == // (𝕗) method#0,offset#0 | {==} method == b"delete_data": local_state/local_state_with_offsets.py:33 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + bz main_else_body@15 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + // Implicit fall through to main_if_body@14 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 main_if_body@14: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.delete_data(offset) local_state/local_state_with_offsets.py:34 - callsub delete_data // (𝕗) method#0,offset#0 | self.delete_data(offset) local_state/local_state_with_offsets.py:34 - byte "Deleted" // (𝕗) method#0,offset#0 | "Deleted" b"Deleted" local_state/local_state_with_offsets.py:35 - log // (𝕗) method#0,offset#0 | log(b"Deleted") local_state/local_state_with_offsets.py:35 - b main_after_if_else@18 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.delete_data(offset) local_state/local_state_with_offsets.py:34 + callsub delete_data // (𝕗) method#0,offset#0 | self.delete_data(offset) local_state/local_state_with_offsets.py:34 + byte "Deleted" // (𝕗) method#0,offset#0 | "Deleted" b"Deleted" local_state/local_state_with_offsets.py:35 + log // (𝕗) method#0,offset#0 | log(b"Deleted") local_state/local_state_with_offsets.py:35 + b main_after_if_else@18 // (𝕗) method#0,offset#0 | main_else_body@15: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:37 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:37 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:37 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:37 main_after_if_else@18: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:38 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:38 + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:38 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:38 main_else_body@19: - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:39 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args local_state/local_state_with_offsets.py:39 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - int 3 // (𝕗) method#0,offset#0 | tmp%17#0,3 3 local_state/local_state_with_offsets.py:39 - == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - bz main_else_body@27 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // Implicit fall through to main_if_body@20 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:39 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args local_state/local_state_with_offsets.py:39 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + int 3 // (𝕗) method#0,offset#0 | tmp%17#0,3 3 local_state/local_state_with_offsets.py:39 + == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + bz main_else_body@27 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // Implicit fall through to main_if_body@20 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 main_if_body@20: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"set_data": local_state/local_state_with_offsets.py:40 - byte "set_data" // (𝕗) method#0,offset#0 | method#0,"set_data" b"set_data" local_state/local_state_with_offsets.py:40 - == // (𝕗) method#0,offset#0 | {==} method == b"set_data": local_state/local_state_with_offsets.py:40 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 method == b"set_data": local_state/local_state_with_offsets.py:40 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 if method == b"set_data": local_state/local_state_with_offsets.py:40 - bz main_else_body@22 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 - // Implicit fall through to main_if_body@21 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"set_data": local_state/local_state_with_offsets.py:40 + byte "set_data" // (𝕗) method#0,offset#0 | method#0,"set_data" b"set_data" local_state/local_state_with_offsets.py:40 + == // (𝕗) method#0,offset#0 | {==} method == b"set_data": local_state/local_state_with_offsets.py:40 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 method == b"set_data": local_state/local_state_with_offsets.py:40 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 if method == b"set_data": local_state/local_state_with_offsets.py:40 + bz main_else_body@22 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 + // Implicit fall through to main_if_body@21 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 main_if_body@21: - txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:41 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 Txn.application_args(2) local_state/local_state_with_offsets.py:41 - dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%20#0,offset#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - swap // load tmp%20#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%20#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - callsub set_data // (𝕗) method#0,offset#0 | self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - b main_after_if_else@26 // (𝕗) method#0,offset#0 | + txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:41 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 Txn.application_args(2) local_state/local_state_with_offsets.py:41 + dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%20#0,offset#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + swap // load tmp%20#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%20#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + callsub set_data // (𝕗) method#0,offset#0 | self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + b main_after_if_else@26 // (𝕗) method#0,offset#0 | main_else_body@22: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - byte "get_data_with_default" // (𝕗) method#0,offset#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_with_offsets.py:42 - == // (𝕗) method#0,offset#0 | {==} method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - bz main_else_body@24 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // Implicit fall through to main_if_body@23 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + byte "get_data_with_default" // (𝕗) method#0,offset#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_with_offsets.py:42 + == // (𝕗) method#0,offset#0 | {==} method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + bz main_else_body@24 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // Implicit fall through to main_if_body@23 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 main_if_body@23: - txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:43 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 Txn.application_args(2) local_state/local_state_with_offsets.py:43 - dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%22#0,offset#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - swap // load tmp%22#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%22#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - callsub get_data_with_default // (𝕗) method#0,offset#0 | {get_data_with_default} self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%23#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%23#0 log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 - log // (𝕗) method#0,offset#0 | log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 - b main_after_if_else@26 // (𝕗) method#0,offset#0 | + txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:43 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 Txn.application_args(2) local_state/local_state_with_offsets.py:43 + dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%22#0,offset#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + swap // load tmp%22#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%22#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + callsub get_data_with_default // (𝕗) method#0,offset#0 | {get_data_with_default} self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%23#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%23#0 log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 + log // (𝕗) method#0,offset#0 | log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 + b main_after_if_else@26 // (𝕗) method#0,offset#0 | main_else_body@24: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:45 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:45 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:45 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:45 main_after_if_else@26: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:46 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:46 + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:46 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:46 main_else_body@27: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:48 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:48 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:48 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:48 // examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: get_guaranteed_data: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:53-54 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:53-54 get_guaranteed_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_with_offsets.py:55 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_with_offsets.py:55 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - assert // check value exists // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 - retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_with_offsets.py:55 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_with_offsets.py:55 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 + retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 // examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: get_data_or_assert: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:61-62 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:61-62 get_data_or_assert_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 - assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 - // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_with_offsets.py:65 - retsub // result#0 return result local_state/local_state_with_offsets.py:65 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 + assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 + // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_with_offsets.py:65 + retsub // result#0 return result local_state/local_state_with_offsets.py:65 // examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(for_account: uint64) -> void: delete_data: - proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: UInt64) -> None: local_state/local_state_with_offsets.py:71-72 + proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: UInt64) -> None: local_state/local_state_with_offsets.py:71-72 delete_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_with_offsets.py:73 - byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:73 - app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_with_offsets.py:73 - retsub // + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_with_offsets.py:73 + byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:73 + app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_with_offsets.py:73 + retsub // // examples.local_state.local_state_with_offsets.LocalStateContract.set_data(for_account: uint64, value: bytes) -> void: set_data: - proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: UInt64, value: Bytes) -> None: local_state/local_state_with_offsets.py:67-68 + proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: UInt64, value: Bytes) -> None: local_state/local_state_with_offsets.py:67-68 set_data_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 - byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:69 - frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 - app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_with_offsets.py:69 - retsub // + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 + byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:69 + frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 + app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_with_offsets.py:69 + retsub // // examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: get_data_with_default: - proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: UInt64, default: Bytes) -> Bytes: local_state/local_state_with_offsets.py:57-58 + proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: UInt64, default: Bytes) -> Bytes: local_state/local_state_with_offsets.py:57-58 get_data_with_default_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: store awst_tmp%0.1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | awst_tmp%0.1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: store awst_tmp%0.0#0 to f-stack (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | awst_tmp%0.1#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: load awst_tmp%0.1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | awst_tmp%0.1#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - bz get_data_with_default_ternary_false@2 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // Implicit fall through to get_data_with_default_ternary_true@1 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - -get_data_with_default_ternary_true@1: - frame_dig 0 // load awst_tmp%0.0#0 from f-stack (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | awst_tmp%0.0#0 - // virtual: store ternary_result%1#2 to x-stack (no copy) (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | - b get_data_with_default_ternary_merge@3 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | ternary_result%1#2 - -get_data_with_default_ternary_false@2: - frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | default#0 - // virtual: store ternary_result%1#2 to x-stack (no copy) (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | - // Implicit fall through to get_data_with_default_ternary_merge@3 // (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | (𝕏) ternary_result%1#2 | ternary_result%1#2 - -get_data_with_default_ternary_merge@3: - // virtual: load ternary_result%1#2 from x-stack (𝕡) for_account#0,default#0 | (𝕗) awst_tmp%0.0#0 | ternary_result%1#2 ternary_result%1#2 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - swap - retsub // ternary_result%1#2 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 // examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: local_state/local_state_with_offsets.py:15 + proto 0 0 // def __init__(self) -> None: local_state/local_state_with_offsets.py:15 __init___block@0: - retsub // + retsub // diff --git a/examples/local_state/out/LocalStateWithOffsets.approval.teal b/examples/local_state/out/LocalStateWithOffsets.approval.teal index d3e8598cb3..b123042853 100644 --- a/examples/local_state/out/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out/LocalStateWithOffsets.approval.teal @@ -183,7 +183,7 @@ get_guaranteed_data: int 0 byte "local" app_local_get_ex - assert // check value exists + assert // check local exists for account retsub @@ -248,17 +248,11 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - bz get_data_with_default_ternary_false@2 - frame_dig 0 - b get_data_with_default_ternary_merge@3 - -get_data_with_default_ternary_false@2: + swap frame_dig -1 - -get_data_with_default_ternary_merge@3: - // local_state/local_state_with_offsets.py:59 - // return self.local.get(for_account, default) swap + uncover 2 + select retsub diff --git a/examples/local_state/out/LocalStateWithOffsets.destructured.ir b/examples/local_state/out/LocalStateWithOffsets.destructured.ir index b2d4c47bcc..47e0ef6c22 100644 --- a/examples/local_state/out/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out/LocalStateWithOffsets.destructured.ir @@ -87,7 +87,7 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: @@ -108,16 +108,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: block@0: // L57 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L59 - let ternary_result%1#2: bytes = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L59 - let ternary_result%1#2: bytes = default#0 - goto block@3 - block@3: // ternary_merge_L59 - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: block@0: // L15 diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.ir index 1973e7a42b..2e40946b2d 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.ir @@ -94,7 +94,7 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: @@ -117,17 +117,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: block@0: // L57 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L59 - let ternary_result%1#0: any = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L59 - let ternary_result%1#1: bytes = default#0 - goto block@3 - block@3: // ternary_merge_L59 - let ternary_result%1#2: bytes = φ(ternary_result%1#0 <- block@1, ternary_result%1#1 <- block@2) - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: block@0: // L15 diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir index 277d93a1d9..f7d071b548 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir @@ -88,7 +88,7 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: @@ -109,15 +109,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: block@0: // L57 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L59 - goto block@3 - block@2: // ternary_false_L59 - goto block@3 - block@3: // ternary_merge_L59 - let ternary_result%1#2: bytes = φ(awst_tmp%0.0#0 <- block@1, default#0 <- block@2) - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: block@0: // L15 diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir index 63f9dbc17c..47e0ef6c22 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir @@ -87,7 +87,7 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: @@ -108,15 +108,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: block@0: // L57 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L59 - goto block@3 - block@2: // ternary_false_L59 - goto block@3 - block@3: // ternary_merge_L59 - let ternary_result%1#2: bytes = φ(awst_tmp%0.0#0 <- block@1, default#0 <- block@2) - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: block@0: // L15 diff --git a/examples/local_state/out/local_state_contract.awst b/examples/local_state/out/local_state_contract.awst index a690b01598..b5fc5a5545 100644 --- a/examples/local_state/out/local_state_contract.awst +++ b/examples/local_state/out/local_state_contract.awst @@ -66,7 +66,7 @@ contract LocalStateContract subroutine get_data_with_default(for_account: puyapy.Account, default: puyapy.Bytes): puyapy.Bytes { - return (tmp$0: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.local[for_account])[1]) ? (tmp$0[0]) : (default) + return STATE_GET(this.local[for_account], default=default) } subroutine get_data_or_assert(for_account: puyapy.Account): puyapy.Bytes diff --git a/examples/local_state/out/local_state_with_offsets.awst b/examples/local_state/out/local_state_with_offsets.awst index 6d94e18453..b0715aa01a 100644 --- a/examples/local_state/out/local_state_with_offsets.awst +++ b/examples/local_state/out/local_state_with_offsets.awst @@ -67,7 +67,7 @@ contract LocalStateContract subroutine get_data_with_default(for_account: puyapy.UInt64, default: puyapy.Bytes): puyapy.Bytes { - return (tmp$0: tuple[puyapy.Bytes, bool] := STATE_GET_EX(this.local[for_account])[1]) ? (tmp$0[0]) : (default) + return STATE_GET(this.local[for_account], default=default) } subroutine get_data_or_assert(for_account: puyapy.UInt64): puyapy.Bytes diff --git a/examples/local_state/out_O2/LocalStateContract.approval.teal b/examples/local_state/out_O2/LocalStateContract.approval.teal index 81bda2a575..81b8df524d 100644 --- a/examples/local_state/out_O2/LocalStateContract.approval.teal +++ b/examples/local_state/out_O2/LocalStateContract.approval.teal @@ -100,7 +100,7 @@ get_guaranteed_data: int 0 byte "local" app_local_get_ex - assert // check value exists + assert // check local exists for account retsub @@ -141,15 +141,11 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - bz get_data_with_default_ternary_false@2 - frame_dig 0 - b get_data_with_default_ternary_merge@3 - -get_data_with_default_ternary_false@2: + swap frame_dig -1 - -get_data_with_default_ternary_merge@3: swap + uncover 2 + select retsub diff --git a/examples/local_state/out_O2/LocalStateContract.destructured.ir b/examples/local_state/out_O2/LocalStateContract.destructured.ir index 99b1690a0e..5c084d2e88 100644 --- a/examples/local_state/out_O2/LocalStateContract.destructured.ir +++ b/examples/local_state/out_O2/LocalStateContract.destructured.ir @@ -77,7 +77,7 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: @@ -98,16 +98,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: block@0: // L55 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L57 - let ternary_result%1#2: bytes = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L57 - let ternary_result%1#2: bytes = default#0 - goto block@3 - block@3: // ternary_merge_L57 - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: block@0: // L14 diff --git a/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal b/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal index 3ec80b93de..acee3590da 100644 --- a/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal @@ -106,7 +106,7 @@ get_guaranteed_data: int 0 byte "local" app_local_get_ex - assert // check value exists + assert // check local exists for account retsub @@ -147,15 +147,11 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - bz get_data_with_default_ternary_false@2 - frame_dig 0 - b get_data_with_default_ternary_merge@3 - -get_data_with_default_ternary_false@2: + swap frame_dig -1 - -get_data_with_default_ternary_merge@3: swap + uncover 2 + select retsub diff --git a/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir b/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir index f1a1931d1f..2d07f5981a 100644 --- a/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir @@ -75,7 +75,7 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: @@ -96,16 +96,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: block@0: // L57 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L59 - let ternary_result%1#2: bytes = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L59 - let ternary_result%1#2: bytes = default#0 - goto block@3 - block@3: // ternary_merge_L59 - return ternary_result%1#2 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: block@0: // L15 diff --git a/examples/local_state/out_unoptimized/LocalStateContract.approval.teal b/examples/local_state/out_unoptimized/LocalStateContract.approval.teal index be5e7321b3..d8d46a34b4 100644 --- a/examples/local_state/out_unoptimized/LocalStateContract.approval.teal +++ b/examples/local_state/out_unoptimized/LocalStateContract.approval.teal @@ -186,7 +186,7 @@ get_guaranteed_data: int 0 byte "local" app_local_get_ex - assert // check value exists + assert // check local exists for account retsub @@ -251,19 +251,11 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - bz get_data_with_default_ternary_false@2 - frame_dig 0 - b get_data_with_default_ternary_merge@3 - -get_data_with_default_ternary_false@2: - // local_state/local_state_contract.py:57 - // return self.local.get(for_account, default) + swap frame_dig -1 - -get_data_with_default_ternary_merge@3: - // local_state/local_state_contract.py:57 - // return self.local.get(for_account, default) swap + uncover 2 + select retsub diff --git a/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir b/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir index 433e999fd8..abd4d2126f 100644 --- a/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir +++ b/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir @@ -97,7 +97,7 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: @@ -120,16 +120,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: block@0: // L55 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L57 - let ternary_result%1#0: any = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L57 - let ternary_result%1#0: any = default#0 - goto block@3 - block@3: // ternary_merge_L57 - return ternary_result%1#0 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: block@0: // L14 diff --git a/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal b/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal index 0cc639d8fb..fb857a2d90 100644 --- a/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal @@ -194,7 +194,7 @@ get_guaranteed_data: int 0 byte "local" app_local_get_ex - assert // check value exists + assert // check local exists for account retsub @@ -259,19 +259,11 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - bz get_data_with_default_ternary_false@2 - frame_dig 0 - b get_data_with_default_ternary_merge@3 - -get_data_with_default_ternary_false@2: - // local_state/local_state_with_offsets.py:59 - // return self.local.get(for_account, default) + swap frame_dig -1 - -get_data_with_default_ternary_merge@3: - // local_state/local_state_with_offsets.py:59 - // return self.local.get(for_account, default) swap + uncover 2 + select retsub diff --git a/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir b/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir index 1bb25f66b0..2e40946b2d 100644 --- a/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir @@ -94,7 +94,7 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check value exists + (assert app_local_get_ex_did_exist%1#0) // check local exists for account return app_local_get_ex_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: @@ -117,16 +117,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: block@0: // L57 - let (awst_tmp%0.0#0: any, awst_tmp%0.1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - goto awst_tmp%0.1#0 ? block@1 : block@2 - block@1: // ternary_true_L59 - let ternary_result%1#0: any = awst_tmp%0.0#0 - goto block@3 - block@2: // ternary_false_L59 - let ternary_result%1#0: any = default#0 - goto block@3 - block@3: // ternary_merge_L59 - return ternary_result%1#0 + let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) + return tmp%2#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: block@0: // L15 diff --git a/examples/local_state/puya.log b/examples/local_state/puya.log index 8cace86733..b13dd91ada 100644 --- a/examples/local_state/puya.log +++ b/examples/local_state/puya.log @@ -295,15 +295,6 @@ debug: Sealing block@0: // L65 debug: Terminated block@0: // L65 debug: Sealing block@0: // L55 debug: Terminated block@0: // L55 -debug: Sealing block@None: // ternary_true_L57 -debug: Sealing block@None: // ternary_false_L57 -debug: Terminated block@1: // ternary_true_L57 -debug: Terminated block@2: // ternary_false_L57 -debug: Sealing block@3: // ternary_merge_L57 -debug: Created Phi assignment: let ternary_result%1#2: bytes = undefined while trying to resolve 'ternary_result%1' in block@3: // ternary_merge_L57 -debug: Added ternary_result%1#0 to Phi node: let ternary_result%1#2: bytes = φ(ternary_result%1#0 <- block@1) in block@1: // ternary_true_L57 -debug: Added ternary_result%1#1 to Phi node: let ternary_result%1#2: bytes = φ(ternary_result%1#0 <- block@1, ternary_result%1#1 <- block@2) in block@2: // ternary_false_L57 -debug: Terminated block@3: // ternary_merge_L57 debug: Sealing block@0: // L14 debug: Terminated block@0: // L14 debug: Sealing block@0: // L17 @@ -379,15 +370,6 @@ debug: Sealing block@0: // L67 debug: Terminated block@0: // L67 debug: Sealing block@0: // L57 debug: Terminated block@0: // L57 -debug: Sealing block@None: // ternary_true_L59 -debug: Sealing block@None: // ternary_false_L59 -debug: Terminated block@1: // ternary_true_L59 -debug: Terminated block@2: // ternary_false_L59 -debug: Sealing block@3: // ternary_merge_L59 -debug: Created Phi assignment: let ternary_result%1#2: bytes = undefined while trying to resolve 'ternary_result%1' in block@3: // ternary_merge_L59 -debug: Added ternary_result%1#0 to Phi node: let ternary_result%1#2: bytes = φ(ternary_result%1#0 <- block@1) in block@1: // ternary_true_L59 -debug: Added ternary_result%1#1 to Phi node: let ternary_result%1#2: bytes = φ(ternary_result%1#0 <- block@1, ternary_result%1#1 <- block@2) in block@2: // ternary_false_L59 -debug: Terminated block@3: // ternary_merge_L59 debug: Sealing block@0: // L15 debug: Terminated block@0: // L15 debug: Sealing block@0: // L18 @@ -534,17 +516,11 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: default#0, ternary_result%1#1 -debug: Replacing {ternary_result%1#1} with default#0 made 1 modifications -debug: Found equivalence set: awst_tmp%0.0#0, ternary_result%1#0 -debug: Replacing {ternary_result%1#0} with awst_tmp%0.0#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@1: // ternary_true_L57 because it's used by phi nodes -debug: Not removing empty block block@2: // ternary_false_L57 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.__init__ @@ -639,8 +615,6 @@ debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@1: // ternary_true_L57 because it's used by phi nodes -debug: Not removing empty block block@2: // ternary_false_L57 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.__init__ @@ -731,8 +705,6 @@ debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@1: // ternary_true_L57 because it's used by phi nodes -debug: Not removing empty block block@2: // ternary_false_L57 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.__init__ @@ -777,8 +749,7 @@ debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.set_data using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.get_data_with_default using strategy RootOperandGrouping -debug: Coalescing ternary_result%1#2 with [ternary_result%1#3] -debug: Coalescing resulted in 3 replacement/s +debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.__init__ using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.clear_state_program using strategy RootOperandGrouping @@ -858,14 +829,12 @@ debug: Inserted get_data_or_assert_block@0.ops[4]: 'store exists#0 to l-stack (c debug: Replaced get_data_or_assert_block@0.ops[7]: 'load exists#0' with 'load exists#0 from l-stack (no copy)' debug: Inserted get_data_or_assert_block@0.ops[6]: 'store result#0 to l-stack (copy)' debug: Replaced get_data_or_assert_block@0.ops[10]: 'load result#0' with 'load result#0 from l-stack (no copy)' -debug: Inserted get_data_with_default_block@0.ops[4]: 'store awst_tmp%0.1#0 to l-stack (copy)' -debug: Replaced get_data_with_default_block@0.ops[7]: 'load awst_tmp%0.1#0' with 'load awst_tmp%0.1#0 from l-stack (no copy)' -debug: Found 2 edge set/s for examples.local_state.local_state_contract.LocalStateContract.get_data_with_default -debug: Allocated 1 variable/s to x-stack: ternary_result%1#2 -debug: shared x-stack for get_data_with_default_ternary_true@1 -> get_data_with_default_ternary_merge@3: ternary_result%1#2 -debug: shared x-stack for get_data_with_default_ternary_false@2 -> get_data_with_default_ternary_merge@3: ternary_result%1#2 -debug: examples.local_state.local_state_contract.LocalStateContract.get_data_with_default f-stack entry: [] -debug: examples.local_state.local_state_contract.LocalStateContract.get_data_with_default f-stack on first store: ['awst_tmp%0.0#0'] +debug: Inserted get_data_with_default_block@0.ops[10]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced get_data_with_default_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted get_data_with_default_block@0.ops[5]: 'store local_get_ex%0#0 to l-stack (copy)' +debug: Replaced get_data_with_default_block@0.ops[8]: 'load local_get_ex%0#0' with 'load local_get_ex%0#0 from l-stack (no copy)' +debug: Inserted get_data_with_default_block@0.ops[4]: 'store local_get_ex%1#0 to l-stack (copy)' +debug: Replaced get_data_with_default_block@0.ops[10]: 'load local_get_ex%1#0' with 'load local_get_ex%1#0 from l-stack (no copy)' debug: Output IR to local_state/out/LocalStateWithOffsets.ssa.ir info: Optimizing examples.local_state.local_state_with_offsets.LocalStateContract at level 1 debug: Begin optimization pass 1/100 @@ -945,17 +914,11 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: default#0, ternary_result%1#1 -debug: Replacing {ternary_result%1#1} with default#0 made 1 modifications -debug: Found equivalence set: awst_tmp%0.0#0, ternary_result%1#0 -debug: Replacing {ternary_result%1#0} with awst_tmp%0.0#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@1: // ternary_true_L59 because it's used by phi nodes -debug: Not removing empty block block@2: // ternary_false_L59 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__ @@ -1049,8 +1012,6 @@ debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@1: // ternary_true_L59 because it's used by phi nodes -debug: Not removing empty block block@2: // ternary_false_L59 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__ @@ -1141,8 +1102,6 @@ debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Not removing empty block block@1: // ternary_true_L59 because it's used by phi nodes -debug: Not removing empty block block@2: // ternary_false_L59 because it's used by phi nodes debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__ @@ -1187,8 +1146,7 @@ debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.set_data using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default using strategy RootOperandGrouping -debug: Coalescing ternary_result%1#2 with [ternary_result%1#3] -debug: Coalescing resulted in 3 replacement/s +debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.__init__ using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program using strategy RootOperandGrouping @@ -1262,14 +1220,12 @@ debug: Inserted get_data_or_assert_block@0.ops[4]: 'store exists#0 to l-stack (c debug: Replaced get_data_or_assert_block@0.ops[7]: 'load exists#0' with 'load exists#0 from l-stack (no copy)' debug: Inserted get_data_or_assert_block@0.ops[6]: 'store result#0 to l-stack (copy)' debug: Replaced get_data_or_assert_block@0.ops[10]: 'load result#0' with 'load result#0 from l-stack (no copy)' -debug: Inserted get_data_with_default_block@0.ops[4]: 'store awst_tmp%0.1#0 to l-stack (copy)' -debug: Replaced get_data_with_default_block@0.ops[7]: 'load awst_tmp%0.1#0' with 'load awst_tmp%0.1#0 from l-stack (no copy)' -debug: Found 2 edge set/s for examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default -debug: Allocated 1 variable/s to x-stack: ternary_result%1#2 -debug: shared x-stack for get_data_with_default_ternary_true@1 -> get_data_with_default_ternary_merge@3: ternary_result%1#2 -debug: shared x-stack for get_data_with_default_ternary_false@2 -> get_data_with_default_ternary_merge@3: ternary_result%1#2 -debug: examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default f-stack entry: [] -debug: examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default f-stack on first store: ['awst_tmp%0.0#0'] +debug: Inserted get_data_with_default_block@0.ops[10]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced get_data_with_default_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted get_data_with_default_block@0.ops[5]: 'store local_get_ex%0#0 to l-stack (copy)' +debug: Replaced get_data_with_default_block@0.ops[8]: 'load local_get_ex%0#0' with 'load local_get_ex%0#0 from l-stack (no copy)' +debug: Inserted get_data_with_default_block@0.ops[4]: 'store local_get_ex%1#0 to l-stack (copy)' +debug: Replaced get_data_with_default_block@0.ops[10]: 'load local_get_ex%1#0' with 'load local_get_ex%1#0 from l-stack (no copy)' info: Writing local_state/out/LocalStateContract.approval.teal info: Writing local_state/out/LocalStateContract.clear.teal info: Writing local_state/out/LocalStateWithOffsets.approval.teal diff --git a/examples/sizes.txt b/examples/sizes.txt index 60d5a66767..b1d19ad36a 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -40,8 +40,8 @@ inner_transactions/itxn_loop 203 260 260 intrinsics/ImmediateVariants 164 162 162 koopman 16 9 9 less_simple 171 148 148 -local_state/LocalState 321 316 304 -local_state/LocalStateWithOffsets 334 327 315 +local_state/LocalState 317 312 300 +local_state/LocalStateWithOffsets 330 323 311 log 172 164 164 match 490 455 455 nested_loops/Nested 243 201 201 diff --git a/examples/voting/out/VotingRoundApp.approval.mir b/examples/voting/out/VotingRoundApp.approval.mir index 8bda88f66f..b1f11e1ba7 100644 --- a/examples/voting/out/VotingRoundApp.approval.mir +++ b/examples/voting/out/VotingRoundApp.approval.mir @@ -336,7 +336,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.is_bootstrapped voting/voting.py:81 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:81 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:81 - assert // check value exists // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0 self.is_bootstrapped voting/voting.py:81 + assert // check is_bootstrapped exists // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0 self.is_bootstrapped voting/voting.py:81 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0 not self.is_bootstrapped voting/voting.py:81 ! // (𝕡) fund_min_bal_req#0 | {!} not self.is_bootstrapped voting/voting.py:81 // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%2#0 not self.is_bootstrapped voting/voting.py:81 @@ -362,7 +362,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.total_options voting/voting.py:88 // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.total_options voting/voting.py:88 // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.total_options voting/voting.py:88 - assert // check value exists // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0 self.total_options voting/voting.py:88 + assert // check total_options exists // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0 self.total_options voting/voting.py:88 // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0 tally_box_size = self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 int 8 // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0,8 VOTE_COUNT_BYTES voting/voting.py:88 * // (𝕡) fund_min_bal_req#0 | {*} self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 @@ -413,9 +413,9 @@ close_block@0: int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0 not self.close_time voting/voting.py:110 byte "close_time" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0,"close_time" not self.close_time voting/voting.py:110 app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.close_time voting/voting.py:110 - swap // store tmp%1#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%1#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:110 - pop // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%1#0 not self.close_time voting/voting.py:110 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%1#0 not self.close_time voting/voting.py:110 + swap // store close_time_exists%1#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:110 + pop // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0 not self.close_time voting/voting.py:110 + // virtual: load close_time_exists%1#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0 not self.close_time voting/voting.py:110 ! // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {!} not self.close_time voting/voting.py:110 // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%2#0 not self.close_time voting/voting.py:110 // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%2#0 assert not self.close_time, "Already closed" voting/voting.py:110 @@ -431,7 +431,7 @@ close_block@0: // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:116 // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.vote_id voting/voting.py:116 // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.vote_id voting/voting.py:116 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0 self.vote_id voting/voting.py:116 + assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0 self.vote_id voting/voting.py:116 byte "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0,"{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID ' voting/voting.py:114-115 swap // load app_global_get_ex_value%4#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID ",app_global_get_ex_value%4#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 @@ -446,7 +446,7 @@ close_block@0: // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.metadata_ipfs_cid voting/voting.py:118 // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.metadata_ipfs_cid voting/voting.py:118 // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.metadata_ipfs_cid voting/voting.py:118 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0 self.metadata_ipfs_cid voting/voting.py:118 + assert // check metadata_ipfs_cid exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0 self.metadata_ipfs_cid voting/voting.py:118 // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%8#0,tmp%7#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 // virtual: load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 @@ -461,7 +461,7 @@ close_block@0: // virtual: store app_global_get_ex_did_exist%13#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_did_exist%13#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:120 // virtual: store app_global_get_ex_value%12#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.vote_id voting/voting.py:120 // virtual: load app_global_get_ex_did_exist%13#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.vote_id voting/voting.py:120 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0 self.vote_id voting/voting.py:120 + assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0 self.vote_id voting/voting.py:120 // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%12#0,tmp%11#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 // virtual: load app_global_get_ex_value%12#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 @@ -476,7 +476,7 @@ close_block@0: // virtual: store app_global_get_ex_did_exist%17#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_did_exist%17#0,{app_global_get_ex}.0 self.quorum voting/voting.py:122 // virtual: store app_global_get_ex_value%16#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.quorum voting/voting.py:122 // virtual: load app_global_get_ex_did_exist%17#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.quorum voting/voting.py:122 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0 self.quorum voting/voting.py:122 + assert // check quorum exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0 self.quorum voting/voting.py:122 // virtual: load app_global_get_ex_value%16#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0 itoa(self.quorum) voting/voting.py:122 callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,{itoa} itoa(self.quorum) voting/voting.py:122 // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,tmp%18#0 itoa(self.quorum) voting/voting.py:122 @@ -494,7 +494,7 @@ close_block@0: // virtual: store app_global_get_ex_did_exist%22#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_did_exist%22#0,{app_global_get_ex}.0 self.voter_count voting/voting.py:124 // virtual: store app_global_get_ex_value%21#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0,app_global_get_ex_did_exist%22#0 self.voter_count voting/voting.py:124 // virtual: load app_global_get_ex_did_exist%22#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0,app_global_get_ex_did_exist%22#0 self.voter_count voting/voting.py:124 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0 self.voter_count voting/voting.py:124 + assert // check voter_count exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0 self.voter_count voting/voting.py:124 // virtual: load app_global_get_ex_value%21#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0 itoa(self.voter_count) voting/voting.py:124 callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,{itoa} itoa(self.voter_count) voting/voting.py:124 // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,tmp%23#0 itoa(self.voter_count) voting/voting.py:124 @@ -514,7 +514,7 @@ close_block@0: // virtual: store app_global_get_ex_did_exist%26#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_did_exist%26#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:129 // virtual: store app_global_get_ex_value%25#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:129 // virtual: load app_global_get_ex_did_exist%26#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:129 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0 self.option_counts voting/voting.py:129 + assert // check option_counts exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0 self.option_counts voting/voting.py:129 dup // load app_global_get_ex_value%25#0 from l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_value%25#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_value%25#0,0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 extract_uint16 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,{extract_uint16} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 @@ -687,7 +687,7 @@ close_after_for@15: // virtual: store app_global_get_ex_did_exist%42#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_did_exist%42#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:148 // virtual: store app_global_get_ex_value%41#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0,app_global_get_ex_did_exist%42#0 self.vote_id voting/voting.py:148 // virtual: load app_global_get_ex_did_exist%42#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0,app_global_get_ex_did_exist%42#0 self.vote_id voting/voting.py:148 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0 self.vote_id voting/voting.py:148 + assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0 self.vote_id voting/voting.py:148 byte "[VOTE RESULT] " // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0,"[VOTE RESULT] " b"[VOTE RESULT] " voting/voting.py:148 swap // load app_global_get_ex_value%41#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"[VOTE RESULT] ",app_global_get_ex_value%41#0 b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{concat} b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 @@ -698,7 +698,7 @@ close_after_for@15: // virtual: store app_global_get_ex_did_exist%44#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_did_exist%44#0,{app_global_get_ex}.0 self.nft_image_url voting/voting.py:150 // virtual: store app_global_get_ex_value%43#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0,app_global_get_ex_did_exist%44#0 self.nft_image_url voting/voting.py:150 // virtual: load app_global_get_ex_did_exist%44#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0,app_global_get_ex_did_exist%44#0 self.nft_image_url voting/voting.py:150 - assert // check value exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0 self.nft_image_url voting/voting.py:150 + assert // check nft_image_url exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0 self.nft_image_url voting/voting.py:150 // virtual: load app_global_get_ex_value%43#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0 itxn_field ConfigAssetURL // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 byte "VOTERSLT" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,"VOTERSLT" b"VOTERSLT" voting/voting.py:149 @@ -941,7 +941,7 @@ voting_open_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.is_bootstrapped voting/voting.py:205 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:205 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:205 - assert // check value exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0 self.is_bootstrapped voting/voting.py:205 + assert // check is_bootstrapped exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0 self.is_bootstrapped voting/voting.py:205 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0 self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 bz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 // Implicit fall through to voting_open_and_contd@1 // (𝕗) awst_tmp%6#0 | self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 @@ -950,9 +950,9 @@ voting_open_and_contd@1: int 0 // (𝕗) awst_tmp%6#0 | 0 not self.close_time voting/voting.py:206 byte "close_time" // (𝕗) awst_tmp%6#0 | 0,"close_time" not self.close_time voting/voting.py:206 app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.close_time voting/voting.py:206 - swap // store tmp%3#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%3#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:206 - pop // (𝕗) awst_tmp%6#0 | tmp%3#0 not self.close_time voting/voting.py:206 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%3#0 not self.close_time voting/voting.py:206 + swap // store close_time_exists%3#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | close_time_exists%3#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:206 + pop // (𝕗) awst_tmp%6#0 | close_time_exists%3#0 not self.close_time voting/voting.py:206 + // virtual: load close_time_exists%3#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | close_time_exists%3#0 not self.close_time voting/voting.py:206 bnz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | not self.close_time voting/voting.py:206 // Implicit fall through to voting_open_and_contd@2 // (𝕗) awst_tmp%6#0 | not self.close_time voting/voting.py:206 @@ -963,7 +963,7 @@ voting_open_and_contd@2: // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.start_time voting/voting.py:207 // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.start_time voting/voting.py:207 // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.start_time voting/voting.py:207 - assert // check value exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0 self.start_time voting/voting.py:207 + assert // check start_time exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0 self.start_time voting/voting.py:207 global LatestTimestamp // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,{global} Global.latest_timestamp voting/voting.py:207 dup // store awst_tmp%6#0 to l-stack (copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,awst_tmp%6#0,awst_tmp%6#0 Global.latest_timestamp voting/voting.py:207 frame_bury 0 // store awst_tmp%6#0 to f-stack (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,awst_tmp%6#0 Global.latest_timestamp voting/voting.py:207 @@ -982,7 +982,7 @@ voting_open_and_contd@3: // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.end_time voting/voting.py:207 // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.end_time voting/voting.py:207 // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.end_time voting/voting.py:207 - assert // check value exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0 self.end_time voting/voting.py:207 + assert // check end_time exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0 self.end_time voting/voting.py:207 frame_dig 0 // load awst_tmp%6#0 from f-stack (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0,awst_tmp%6#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 swap // load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | awst_tmp%6#0,app_global_get_ex_value%8#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 <= // (𝕗) awst_tmp%6#0 | {<=} Global.latest_timestamp <= self.end_time voting/voting.py:207 @@ -1023,7 +1023,7 @@ allowed_to_vote_block@0: // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.snapshot_public_key voting/voting.py:234 // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.snapshot_public_key voting/voting.py:234 // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.snapshot_public_key voting/voting.py:234 - assert // check value exists // (𝕡) signature#0 | tmp%0#0,app_global_get_ex_value%1#0 self.snapshot_public_key voting/voting.py:234 + assert // check snapshot_public_key exists // (𝕡) signature#0 | tmp%0#0,app_global_get_ex_value%1#0 self.snapshot_public_key voting/voting.py:234 swap // load tmp%0#0 from l-stack (no copy) (𝕡) signature#0 | app_global_get_ex_value%1#0,tmp%0#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 frame_dig -1 // load signature#0 from parameters (𝕡) signature#0 | app_global_get_ex_value%1#0,tmp%0#0,signature#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 uncover 2 // load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0,signature#0,app_global_get_ex_value%1#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 @@ -1078,7 +1078,7 @@ vote_block@0: // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:178 // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.option_counts voting/voting.py:178 // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.option_counts voting/voting.py:178 - assert // check value exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0 self.option_counts voting/voting.py:178 + assert // check option_counts exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0 self.option_counts voting/voting.py:178 // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0 questions_count = self.option_counts.length voting/voting.py:178 int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0,0 self.option_counts.length voting/voting.py:178 extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {extract_uint16} self.option_counts.length voting/voting.py:178 @@ -1174,7 +1174,7 @@ vote_for_body@2: // virtual: store app_global_get_ex_did_exist%26#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_did_exist%26#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:195 // virtual: store app_global_get_ex_value%25#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:195 // virtual: load app_global_get_ex_did_exist%26#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:195 - assert // check value exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0 self.option_counts voting/voting.py:195 + assert // check option_counts exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0 self.option_counts voting/voting.py:195 dup // load app_global_get_ex_value%25#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_value%25#0 self.option_counts[question_index] voting/voting.py:195 int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_value%25#0,0 self.option_counts[question_index] voting/voting.py:195 extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,{extract_uint16} self.option_counts[question_index] voting/voting.py:195 @@ -1224,7 +1224,7 @@ vote_for_body@2: // virtual: store app_global_get_ex_did_exist%36#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_did_exist%36#0,{app_global_get_ex}.0 self.voter_count voting/voting.py:200 // virtual: store app_global_get_ex_value%35#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.voter_count voting/voting.py:200 // virtual: load app_global_get_ex_did_exist%36#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.voter_count voting/voting.py:200 - assert // check value exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0 self.voter_count voting/voting.py:200 + assert // check voter_count exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0 self.voter_count voting/voting.py:200 // virtual: load app_global_get_ex_value%35#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0 self.voter_count += 1 voting/voting.py:200 int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0,1 1 voting/voting.py:200 + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{+} self.voter_count += 1 voting/voting.py:200 diff --git a/examples/voting/out/VotingRoundApp.approval.teal b/examples/voting/out/VotingRoundApp.approval.teal index 14b78b9129..dafa2d83e4 100644 --- a/examples/voting/out/VotingRoundApp.approval.teal +++ b/examples/voting/out/VotingRoundApp.approval.teal @@ -290,7 +290,7 @@ bootstrap: int 0 byte "is_bootstrapped" app_global_get_ex - assert // check value exists + assert // check is_bootstrapped exists ! assert // Must not be already bootstrapped // voting/voting.py:82 @@ -314,7 +314,7 @@ bootstrap: int 0 byte "total_options" app_global_get_ex - assert // check value exists + assert // check total_options exists int 8 * // voting/voting.py:98-99 @@ -402,7 +402,7 @@ close: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists // voting/voting.py:114-115 // b'{"standard":"arc69",' // b'"description":"This is a voting result NFT for voting round with ID ' @@ -427,7 +427,7 @@ close: int 0 byte "metadata_ipfs_cid" app_global_get_ex - assert // check value exists + assert // check metadata_ipfs_cid exists // voting/voting.py:114-118 // b'{"standard":"arc69",' // b'"description":"This is a voting result NFT for voting round with ID ' @@ -451,7 +451,7 @@ close: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists // voting/voting.py:114-120 // b'{"standard":"arc69",' // b'"description":"This is a voting result NFT for voting round with ID ' @@ -479,7 +479,7 @@ close: int 0 byte "quorum" app_global_get_ex - assert // check value exists + assert // check quorum exists callsub itoa // voting/voting.py:114-122 // b'{"standard":"arc69",' @@ -512,7 +512,7 @@ close: int 0 byte "voter_count" app_global_get_ex - assert // check value exists + assert // check voter_count exists callsub itoa // voting/voting.py:114-124 // b'{"standard":"arc69",' @@ -552,7 +552,7 @@ close: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists dup int 0 extract_uint16 @@ -710,7 +710,7 @@ close_after_for@15: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists byte "[VOTE RESULT] " swap concat @@ -719,7 +719,7 @@ close_after_for@15: int 0 byte "nft_image_url" app_global_get_ex - assert // check value exists + assert // check nft_image_url exists itxn_field ConfigAssetURL // voting/voting.py:149 // unit_name=b"VOTERSLT", @@ -999,7 +999,7 @@ voting_open: int 0 byte "is_bootstrapped" app_global_get_ex - assert // check value exists + assert // check is_bootstrapped exists // voting/voting.py:205-207 // self.is_bootstrapped // and not self.close_time @@ -1017,7 +1017,7 @@ voting_open: int 0 byte "start_time" app_global_get_ex - assert // check value exists + assert // check start_time exists global LatestTimestamp dup frame_bury 0 @@ -1026,7 +1026,7 @@ voting_open: int 0 byte "end_time" app_global_get_ex - assert // check value exists + assert // check end_time exists frame_dig 0 >= bz voting_open_bool_false@5 @@ -1066,7 +1066,7 @@ allowed_to_vote: int 0 byte "snapshot_public_key" app_global_get_ex - assert // check value exists + assert // check snapshot_public_key exists // voting/voting.py:231-235 // return op.ed25519verify_bare( // Txn.sender.bytes, @@ -1131,7 +1131,7 @@ vote: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists int 0 extract_uint16 dup @@ -1219,7 +1219,7 @@ vote_for_header@1: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists dup int 0 extract_uint16 @@ -1258,7 +1258,7 @@ vote_for_header@1: int 0 byte "voter_count" app_global_get_ex - assert // check value exists + assert // check voter_count exists int 1 + byte "voter_count" diff --git a/examples/voting/out/VotingRoundApp.arc32.json b/examples/voting/out/VotingRoundApp.arc32.json index 651a892570..e004461c7f 100644 --- a/examples/voting/out/VotingRoundApp.arc32.json +++ b/examples/voting/out/VotingRoundApp.arc32.json @@ -51,7 +51,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDgKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICBtZXRob2QgImNyZWF0ZShzdHJpbmcsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDY0LHVpbnQ4W10sdWludDY0LHN0cmluZyl2b2lkIgogICAgbWV0aG9kICJib290c3RyYXAocGF5KXZvaWQiCiAgICBtZXRob2QgImNsb3NlKCl2b2lkIgogICAgbWV0aG9kICJnZXRfcHJlY29uZGl0aW9ucyhieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBtZXRob2QgInZvdGUocGF5LGJ5dGVbXSx1aW50OFtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZV9yb3V0ZUAzIG1haW5fYm9vdHN0cmFwX3JvdXRlQDQgbWFpbl9jbG9zZV9yb3V0ZUA1IG1haW5fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANiBtYWluX3ZvdGVfcm91dGVANwogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl9jcmVhdGVfcm91dGVAMzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPVRydWUpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9ib290c3RyYXBfcm91dGVANDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBjbG9zZQogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3ByZWNvbmRpdGlvbnMKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdm90ZV9yb3V0ZUA3OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdm90ZQogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY3JlYXRlKHZvdGVfaWQ6IGJ5dGVzLCBzbmFwc2hvdF9wdWJsaWNfa2V5OiBieXRlcywgbWV0YWRhdGFfaXBmc19jaWQ6IGJ5dGVzLCBzdGFydF90aW1lOiB1aW50NjQsIGVuZF90aW1lOiB1aW50NjQsIG9wdGlvbl9jb3VudHM6IGJ5dGVzLCBxdW9ydW06IHVpbnQ2NCwgbmZ0X2ltYWdlX3VybDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTUtNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9VHJ1ZSkKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB2b3RlX2lkOiBhcmM0LlN0cmluZywKICAgIC8vICAgICBzbmFwc2hvdF9wdWJsaWNfa2V5OiBCeXRlcywKICAgIC8vICAgICBtZXRhZGF0YV9pcGZzX2NpZDogYXJjNC5TdHJpbmcsCiAgICAvLyAgICAgc3RhcnRfdGltZTogVUludDY0LAogICAgLy8gICAgIGVuZF90aW1lOiBVSW50NjQsCiAgICAvLyAgICAgb3B0aW9uX2NvdW50czogVm90ZUluZGV4QXJyYXksCiAgICAvLyAgICAgcXVvcnVtOiBVSW50NjQsCiAgICAvLyAgICAgbmZ0X2ltYWdlX3VybDogYXJjNC5TdHJpbmcsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA4IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NjcKICAgIC8vIGFzc2VydCBzdGFydF90aW1lIDwgZW5kX3RpbWUsICJFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZSIKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICA8CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGFmdGVyIHN0YXJ0IHRpbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NjgKICAgIC8vIGFzc2VydCBlbmRfdGltZSA+PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgIkVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlIgogICAgZnJhbWVfZGlnIC00CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYXNzZXJ0IC8vIEVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjcwCiAgICAvLyBzZWxmLnZvdGVfaWQgPSB2b3RlX2lkLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTgKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlICJ2b3RlX2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzEKICAgIC8vIHNlbGYuc25hcHNob3RfcHVibGljX2tleSA9IHNuYXBzaG90X3B1YmxpY19rZXkKICAgIGJ5dGUgInNuYXBzaG90X3B1YmxpY19rZXkiCiAgICBmcmFtZV9kaWcgLTcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjcyCiAgICAvLyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkID0gbWV0YWRhdGFfaXBmc19jaWQuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtNgogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIm1ldGFkYXRhX2lwZnNfY2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzMKICAgIC8vIHNlbGYuc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWUKICAgIGJ5dGUgInN0YXJ0X3RpbWUiCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc0CiAgICAvLyBzZWxmLmVuZF90aW1lID0gZW5kX3RpbWUKICAgIGJ5dGUgImVuZF90aW1lIgogICAgZnJhbWVfZGlnIC00CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NQogICAgLy8gc2VsZi5xdW9ydW0gPSBxdW9ydW0KICAgIGJ5dGUgInF1b3J1bSIKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzYKICAgIC8vIHNlbGYubmZ0X2ltYWdlX3VybCA9IG5mdF9pbWFnZV91cmwuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIm5mdF9pbWFnZV91cmwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NwogICAgLy8gc2VsZi5zdG9yZV9vcHRpb25fY291bnRzKG9wdGlvbl9jb3VudHMuY29weSgpKQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIHN0b3JlX29wdGlvbl9jb3VudHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzOiBieXRlcykgLT4gdm9pZDoKc3RvcmVfb3B0aW9uX2NvdW50czoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjE1LTIxNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBzdG9yZV9vcHRpb25fY291bnRzKHNlbGYsIG9wdGlvbl9jb3VudHM6IFZvdGVJbmRleEFycmF5KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNwogICAgLy8gYXNzZXJ0IG9wdGlvbl9jb3VudHMubGVuZ3RoLCAib3B0aW9uX2NvdW50cyBzaG91bGQgYmUgbm9uLWVtcHR5IgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cG4gMgogICAgYXNzZXJ0IC8vIG9wdGlvbl9jb3VudHMgc2hvdWxkIGJlIG5vbi1lbXB0eQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTgKICAgIC8vIGFzc2VydCBvcHRpb25fY291bnRzLmxlbmd0aCA8PSAxMTIsICJDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMTIgcXVlc3Rpb25zIgogICAgaW50IDExMgogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMTIgcXVlc3Rpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMAogICAgLy8gdG90YWxfb3B0aW9ucyA9IFVJbnQ2NCgwKQogICAgaW50IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjIxCiAgICAvLyBmb3IgaXRlbSBpbiBvcHRpb25fY291bnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgaW50IDAKCnN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjEKICAgIC8vIGZvciBpdGVtIGluIG9wdGlvbl9jb3VudHM6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnQgMQogICAgZXh0cmFjdDMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjIyCiAgICAvLyB0b3RhbF9vcHRpb25zICs9IGl0ZW0uZGVjb2RlKCkKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGludCAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDEKCnN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMwogICAgLy8gYXNzZXJ0IHRvdGFsX29wdGlvbnMgPD0gMTI4LCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucyIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludCAxMjgKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjUKICAgIC8vIHNlbGYub3B0aW9uX2NvdW50cyA9IG9wdGlvbl9jb3VudHMuY29weSgpCiAgICBieXRlICJvcHRpb25fY291bnRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjYKICAgIC8vIHNlbGYudG90YWxfb3B0aW9ucyA9IHRvdGFsX29wdGlvbnMKICAgIGJ5dGUgInRvdGFsX29wdGlvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5ib290c3RyYXAoZnVuZF9taW5fYmFsX3JlcTogdWludDY0KSAtPiB2b2lkOgpib290c3RyYXA6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZiwgZnVuZF9taW5fYmFsX3JlcTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODEKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5pc19ib290c3RyYXBwZWQsICJNdXN0IG5vdCBiZSBhbHJlYWR5IGJvb3RzdHJhcHBlZCIKICAgIGludCAwCiAgICBieXRlICJpc19ib290c3RyYXBwZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIE11c3Qgbm90IGJlIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IFRydWUKICAgIGJ5dGUgImlzX2Jvb3RzdHJhcHBlZCIKICAgIGludCAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NQogICAgLy8gZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODQtODYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4OAogICAgLy8gdGFsbHlfYm94X3NpemUgPSBzZWxmLnRvdGFsX29wdGlvbnMgKiBWT1RFX0NPVU5UX0JZVEVTCiAgICBpbnQgMAogICAgYnl0ZSAidG90YWxfb3B0aW9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBpbnQgOAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5OC05OQogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICBkdXAKICAgIGludCA0MDAKICAgICoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6OTAtOTcKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIGludCAyMDM5MDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6OTAtOTkKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IHZhbHVlCiAgICAvLyArICh0YWxseV9ib3hfc2l6ZSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDEKICAgIC8vIGxvZyhtaW5fYmFsYW5jZV9yZXEpCiAgICBkdXAKICAgIGl0b2IKICAgIGxvZwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDMKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxhbmNlX3JlcQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwMi0xMDQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA1CiAgICAvLyBhc3NlcnQgb3AuQm94LmNyZWF0ZShUQUxMWV9CT1hfS0VZLCB0YWxseV9ib3hfc2l6ZSkKICAgIGJ5dGUgIlYiCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY2xvc2UoKSAtPiB2b2lkOgpjbG9zZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA3LTEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50IDAKICAgIGR1cAogICAgYnl0ZSAiIgogICAgZHVwbiAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwOQogICAgLy8gZW5zdXJlX2J1ZGdldCgyMDAwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgaW50IDIwMDAwCiAgICBpbnQgMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNsb3NlX3RpbWUsICJBbHJlYWR5IGNsb3NlZCIKICAgIGludCAwCiAgICBieXRlICJjbG9zZV90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgY2xvc2VkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMQogICAgLy8gc2VsZi5jbG9zZV90aW1lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGJ5dGUgImNsb3NlX3RpbWUiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTYKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICBpbnQgMAogICAgYnl0ZSAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNC0xMTUKICAgIC8vIGIneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyBiJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgYnl0ZSAie1wic3RhbmRhcmRcIjpcImFyYzY5XCIsXCJkZXNjcmlwdGlvblwiOlwiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNC0xMTYKICAgIC8vIGIneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyBiJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTcKICAgIC8vICsgYicuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICBieXRlICIuXCIsXCJwcm9wZXJ0aWVzXCI6e1wibWV0YWRhdGFcIjpcImlwZnM6Ly8iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNC0xMTcKICAgIC8vIGIneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyBiJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYicuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE4CiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGludCAwCiAgICBieXRlICJtZXRhZGF0YV9pcGZzX2NpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNC0xMTgKICAgIC8vIGIneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyBiJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYicuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTkKICAgIC8vICsgYiciLCJpZCI6IicKICAgIGJ5dGUgIlwiLFwiaWRcIjpcIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTExOQogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyBiJyIsImlkIjoiJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMAogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGludCAwCiAgICBieXRlICJ2b3RlX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTEyMAogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyBiJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjEKICAgIC8vICsgYiciLCJxdW9ydW0iOicKICAgIGJ5dGUgIlwiLFwicXVvcnVtXCI6IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQtMTIxCiAgICAvLyBiJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gYiciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArIGInLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArIGInIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJyIsInF1b3J1bSI6JwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMgogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgaW50IDAKICAgIGJ5dGUgInF1b3J1bSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTEyMgogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyBiJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYiciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjMKICAgIC8vICsgYicsInZvdGVyQ291bnQiOicKICAgIGJ5dGUgIixcInZvdGVyQ291bnRcIjoiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNC0xMjMKICAgIC8vIGIneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyBiJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYicuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgYiciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArIGInIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArIGInLCJ2b3RlckNvdW50IjonCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI0CiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIGludCAwCiAgICBieXRlICJ2b3Rlcl9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTEyNAogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyBiJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYiciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIC8vICsgYicsInZvdGVyQ291bnQiOicKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyNQogICAgLy8gKyBiJywidGFsbGllcyI6WycKICAgIGJ5dGUgIixcInRhbGxpZXNcIjpbIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQtMTI1CiAgICAvLyBiJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gYiciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArIGInLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArIGInIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyBiJywidm90ZXJDb3VudCI6JwogICAgLy8gKyBpdG9hKHNlbGYudm90ZXJfY291bnQpCiAgICAvLyArIGInLCJ0YWxsaWVzIjpbJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyOAogICAgLy8gY3VycmVudF9pbmRleCA9IFVJbnQ2NCgwKQogICAgaW50IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI5CiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnNfYXJjIGluIHVlbnVtZXJhdGUoc2VsZi5vcHRpb25fY291bnRzKToKICAgIGludCAwCiAgICBieXRlICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGR1cAogICAgaW50IDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50IDAKCmNsb3NlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI5CiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnNfYXJjIGluIHVlbnVtZXJhdGUoc2VsZi5vcHRpb25fY291bnRzKToKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9kaWcgNwogICAgPAogICAgYnogY2xvc2VfYWZ0ZXJfZm9yQDE1CiAgICBmcmFtZV9kaWcgOAogICAgZnJhbWVfZGlnIDkKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50IDEKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMwCiAgICAvLyBpZiBxdWVzdGlvbl9pbmRleCA+IDA6CiAgICBpbnQgMAogICAgPgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2J1cnkgMAogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMQogICAgLy8gbm90ZSArPSBiIiwiCiAgICBmcmFtZV9kaWcgNQogICAgYnl0ZSAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBxdWVzdGlvbl9vcHRpb25zID0gcXVlc3Rpb25fb3B0aW9uc19hcmMuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAxCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzMKICAgIC8vIGlmIHF1ZXN0aW9uX29wdGlvbnMgPiAwOgogICAgaW50IDAKICAgID4KICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzQKICAgIC8vIG5vdGUgKz0gYiJbIgogICAgZnJhbWVfZGlnIDUKICAgIGJ5dGUgIlsiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzUKICAgIC8vIGZvciBvcHRpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uX29wdGlvbnMpOgogICAgaW50IDAKICAgIGZyYW1lX2J1cnkgMwoKY2xvc2VfZm9yX2hlYWRlckA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzUKICAgIC8vIGZvciBvcHRpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uX29wdGlvbnMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM2CiAgICAvLyBpZiBvcHRpb25faW5kZXggPiAwOgogICAgZnJhbWVfZGlnIDMKICAgIGludCAwCiAgICA+CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM3CiAgICAvLyBub3RlICs9IGIiLCIKICAgIGZyYW1lX2RpZyA1CiAgICBieXRlICIsIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKCmNsb3NlX2FmdGVyX2lmX2Vsc2VAOToKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzOAogICAgLy8gdm90ZXNfZm9yX29wdGlvbiA9IGdldF92b3RlX2Zyb21fYm94KGN1cnJlbnRfaW5kZXgpCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzOQogICAgLy8gbm90ZSArPSBpdG9hKHZvdGVzX2Zvcl9vcHRpb24pCiAgICBjYWxsc3ViIGl0b2EKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MAogICAgLy8gY3VycmVudF9pbmRleCArPSAxCiAgICBpbnQgMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNQogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucyk6CiAgICBmcmFtZV9kaWcgMwogICAgaW50IDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBjbG9zZV9mb3JfaGVhZGVyQDYKCmNsb3NlX2FmdGVyX2ZvckAxMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQxCiAgICAvLyBub3RlICs9IGIiXSIKICAgIGZyYW1lX2RpZyA1CiAgICBieXRlICJdIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDAKCmNsb3NlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSA2CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSA1CiAgICBmcmFtZV9kaWcgOQogICAgaW50IDEKICAgICsKICAgIGZyYW1lX2J1cnkgOQogICAgYiBjbG9zZV9mb3JfaGVhZGVyQDEKCmNsb3NlX2FmdGVyX2ZvckAxNToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQyCiAgICAvLyBub3RlICs9IGIiXX19IgogICAgZnJhbWVfZGlnIDUKICAgIGJ5dGUgIl19fSIKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDQtMTUzCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICBhc3NldF9uYW1lPWIiW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT1iIlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDgKICAgIC8vIGFzc2V0X25hbWU9YiJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICBpbnQgMAogICAgYnl0ZSAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBieXRlICJbVk9URSBSRVNVTFRdICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTAKICAgIC8vIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICBpbnQgMAogICAgYnl0ZSAibmZ0X2ltYWdlX3VybCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0OQogICAgLy8gdW5pdF9uYW1lPWIiVk9URVJTTFQiLAogICAgYnl0ZSAiVk9URVJTTFQiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ0CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgaW50IGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ1CiAgICAvLyB0b3RhbD0xLAogICAgaW50IDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgc3dhcAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NwogICAgLy8gZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2CiAgICAvLyBkZWNpbWFscz0wLAogICAgaW50IDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ0LTE1MwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9YiJWT1RFUlNMVCIsCiAgICAvLyAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICBub3RlPW5vdGUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MwogICAgLy8gc2VsZi5uZnRfYXNzZXRfaWQgPSAoCiAgICBieXRlICJuZnRfYXNzZXRfaWQiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NC0xNTMKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiVk9URVJTTFQiLAogICAgLy8gICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgbm90ZT1ub3RlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0My0xNTUKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIHRvdGFsPTEsCiAgICAvLyAgICAgICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgICAgICBhc3NldF9uYW1lPWIiW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgICAgICB1bml0X25hbWU9YiJWT1RFUlNMVCIsCiAgICAvLyAgICAgICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXNzZXQuYXNzZXRfaWQKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBwdXlhcHkuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgLy8gPHB1eWE+L3B1eWFweS5weToxMS0xNwogICAgcHJvdG8gMiAwCiAgICAvLyA8cHV5YT4vcHV5YXB5LnB5OjE4CiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAxMAogICAgKwoKZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMToKICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MTkKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBlbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDcKICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MjAKICAgIGl0eG5fYmVnaW4KICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MjEKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyA8cHV5YT4vcHV5YXB5LnB5OjIyCiAgICBpbnQgRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyA8cHV5YT4vcHV5YXB5LnB5OjIzCiAgICBieXRlIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gPHB1eWE+L3B1eWFweS5weToyNAogICAgYnl0ZSAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gPHB1eWE+L3B1eWFweS5weToyNS0yOQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgLy8gPHB1eWE+L3B1eWFweS5weToyNwogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MjkKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MzAKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuaXRvYShpOiB1aW50NjQpIC0+IGJ5dGVzOgppdG9hOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMtMjU0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTcKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50IDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAxCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGUgIjAxMjM0NTY3ODkiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1OAogICAgLy8gcmV0dXJuIGRpZ2l0c1tpXQogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHJldHN1YgoKaXRvYV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NgogICAgLy8gcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBpbnQgMTAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU5CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIGRpZ2l0c1tpICUgcmFkaXhdCiAgICAvCiAgICBjYWxsc3ViIGl0b2EKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50IDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgJQogICAgZHVwCiAgICBpbnQgMQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIGRpZ2l0cyA9IEJ5dGVzKGIiMDEyMzQ1Njc4OSIpCiAgICBieXRlICIwMTIzNDU2Nzg5IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5nZXRfdm90ZV9mcm9tX2JveChpbmRleDogdWludDY0KSAtPiB1aW50NjQ6CmdldF92b3RlX2Zyb21fYm94OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzgtMjM5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF92b3RlX2Zyb21fYm94KGluZGV4OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDAKICAgIC8vIGJveF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KFRBTExZX0JPWF9LRVkpCiAgICBieXRlICJWIgogICAgYm94X2dldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDEKICAgIC8vIGFzc2VydCBleGlzdHMsICJCb3ggbm90IGNyZWF0ZWQiCiAgICBhc3NlcnQgLy8gQm94IG5vdCBjcmVhdGVkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0MgogICAgLy8gcmV0dXJuIG9wLmJ0b2kob3AuZXh0cmFjdChib3hfZGF0YSwgaW5kZXgsIFZPVEVfQ09VTlRfQllURVMpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgOAogICAgZXh0cmFjdDMKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ByZWNvbmRpdGlvbnMoc2lnbmF0dXJlOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wcmVjb25kaXRpb25zOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTctMTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfcHJlY29uZGl0aW9ucyhzZWxmLCBzaWduYXR1cmU6IGFyYzQuRHluYW1pY0J5dGVzKSAtPiBWb3RpbmdQcmVjb25kaXRpb25zOgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MAogICAgLy8gaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYxCiAgICAvLyBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlLmJ5dGVzWzI6XSkpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGR1cAogICAgaW50IDIKICAgID4KICAgIGJ6IGdldF9wcmVjb25kaXRpb25zX3Rlcm5hcnlfZmFsc2VAMgogICAgaW50IDIKICAgIGIgZ2V0X3ByZWNvbmRpdGlvbnNfdGVybmFyeV9tZXJnZUAzCgpnZXRfcHJlY29uZGl0aW9uc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICBmcmFtZV9kaWcgMQoKZ2V0X3ByZWNvbmRpdGlvbnNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjEKICAgIC8vIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUuYnl0ZXNbMjpdKSksCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAxCiAgICBzdWJzdHJpbmczCiAgICBjYWxsc3ViIGFsbG93ZWRfdG9fdm90ZQogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjIKICAgIC8vIGhhc19hbHJlYWR5X3ZvdGVkPWFyYzQuVUludDY0KHNlbGYuYWxyZWFkeV92b3RlZCgpKSwKICAgIGNhbGxzdWIgYWxyZWFkeV92b3RlZAogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjMKICAgIC8vIGN1cnJlbnRfdGltZT1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1OS0xNjQKICAgIC8vIHJldHVybiBWb3RpbmdQcmVjb25kaXRpb25zKAogICAgLy8gICAgIGlzX3ZvdGluZ19vcGVuPWFyYzQuVUludDY0KHNlbGYudm90aW5nX29wZW4oKSksCiAgICAvLyAgICAgaXNfYWxsb3dlZF90b192b3RlPWFyYzQuVUludDY0KHNlbGYuYWxsb3dlZF90b192b3RlKHNpZ25hdHVyZS5ieXRlc1syOl0pKSwKICAgIC8vICAgICBoYXNfYWxyZWFkeV92b3RlZD1hcmM0LlVJbnQ2NChzZWxmLmFscmVhZHlfdm90ZWQoKSksCiAgICAvLyAgICAgY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGluZ19vcGVuKCkgLT4gdWludDY0Ogp2b3Rpbmdfb3BlbjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAyLTIwMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB2b3Rpbmdfb3BlbihzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICBieXRlICIiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNQogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQKICAgIGludCAwCiAgICBieXRlICJpc19ib290c3RyYXBwZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDUtMjA3CiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgLy8gYW5kIG5vdCBzZWxmLmNsb3NlX3RpbWUKICAgIC8vIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgYnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNgogICAgLy8gYW5kIG5vdCBzZWxmLmNsb3NlX3RpbWUKICAgIGludCAwCiAgICBieXRlICJjbG9zZV90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYm56IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDcKICAgIC8vIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgaW50IDAKICAgIGJ5dGUgInN0YXJ0X3RpbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIDw9CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludCAwCiAgICBieXRlICJlbmRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdmFsdWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgaW50IDEKICAgIGIgdm90aW5nX29wZW5fYm9vbF9tZXJnZUA2Cgp2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDU6CiAgICBpbnQgMAoKdm90aW5nX29wZW5fYm9vbF9tZXJnZUA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDQtMjA4CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICAvLyAgICAgYW5kIG5vdCBzZWxmLmNsb3NlX3RpbWUKICAgIC8vICAgICBhbmQgc2VsZi5zdGFydF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuZW5kX3RpbWUKICAgIC8vICkKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuYWxsb3dlZF90b192b3RlKHNpZ25hdHVyZTogYnl0ZXMpIC0+IHVpbnQ2NDoKYWxsb3dlZF90b192b3RlOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjgtMjI5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFsbG93ZWRfdG9fdm90ZShzZWxmLCBzaWduYXR1cmU6IEJ5dGVzKSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzMAogICAgLy8gZW5zdXJlX2J1ZGdldCgyMDAwKQogICAgaW50IDIwMDAKICAgIGludCAyCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMyCiAgICAvLyBUeG4uc2VuZGVyLmJ5dGVzLAogICAgdHhuIFNlbmRlcgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzQKICAgIC8vIHNlbGYuc25hcHNob3RfcHVibGljX2tleSwKICAgIGludCAwCiAgICBieXRlICJzbmFwc2hvdF9wdWJsaWNfa2V5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMxLTIzNQogICAgLy8gcmV0dXJuIG9wLmVkMjU1MTl2ZXJpZnlfYmFyZSgKICAgIC8vICAgICBUeG4uc2VuZGVyLmJ5dGVzLAogICAgLy8gICAgIHNpZ25hdHVyZSwKICAgIC8vICAgICBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGVkMjU1MTl2ZXJpZnlfYmFyZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbHJlYWR5X3ZvdGVkKCkgLT4gdWludDY0OgphbHJlYWR5X3ZvdGVkOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTAtMjExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFscmVhZHlfdm90ZWQoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTIKICAgIC8vICh2b3RlcywgZXhpc3RzKSA9IG9wLkJveC5nZXQoVHhuLnNlbmRlci5ieXRlcykKICAgIHR4biBTZW5kZXIKICAgIGJveF9nZXQKICAgIGJ1cnkgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTMKICAgIC8vIHJldHVybiBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90ZShmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQsIHNpZ25hdHVyZTogYnl0ZXMsIGFuc3dlcl9pZHM6IGJ5dGVzKSAtPiB2b2lkOgp2b3RlOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjYtMTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB2b3RlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgc2lnbmF0dXJlOiBCeXRlcywKICAgIC8vICAgICBhbnN3ZXJfaWRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNzMKICAgIC8vIGVuc3VyZV9idWRnZXQoNzcwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgaW50IDc3MDAKICAgIGludCAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc0LTE3NQogICAgLy8gIyBDaGVjayB2b3RpbmcgcHJlY29uZGl0aW9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsb3dlZF90b192b3RlKHNpZ25hdHVyZSksICJOb3QgYWxsb3dlZCB0byB2b3RlIgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFsbG93ZWRfdG9fdm90ZQogICAgYXNzZXJ0IC8vIE5vdCBhbGxvd2VkIHRvIHZvdGUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc2CiAgICAvLyBhc3NlcnQgc2VsZi52b3Rpbmdfb3BlbigpLCAiVm90aW5nIG5vdCBvcGVuIgogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgYXNzZXJ0IC8vIFZvdGluZyBub3Qgb3BlbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNzcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hbHJlYWR5X3ZvdGVkKCksICJBbHJlYWR5IHZvdGVkIgogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICAhCiAgICBhc3NlcnQgLy8gQWxyZWFkeSB2b3RlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNzgKICAgIC8vIHF1ZXN0aW9uc19jb3VudCA9IHNlbGYub3B0aW9uX2NvdW50cy5sZW5ndGgKICAgIGludCAwCiAgICBieXRlICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGludCAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3OQogICAgLy8gYXNzZXJ0IGFuc3dlcl9pZHMubGVuZ3RoID09IHF1ZXN0aW9uc19jb3VudCwgIk51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODIKICAgIC8vICgzMiArIDIgKyBWT1RFX0lOREVYX0JZVEVTICogYW5zd2VyX2lkcy5sZW5ndGgpICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIGludCAzNAogICAgKwogICAgaW50IDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODAtMTgxCiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICBpbnQgMjUwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODAtMTgzCiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICAvLyAgICAgKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODUKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4NC0xODYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODgKICAgIC8vIGxvZyhtaW5fYmFsX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4OQogICAgLy8gYXNzZXJ0IGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxfcmVxLCAiUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0aGUgZXhhY3QgbWluIGJhbGFuY2UKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkwLTE5MQogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUgZm9yIGVhY2ggcXVlc3Rpb24KICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ID0gVUludDY0KDApCiAgICBpbnQgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTIKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGludCAwCgp2b3RlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uc19jb3VudCk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHZvdGVfYWZ0ZXJfZm9yQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkzLTE5NAogICAgLy8gIyBMb2FkIHRoZSB1c2VyJ3Mgdm90ZSBmb3IgdGhpcyBxdWVzdGlvbgogICAgLy8gYW5zd2VyX29wdGlvbl9pbmRleCA9IGFuc3dlcl9pZHNbcXVlc3Rpb25faW5kZXhdLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50IDEKICAgIGV4dHJhY3QzCiAgICBidG9pCiAgICBzd2FwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gb3B0aW9uc19jb3VudCA9IHNlbGYub3B0aW9uX2NvdW50c1txdWVzdGlvbl9pbmRleF0uZGVjb2RlKCkKICAgIGludCAwCiAgICBieXRlICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGR1cAogICAgaW50IDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgPgogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludCAxCiAgICBleHRyYWN0MwogICAgYnRvaQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTYKICAgIC8vIGFzc2VydCBhbnN3ZXJfb3B0aW9uX2luZGV4IDwgb3B0aW9uc19jb3VudCwgIkFuc3dlciBvcHRpb24gaW5kZXggaW52YWxpZCIKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEFuc3dlciBvcHRpb24gaW5kZXggaW52YWxpZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTcKICAgIC8vIGluY3JlbWVudF92b3RlX2luX2JveChjdW11bGF0aXZlX29mZnNldCArIGFuc3dlcl9vcHRpb25faW5kZXgpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIGNhbGxzdWIgaW5jcmVtZW50X3ZvdGVfaW5fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5OAogICAgLy8gY3VtdWxhdGl2ZV9vZmZzZXQgKz0gb3B0aW9uc19jb3VudAogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5OQogICAgLy8gb3AuQm94LnB1dChUeG4uc2VuZGVyLmJ5dGVzLCBhbnN3ZXJfaWRzLmJ5dGVzKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCArPSAxCiAgICBpbnQgMAogICAgYnl0ZSAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgaW50IDEKICAgICsKICAgIGJ5dGUgInZvdGVyX2NvdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uc19jb3VudCk6CiAgICBpbnQgMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIHZvdGVfZm9yX2hlYWRlckAxCgp2b3RlX2FmdGVyX2ZvckA1OgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5pbmNyZW1lbnRfdm90ZV9pbl9ib3goaW5kZXg6IHVpbnQ2NCkgLT4gdm9pZDoKaW5jcmVtZW50X3ZvdGVfaW5fYm94OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDUtMjQ2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGluY3JlbWVudF92b3RlX2luX2JveChpbmRleDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0NwogICAgLy8gYm94X2RhdGEsIGV4aXN0cyA9IG9wLkJveC5nZXQoVEFMTFlfQk9YX0tFWSkKICAgIGJ5dGUgIlYiCiAgICBib3hfZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0OAogICAgLy8gYXNzZXJ0IGV4aXN0cywgIkJveCBub3QgY3JlYXRlZCIKICAgIGFzc2VydCAvLyBCb3ggbm90IGNyZWF0ZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ5CiAgICAvLyBjdXJyZW50X3ZvdGUgPSBvcC5idG9pKG9wLmV4dHJhY3QoYm94X2RhdGEsIGluZGV4LCBWT1RFX0NPVU5UX0JZVEVTKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDgKICAgIGV4dHJhY3QzCiAgICBidG9pCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MAogICAgLy8gb3AuQm94LnJlcGxhY2UoVEFMTFlfQk9YX0tFWSwgaW5kZXgsIG9wLml0b2IoY3VycmVudF92b3RlICsgMSkpCiAgICBpbnQgMQogICAgKwogICAgaXRvYgogICAgYnl0ZSAiViIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkID0gRmFsc2UKICAgIGJ5dGUgImlzX2Jvb3RzdHJhcHBlZCIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1MS01MgogICAgLy8gIyBUaGUgbWluaW11bSBudW1iZXIgb2Ygdm90ZXJzIHdobyBoYXZlIHZvdGVkCiAgICAvLyBzZWxmLnZvdGVyX2NvdW50ID0gVUludDY0KDApCiAgICBieXRlICJ2b3Rlcl9jb3VudCIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDgKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICBtZXRob2QgImNyZWF0ZShzdHJpbmcsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDY0LHVpbnQ4W10sdWludDY0LHN0cmluZyl2b2lkIgogICAgbWV0aG9kICJib290c3RyYXAocGF5KXZvaWQiCiAgICBtZXRob2QgImNsb3NlKCl2b2lkIgogICAgbWV0aG9kICJnZXRfcHJlY29uZGl0aW9ucyhieXRlW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBtZXRob2QgInZvdGUocGF5LGJ5dGVbXSx1aW50OFtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZV9yb3V0ZUAzIG1haW5fYm9vdHN0cmFwX3JvdXRlQDQgbWFpbl9jbG9zZV9yb3V0ZUA1IG1haW5fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANiBtYWluX3ZvdGVfcm91dGVANwogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl9jcmVhdGVfcm91dGVAMzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPVRydWUpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9ib290c3RyYXBfcm91dGVANDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBjbG9zZQogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3ByZWNvbmRpdGlvbnMKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdm90ZV9yb3V0ZUA3OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OAogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdm90ZQogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY3JlYXRlKHZvdGVfaWQ6IGJ5dGVzLCBzbmFwc2hvdF9wdWJsaWNfa2V5OiBieXRlcywgbWV0YWRhdGFfaXBmc19jaWQ6IGJ5dGVzLCBzdGFydF90aW1lOiB1aW50NjQsIGVuZF90aW1lOiB1aW50NjQsIG9wdGlvbl9jb3VudHM6IGJ5dGVzLCBxdW9ydW06IHVpbnQ2NCwgbmZ0X2ltYWdlX3VybDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTUtNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9VHJ1ZSkKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB2b3RlX2lkOiBhcmM0LlN0cmluZywKICAgIC8vICAgICBzbmFwc2hvdF9wdWJsaWNfa2V5OiBCeXRlcywKICAgIC8vICAgICBtZXRhZGF0YV9pcGZzX2NpZDogYXJjNC5TdHJpbmcsCiAgICAvLyAgICAgc3RhcnRfdGltZTogVUludDY0LAogICAgLy8gICAgIGVuZF90aW1lOiBVSW50NjQsCiAgICAvLyAgICAgb3B0aW9uX2NvdW50czogVm90ZUluZGV4QXJyYXksCiAgICAvLyAgICAgcXVvcnVtOiBVSW50NjQsCiAgICAvLyAgICAgbmZ0X2ltYWdlX3VybDogYXJjNC5TdHJpbmcsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA4IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NjcKICAgIC8vIGFzc2VydCBzdGFydF90aW1lIDwgZW5kX3RpbWUsICJFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZSIKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICA8CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGFmdGVyIHN0YXJ0IHRpbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NjgKICAgIC8vIGFzc2VydCBlbmRfdGltZSA+PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgIkVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlIgogICAgZnJhbWVfZGlnIC00CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYXNzZXJ0IC8vIEVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjcwCiAgICAvLyBzZWxmLnZvdGVfaWQgPSB2b3RlX2lkLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTgKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlICJ2b3RlX2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzEKICAgIC8vIHNlbGYuc25hcHNob3RfcHVibGljX2tleSA9IHNuYXBzaG90X3B1YmxpY19rZXkKICAgIGJ5dGUgInNuYXBzaG90X3B1YmxpY19rZXkiCiAgICBmcmFtZV9kaWcgLTcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjcyCiAgICAvLyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkID0gbWV0YWRhdGFfaXBmc19jaWQuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtNgogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIm1ldGFkYXRhX2lwZnNfY2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzMKICAgIC8vIHNlbGYuc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWUKICAgIGJ5dGUgInN0YXJ0X3RpbWUiCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc0CiAgICAvLyBzZWxmLmVuZF90aW1lID0gZW5kX3RpbWUKICAgIGJ5dGUgImVuZF90aW1lIgogICAgZnJhbWVfZGlnIC00CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NQogICAgLy8gc2VsZi5xdW9ydW0gPSBxdW9ydW0KICAgIGJ5dGUgInF1b3J1bSIKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzYKICAgIC8vIHNlbGYubmZ0X2ltYWdlX3VybCA9IG5mdF9pbWFnZV91cmwuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIm5mdF9pbWFnZV91cmwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NwogICAgLy8gc2VsZi5zdG9yZV9vcHRpb25fY291bnRzKG9wdGlvbl9jb3VudHMuY29weSgpKQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIHN0b3JlX29wdGlvbl9jb3VudHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzOiBieXRlcykgLT4gdm9pZDoKc3RvcmVfb3B0aW9uX2NvdW50czoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjE1LTIxNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBzdG9yZV9vcHRpb25fY291bnRzKHNlbGYsIG9wdGlvbl9jb3VudHM6IFZvdGVJbmRleEFycmF5KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNwogICAgLy8gYXNzZXJ0IG9wdGlvbl9jb3VudHMubGVuZ3RoLCAib3B0aW9uX2NvdW50cyBzaG91bGQgYmUgbm9uLWVtcHR5IgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cG4gMgogICAgYXNzZXJ0IC8vIG9wdGlvbl9jb3VudHMgc2hvdWxkIGJlIG5vbi1lbXB0eQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTgKICAgIC8vIGFzc2VydCBvcHRpb25fY291bnRzLmxlbmd0aCA8PSAxMTIsICJDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMTIgcXVlc3Rpb25zIgogICAgaW50IDExMgogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMTIgcXVlc3Rpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMAogICAgLy8gdG90YWxfb3B0aW9ucyA9IFVJbnQ2NCgwKQogICAgaW50IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjIxCiAgICAvLyBmb3IgaXRlbSBpbiBvcHRpb25fY291bnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgaW50IDAKCnN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjEKICAgIC8vIGZvciBpdGVtIGluIG9wdGlvbl9jb3VudHM6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnQgMQogICAgZXh0cmFjdDMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjIyCiAgICAvLyB0b3RhbF9vcHRpb25zICs9IGl0ZW0uZGVjb2RlKCkKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGludCAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDEKCnN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMwogICAgLy8gYXNzZXJ0IHRvdGFsX29wdGlvbnMgPD0gMTI4LCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucyIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludCAxMjgKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjUKICAgIC8vIHNlbGYub3B0aW9uX2NvdW50cyA9IG9wdGlvbl9jb3VudHMuY29weSgpCiAgICBieXRlICJvcHRpb25fY291bnRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjYKICAgIC8vIHNlbGYudG90YWxfb3B0aW9ucyA9IHRvdGFsX29wdGlvbnMKICAgIGJ5dGUgInRvdGFsX29wdGlvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5ib290c3RyYXAoZnVuZF9taW5fYmFsX3JlcTogdWludDY0KSAtPiB2b2lkOgpib290c3RyYXA6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZiwgZnVuZF9taW5fYmFsX3JlcTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODEKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5pc19ib290c3RyYXBwZWQsICJNdXN0IG5vdCBiZSBhbHJlYWR5IGJvb3RzdHJhcHBlZCIKICAgIGludCAwCiAgICBieXRlICJpc19ib290c3RyYXBwZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGlzX2Jvb3RzdHJhcHBlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBNdXN0IG5vdCBiZSBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4MgogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQgPSBUcnVlCiAgICBieXRlICJpc19ib290c3RyYXBwZWQiCiAgICBpbnQgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODUKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg0LTg2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIlBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODgKICAgIC8vIHRhbGx5X2JveF9zaXplID0gc2VsZi50b3RhbF9vcHRpb25zICogVk9URV9DT1VOVF9CWVRFUwogICAgaW50IDAKICAgIGJ5dGUgInRvdGFsX29wdGlvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHRvdGFsX29wdGlvbnMgZXhpc3RzCiAgICBpbnQgOAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5OC05OQogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICBkdXAKICAgIGludCA0MDAKICAgICoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6OTAtOTcKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIGludCAyMDM5MDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6OTAtOTkKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IHZhbHVlCiAgICAvLyArICh0YWxseV9ib3hfc2l6ZSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDEKICAgIC8vIGxvZyhtaW5fYmFsYW5jZV9yZXEpCiAgICBkdXAKICAgIGl0b2IKICAgIGxvZwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDMKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxhbmNlX3JlcQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwMi0xMDQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA1CiAgICAvLyBhc3NlcnQgb3AuQm94LmNyZWF0ZShUQUxMWV9CT1hfS0VZLCB0YWxseV9ib3hfc2l6ZSkKICAgIGJ5dGUgIlYiCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY2xvc2UoKSAtPiB2b2lkOgpjbG9zZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA3LTEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50IDAKICAgIGR1cAogICAgYnl0ZSAiIgogICAgZHVwbiAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwOQogICAgLy8gZW5zdXJlX2J1ZGdldCgyMDAwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgaW50IDIwMDAwCiAgICBpbnQgMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNsb3NlX3RpbWUsICJBbHJlYWR5IGNsb3NlZCIKICAgIGludCAwCiAgICBieXRlICJjbG9zZV90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgY2xvc2VkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMQogICAgLy8gc2VsZi5jbG9zZV90aW1lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGJ5dGUgImNsb3NlX3RpbWUiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTYKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICBpbnQgMAogICAgYnl0ZSAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTExNQogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICBieXRlICJ7XCJzdGFuZGFyZFwiOlwiYXJjNjlcIixcImRlc2NyaXB0aW9uXCI6XCJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTExNgogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNwogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIGJ5dGUgIi5cIixcInByb3BlcnRpZXNcIjp7XCJtZXRhZGF0YVwiOlwiaXBmczovLyIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTExNwogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTgKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgaW50IDAKICAgIGJ5dGUgIm1ldGFkYXRhX2lwZnNfY2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBtZXRhZGF0YV9pcGZzX2NpZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTExOAogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExOQogICAgLy8gKyBiJyIsImlkIjoiJwogICAgYnl0ZSAiXCIsXCJpZFwiOlwiIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQtMTE5CiAgICAvLyBiJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gYiciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArIGInLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArIGInIiwiaWQiOiInCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIwCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50IDAKICAgIGJ5dGUgInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZvdGVfaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNC0xMjAKICAgIC8vIGIneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyBiJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYicuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgYiciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIxCiAgICAvLyArIGInIiwicXVvcnVtIjonCiAgICBieXRlICJcIixcInF1b3J1bVwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTEyMQogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyBiJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYiciLCJxdW9ydW0iOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjIKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGludCAwCiAgICBieXRlICJxdW9ydW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHF1b3J1bSBleGlzdHMKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQtMTIyCiAgICAvLyBiJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gYiciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArIGInLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArIGInIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMwogICAgLy8gKyBiJywidm90ZXJDb3VudCI6JwogICAgYnl0ZSAiLFwidm90ZXJDb3VudFwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE0LTEyMwogICAgLy8gYid7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vIGInImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyBiJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYiciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIC8vICsgYicsInZvdGVyQ291bnQiOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjQKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgaW50IDAKICAgIGJ5dGUgInZvdGVyX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2b3Rlcl9jb3VudCBleGlzdHMKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQtMTI0CiAgICAvLyBiJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gYiciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArIGInLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArIGInIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyBiJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyBiJywidm90ZXJDb3VudCI6JwogICAgLy8gKyBpdG9hKHNlbGYudm90ZXJfY291bnQpCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI1CiAgICAvLyArIGInLCJ0YWxsaWVzIjpbJwogICAgYnl0ZSAiLFwidGFsbGllc1wiOlsiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNC0xMjUKICAgIC8vIGIneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyBiJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgYicuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgYiciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArIGInIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArIGInLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIC8vICsgYicsInRhbGxpZXMiOlsnCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI4CiAgICAvLyBjdXJyZW50X2luZGV4ID0gVUludDY0KDApCiAgICBpbnQgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjkKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCwgcXVlc3Rpb25fb3B0aW9uc19hcmMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgaW50IDAKICAgIGJ5dGUgIm9wdGlvbl9jb3VudHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIG9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBkdXAKICAgIGludCAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludCAwCgpjbG9zZV9mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyOQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4LCBxdWVzdGlvbl9vcHRpb25zX2FyYyBpbiB1ZW51bWVyYXRlKHNlbGYub3B0aW9uX2NvdW50cyk6CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfZGlnIDcKICAgIDwKICAgIGJ6IGNsb3NlX2FmdGVyX2ZvckAxNQogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2RpZyA5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludCAxCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMAogICAgLy8gaWYgcXVlc3Rpb25faW5kZXggPiAwOgogICAgaW50IDAKICAgID4KICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzEKICAgIC8vIG5vdGUgKz0gYiIsIgogICAgZnJhbWVfZGlnIDUKICAgIGJ5dGUgIiwiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMgogICAgLy8gcXVlc3Rpb25fb3B0aW9ucyA9IHF1ZXN0aW9uX29wdGlvbnNfYXJjLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMzCiAgICAvLyBpZiBxdWVzdGlvbl9vcHRpb25zID4gMDoKICAgIGludCAwCiAgICA+CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfYnVyeSAyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM0CiAgICAvLyBub3RlICs9IGIiWyIKICAgIGZyYW1lX2RpZyA1CiAgICBieXRlICJbIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM1CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zKToKICAgIGludCAwCiAgICBmcmFtZV9idXJ5IDMKCmNsb3NlX2Zvcl9oZWFkZXJANjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM1CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogY2xvc2VfYWZ0ZXJfZm9yQDEyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNgogICAgLy8gaWYgb3B0aW9uX2luZGV4ID4gMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnQgMAogICAgPgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2J1cnkgMAogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gbm90ZSArPSBiIiwiCiAgICBmcmFtZV9kaWcgNQogICAgYnl0ZSAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDk6CiAgICBmcmFtZV9kaWcgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzgKICAgIC8vIHZvdGVzX2Zvcl9vcHRpb24gPSBnZXRfdm90ZV9mcm9tX2JveChjdXJyZW50X2luZGV4KQogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBnZXRfdm90ZV9mcm9tX2JveAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzkKICAgIC8vIG5vdGUgKz0gaXRvYSh2b3Rlc19mb3Jfb3B0aW9uKQogICAgY2FsbHN1YiBpdG9hCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDAKICAgIC8vIGN1cnJlbnRfaW5kZXggKz0gMQogICAgaW50IDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzUKICAgIC8vIGZvciBvcHRpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uX29wdGlvbnMpOgogICAgZnJhbWVfZGlnIDMKICAgIGludCAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgY2xvc2VfZm9yX2hlYWRlckA2CgpjbG9zZV9hZnRlcl9mb3JAMTI6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MQogICAgLy8gbm90ZSArPSBiIl0iCiAgICBmcmFtZV9kaWcgNQogICAgYnl0ZSAiXSIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgNQogICAgZnJhbWVfZGlnIDkKICAgIGludCAxCiAgICArCiAgICBmcmFtZV9idXJ5IDkKICAgIGIgY2xvc2VfZm9yX2hlYWRlckAxCgpjbG9zZV9hZnRlcl9mb3JAMTU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MgogICAgLy8gbm90ZSArPSBiIl19fSIKICAgIGZyYW1lX2RpZyA1CiAgICBieXRlICJdfX0iCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ0LTE1MwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9YiJWT1RFUlNMVCIsCiAgICAvLyAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICBub3RlPW5vdGUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ4CiAgICAvLyBhc3NldF9uYW1lPWIiW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgaW50IDAKICAgIGJ5dGUgInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZvdGVfaWQgZXhpc3RzCiAgICBieXRlICJbVk9URSBSRVNVTFRdICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTAKICAgIC8vIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICBpbnQgMAogICAgYnl0ZSAibmZ0X2ltYWdlX3VybCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgbmZ0X2ltYWdlX3VybCBleGlzdHMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVUkwKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ5CiAgICAvLyB1bml0X25hbWU9YiJWT1RFUlNMVCIsCiAgICBieXRlICJWT1RFUlNMVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDQKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnQgYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUKICAgIC8vIHRvdGFsPTEsCiAgICBpbnQgMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ3CiAgICAvLyBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYKICAgIC8vIGRlY2ltYWxzPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDQtMTUzCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICBhc3NldF9uYW1lPWIiW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT1iIlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQzCiAgICAvLyBzZWxmLm5mdF9hc3NldF9pZCA9ICgKICAgIGJ5dGUgIm5mdF9hc3NldF9pZCIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ0LTE1MwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9YiJWT1RFUlNMVCIsCiAgICAvLyAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICBub3RlPW5vdGUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQzLTE1NQogICAgLy8gc2VsZi5uZnRfYXNzZXRfaWQgPSAoCiAgICAvLyAgICAgaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICAgICAgdG90YWw9MSwKICAgIC8vICAgICAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgICAgIGFzc2V0X25hbWU9YiJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgICAgIHVuaXRfbmFtZT1iIlZPVEVSU0xUIiwKICAgIC8vICAgICAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgICkKICAgIC8vICAgICAuc3VibWl0KCkKICAgIC8vICAgICAuY3JlYXRlZF9hc3NldC5hc3NldF9pZAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHB1eWFweS5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICAvLyA8cHV5YT4vcHV5YXB5LnB5OjExLTE3CiAgICBwcm90byAyIDAKICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MTgKICAgIGZyYW1lX2RpZyAtMgogICAgaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgLy8gPHB1eWE+L3B1eWFweS5weToxOQogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgLy8gPHB1eWE+L3B1eWFweS5weToyMAogICAgaXR4bl9iZWdpbgogICAgLy8gPHB1eWE+L3B1eWFweS5weToyMQogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MjIKICAgIGludCBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIDxwdXlhPi9wdXlhcHkucHk6MjMKICAgIGJ5dGUgMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICAvLyA8cHV5YT4vcHV5YXB5LnB5OjI0CiAgICBieXRlIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyA8cHV5YT4vcHV5YXB5LnB5OjI1LTI5CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICAvLyA8cHV5YT4vcHV5YXB5LnB5OjI3CiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgLy8gPHB1eWE+L3B1eWFweS5weToyOQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gPHB1eWE+L3B1eWFweS5weTozMAogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3OgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5pdG9hKGk6IHVpbnQ2NCkgLT4gYnl0ZXM6Cml0b2E6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1My0yNTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXRvYShpOiBVSW50NjQpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NgogICAgLy8gcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBpbnQgMTAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU3CiAgICAvLyBpZiBpIDwgcmFkaXg6CiAgICA8CiAgICBieiBpdG9hX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTgKICAgIC8vIHJldHVybiBkaWdpdHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZSAiMDEyMzQ1Njc4OSIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgcmV0c3ViCgppdG9hX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU5CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIGRpZ2l0c1tpICUgcmFkaXhdCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU2CiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludCAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIC8KICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NgogICAgLy8gcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBpbnQgMTAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU5CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIGRpZ2l0c1tpICUgcmFkaXhdCiAgICAlCiAgICBkdXAKICAgIGludCAxCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGUgIjAxMjM0NTY3ODkiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLmdldF92b3RlX2Zyb21fYm94KGluZGV4OiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0X3ZvdGVfZnJvbV9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzOC0yMzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3ZvdGVfZnJvbV9ib3goaW5kZXg6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0MAogICAgLy8gYm94X2RhdGEsIGV4aXN0cyA9IG9wLkJveC5nZXQoVEFMTFlfQk9YX0tFWSkKICAgIGJ5dGUgIlYiCiAgICBib3hfZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0MQogICAgLy8gYXNzZXJ0IGV4aXN0cywgIkJveCBub3QgY3JlYXRlZCIKICAgIGFzc2VydCAvLyBCb3ggbm90IGNyZWF0ZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gb3AuYnRvaShvcC5leHRyYWN0KGJveF9kYXRhLCBpbmRleCwgVk9URV9DT1VOVF9CWVRFUykpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludCA4CiAgICBleHRyYWN0MwogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5nZXRfcHJlY29uZGl0aW9ucyhzaWduYXR1cmU6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3ByZWNvbmRpdGlvbnM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1Ny0xNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wcmVjb25kaXRpb25zKHNlbGYsIHNpZ25hdHVyZTogYXJjNC5EeW5hbWljQnl0ZXMpIC0+IFZvdGluZ1ByZWNvbmRpdGlvbnM6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYwCiAgICAvLyBpc192b3Rpbmdfb3Blbj1hcmM0LlVJbnQ2NChzZWxmLnZvdGluZ19vcGVuKCkpLAogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjEKICAgIC8vIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUuYnl0ZXNbMjpdKSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZHVwCiAgICBpbnQgMgogICAgPgogICAgYnogZ2V0X3ByZWNvbmRpdGlvbnNfdGVybmFyeV9mYWxzZUAyCiAgICBpbnQgMgogICAgYiBnZXRfcHJlY29uZGl0aW9uc190ZXJuYXJ5X21lcmdlQDMKCmdldF9wcmVjb25kaXRpb25zX3Rlcm5hcnlfZmFsc2VAMjoKICAgIGZyYW1lX2RpZyAxCgpnZXRfcHJlY29uZGl0aW9uc190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MQogICAgLy8gaXNfYWxsb3dlZF90b192b3RlPWFyYzQuVUludDY0KHNlbGYuYWxsb3dlZF90b192b3RlKHNpZ25hdHVyZS5ieXRlc1syOl0pKSwKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgZnJhbWVfZGlnIDEKICAgIHN1YnN0cmluZzMKICAgIGNhbGxzdWIgYWxsb3dlZF90b192b3RlCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MgogICAgLy8gaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MwogICAgLy8gY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTU5LTE2NAogICAgLy8gcmV0dXJuIFZvdGluZ1ByZWNvbmRpdGlvbnMoCiAgICAvLyAgICAgaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIC8vICAgICBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlLmJ5dGVzWzI6XSkpLAogICAgLy8gICAgIGhhc19hbHJlYWR5X3ZvdGVkPWFyYzQuVUludDY0KHNlbGYuYWxyZWFkeV92b3RlZCgpKSwKICAgIC8vICAgICBjdXJyZW50X3RpbWU9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90aW5nX29wZW4oKSAtPiB1aW50NjQ6CnZvdGluZ19vcGVuOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDItMjAzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHZvdGluZ19vcGVuKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIGJ5dGUgIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA1CiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgaW50IDAKICAgIGJ5dGUgImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgaXNfYm9vdHN0cmFwcGVkIGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDUtMjA3CiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgLy8gYW5kIG5vdCBzZWxmLmNsb3NlX3RpbWUKICAgIC8vIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgYnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNgogICAgLy8gYW5kIG5vdCBzZWxmLmNsb3NlX3RpbWUKICAgIGludCAwCiAgICBieXRlICJjbG9zZV90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYm56IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDcKICAgIC8vIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgaW50IDAKICAgIGJ5dGUgInN0YXJ0X3RpbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHN0YXJ0X3RpbWUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgPD0KICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgaW50IDAKICAgIGJ5dGUgImVuZF90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBlbmRfdGltZSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgYnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICBpbnQgMQogICAgYiB2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDYKCnZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANToKICAgIGludCAwCgp2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNC0yMDgKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vICAgICBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gICAgIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlOiBieXRlcykgLT4gdWludDY0OgphbGxvd2VkX3RvX3ZvdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyOC0yMjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsb3dlZF90b192b3RlKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMwCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDApCiAgICBpbnQgMjAwMAogICAgaW50IDIKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzIKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNAogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5LAogICAgaW50IDAKICAgIGJ5dGUgInNuYXBzaG90X3B1YmxpY19rZXkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNuYXBzaG90X3B1YmxpY19rZXkgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzMS0yMzUKICAgIC8vIHJldHVybiBvcC5lZDI1NTE5dmVyaWZ5X2JhcmUoCiAgICAvLyAgICAgVHhuLnNlbmRlci5ieXRlcywKICAgIC8vICAgICBzaWduYXR1cmUsCiAgICAvLyAgICAgc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5LAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuYWxyZWFkeV92b3RlZCgpIC0+IHVpbnQ2NDoKYWxyZWFkeV92b3RlZDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjEwLTIxMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbHJlYWR5X3ZvdGVkKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjEyCiAgICAvLyAodm90ZXMsIGV4aXN0cykgPSBvcC5Cb3guZ2V0KFR4bi5zZW5kZXIuYnl0ZXMpCiAgICB0eG4gU2VuZGVyCiAgICBib3hfZ2V0CiAgICBidXJ5IDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjEzCiAgICAvLyByZXR1cm4gZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGUoZnVuZF9taW5fYmFsX3JlcTogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzLCBhbnN3ZXJfaWRzOiBieXRlcykgLT4gdm9pZDoKdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY2LTE3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdm90ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHNpZ25hdHVyZTogQnl0ZXMsCiAgICAvLyAgICAgYW5zd2VyX2lkczogVm90ZUluZGV4QXJyYXksCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTczCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDc3MDAsIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludCA3NzAwCiAgICBpbnQgMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3NC0xNzUKICAgIC8vICMgQ2hlY2sgdm90aW5nIHByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpLCAiTm90IGFsbG93ZWQgdG8gdm90ZSIKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGFzc2VydCAvLyBOb3QgYWxsb3dlZCB0byB2b3RlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3NgogICAgLy8gYXNzZXJ0IHNlbGYudm90aW5nX29wZW4oKSwgIlZvdGluZyBub3Qgb3BlbiIKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGFzc2VydCAvLyBWb3Rpbmcgbm90IG9wZW4KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWxyZWFkeV92b3RlZCgpLCAiQWxyZWFkeSB2b3RlZCIKICAgIGNhbGxzdWIgYWxyZWFkeV92b3RlZAogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgdm90ZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc4CiAgICAvLyBxdWVzdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHMubGVuZ3RoCiAgICBpbnQgMAogICAgYnl0ZSAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgb3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGludCAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3OQogICAgLy8gYXNzZXJ0IGFuc3dlcl9pZHMubGVuZ3RoID09IHF1ZXN0aW9uc19jb3VudCwgIk51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODIKICAgIC8vICgzMiArIDIgKyBWT1RFX0lOREVYX0JZVEVTICogYW5zd2VyX2lkcy5sZW5ndGgpICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIGludCAzNAogICAgKwogICAgaW50IDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODAtMTgxCiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICBpbnQgMjUwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODAtMTgzCiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICAvLyAgICAgKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODUKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4NC0xODYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODgKICAgIC8vIGxvZyhtaW5fYmFsX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4OQogICAgLy8gYXNzZXJ0IGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxfcmVxLCAiUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0aGUgZXhhY3QgbWluIGJhbGFuY2UKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkwLTE5MQogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUgZm9yIGVhY2ggcXVlc3Rpb24KICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ID0gVUludDY0KDApCiAgICBpbnQgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTIKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGludCAwCgp2b3RlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uc19jb3VudCk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHZvdGVfYWZ0ZXJfZm9yQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkzLTE5NAogICAgLy8gIyBMb2FkIHRoZSB1c2VyJ3Mgdm90ZSBmb3IgdGhpcyBxdWVzdGlvbgogICAgLy8gYW5zd2VyX29wdGlvbl9pbmRleCA9IGFuc3dlcl9pZHNbcXVlc3Rpb25faW5kZXhdLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50IDEKICAgIGV4dHJhY3QzCiAgICBidG9pCiAgICBzd2FwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gb3B0aW9uc19jb3VudCA9IHNlbGYub3B0aW9uX2NvdW50c1txdWVzdGlvbl9pbmRleF0uZGVjb2RlKCkKICAgIGludCAwCiAgICBieXRlICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBvcHRpb25fY291bnRzIGV4aXN0cwogICAgZHVwCiAgICBpbnQgMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICA+CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50IDEKICAgIGV4dHJhY3QzCiAgICBidG9pCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NgogICAgLy8gYXNzZXJ0IGFuc3dlcl9vcHRpb25faW5kZXggPCBvcHRpb25zX2NvdW50LCAiQW5zd2VyIG9wdGlvbiBpbmRleCBpbnZhbGlkIgogICAgZGlnIDIKICAgIGRpZyAxCiAgICA8CiAgICBhc3NlcnQgLy8gQW5zd2VyIG9wdGlvbiBpbmRleCBpbnZhbGlkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NwogICAgLy8gaW5jcmVtZW50X3ZvdGVfaW5fYm94KGN1bXVsYXRpdmVfb2Zmc2V0ICsgYW5zd2VyX29wdGlvbl9pbmRleCkKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgNAogICAgKwogICAgY2FsbHN1YiBpbmNyZW1lbnRfdm90ZV9pbl9ib3gKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk4CiAgICAvLyBjdW11bGF0aXZlX29mZnNldCArPSBvcHRpb25zX2NvdW50CiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk5CiAgICAvLyBvcC5Cb3gucHV0KFR4bi5zZW5kZXIuYnl0ZXMsIGFuc3dlcl9pZHMuYnl0ZXMpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAwCiAgICAvLyBzZWxmLnZvdGVyX2NvdW50ICs9IDEKICAgIGludCAwCiAgICBieXRlICJ2b3Rlcl9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdm90ZXJfY291bnQgZXhpc3RzCiAgICBpbnQgMQogICAgKwogICAgYnl0ZSAidm90ZXJfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTIKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGludCAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDU6CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLmluY3JlbWVudF92b3RlX2luX2JveChpbmRleDogdWludDY0KSAtPiB2b2lkOgppbmNyZW1lbnRfdm90ZV9pbl9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0NS0yNDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaW5jcmVtZW50X3ZvdGVfaW5fYm94KGluZGV4OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ3CiAgICAvLyBib3hfZGF0YSwgZXhpc3RzID0gb3AuQm94LmdldChUQUxMWV9CT1hfS0VZKQogICAgYnl0ZSAiViIKICAgIGJveF9nZXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ4CiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiQm94IG5vdCBjcmVhdGVkIgogICAgYXNzZXJ0IC8vIEJveCBub3QgY3JlYXRlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDkKICAgIC8vIGN1cnJlbnRfdm90ZSA9IG9wLmJ0b2kob3AuZXh0cmFjdChib3hfZGF0YSwgaW5kZXgsIFZPVEVfQ09VTlRfQllURVMpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgOAogICAgZXh0cmFjdDMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUwCiAgICAvLyBvcC5Cb3gucmVwbGFjZShUQUxMWV9CT1hfS0VZLCBpbmRleCwgb3AuaXRvYihjdXJyZW50X3ZvdGUgKyAxKSkKICAgIGludCAxCiAgICArCiAgICBpdG9iCiAgICBieXRlICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1MAogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQgPSBGYWxzZQogICAgYnl0ZSAiaXNfYm9vdHN0cmFwcGVkIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxLTUyCiAgICAvLyAjIFRoZSBtaW5pbXVtIG51bWJlciBvZiB2b3RlcnMgd2hvIGhhdmUgdm90ZWQKICAgIC8vIHNlbGYudm90ZXJfY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGUgInZvdGVyX2NvdW50IgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ4CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo=" }, "state": { diff --git a/examples/voting/out/VotingRoundApp.destructured.ir b/examples/voting/out/VotingRoundApp.destructured.ir index 19012b2245..d477a4f0a4 100644 --- a/examples/voting/out/VotingRoundApp.destructured.ir +++ b/examples/voting/out/VotingRoundApp.destructured.ir @@ -129,7 +129,7 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) @@ -138,7 +138,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check total_options exists let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) @@ -154,36 +154,36 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.close() -> void: block@0: // L107 puyapy.ensure_budget(20000u, 0u) - let (tmp%0#0: any, tmp%1#0: uint64) = (app_global_get_ex 0u "close_time") - let tmp%2#0: uint64 = (! tmp%1#0) + let (close_time_exists%0#0: any, close_time_exists%1#0: uint64) = (app_global_get_ex 0u "close_time") + let tmp%2#0: uint64 = (! close_time_exists%1#0) (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check vote_id exists let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check vote_id exists let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check quorum exists let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check value exists + (assert app_global_get_ex_did_exist%22#0) // check voter_count exists let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) let item_index_internal%29#0: uint64 = 0u @@ -248,10 +248,10 @@ contract examples.voting.voting.VotingRoundApp: let note#0: bytes = (concat note#0 "]}}") itxn_begin let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check value exists + (assert app_global_get_ex_did_exist%42#0) // check vote_id exists let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check value exists + (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) @@ -347,20 +347,20 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists goto app_global_get_ex_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 - let (tmp%2#0: any, tmp%3#0: uint64) = (app_global_get_ex 0u "close_time") - goto tmp%3#0 ? block@5 : block@2 + let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") + goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check end_time exists let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 @@ -377,7 +377,7 @@ contract examples.voting.voting.VotingRoundApp: puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) return tmp%3#0 @@ -398,7 +398,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check option_counts exists let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) @@ -429,7 +429,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds @@ -444,7 +444,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check voter_count exists let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#0: uint64 = (+ question_index#0 1u) diff --git a/examples/voting/out/VotingRoundApp.ssa.ir b/examples/voting/out/VotingRoundApp.ssa.ir index 00791ccf45..98b31846a6 100644 --- a/examples/voting/out/VotingRoundApp.ssa.ir +++ b/examples/voting/out/VotingRoundApp.ssa.ir @@ -143,7 +143,7 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) @@ -152,7 +152,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check total_options exists let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) @@ -168,36 +168,36 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.close() -> void: block@0: // L107 puyapy.ensure_budget(20000u, 0u) - let (tmp%0#0: any, tmp%1#0: uint64) = (app_global_get_ex 0u "close_time") - let tmp%2#0: uint64 = (! tmp%1#0) + let (close_time_exists%0#0: any, close_time_exists%1#0: uint64) = (app_global_get_ex 0u "close_time") + let tmp%2#0: uint64 = (! close_time_exists%1#0) (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check vote_id exists let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check vote_id exists let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check quorum exists let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check value exists + (assert app_global_get_ex_did_exist%22#0) // check voter_count exists let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) let item_index_internal%29#0: uint64 = 0u @@ -276,7 +276,7 @@ contract examples.voting.voting.VotingRoundApp: let inner_txn_params%40%%AssetAmount_length#0: uint64 = 0u let inner_txn_params%40%%AssetCloseTo_length#0: uint64 = 0u let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check value exists + (assert app_global_get_ex_did_exist%42#0) // check vote_id exists let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) let inner_txn_params%40%%ConfigAssetName_length#0: uint64 = 1u let inner_txn_params%40%%AssetReceiver_length#0: uint64 = 0u @@ -321,7 +321,7 @@ contract examples.voting.voting.VotingRoundApp: let inner_txn_params%40%%param_ConfigAssetUnitName_idx_0#0: bytes = "VOTERSLT" let inner_txn_params%40%%ConfigAssetUnitName_length#0: uint64 = 1u let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check value exists + (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists let inner_txn_params%40%%param_ConfigAssetURL_idx_0#0: bytes = app_global_get_ex_value%43#0 let inner_txn_params%40%%ConfigAssetURL_length#0: uint64 = 1u let inner_txn_params%40%%VoteFirst_length#0: uint64 = 0u @@ -498,20 +498,20 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists goto app_global_get_ex_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 - let (tmp%2#0: any, tmp%3#0: uint64) = (app_global_get_ex 0u "close_time") - goto tmp%3#0 ? block@5 : block@2 + let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") + goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check end_time exists let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 @@ -529,7 +529,7 @@ contract examples.voting.voting.VotingRoundApp: puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) return tmp%3#0 @@ -552,7 +552,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check option_counts exists let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) @@ -590,7 +590,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 item_index%23#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds @@ -606,7 +606,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check voter_count exists let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) goto block@3 diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir index 009aea486e..552068ed14 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir @@ -131,7 +131,7 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) @@ -140,7 +140,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check total_options exists let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) @@ -156,36 +156,36 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.close() -> void: block@0: // L107 puyapy.ensure_budget(20000u, 0u) - let (tmp%0#0: any, tmp%1#0: uint64) = (app_global_get_ex 0u "close_time") - let tmp%2#0: uint64 = (! tmp%1#0) + let (close_time_exists%0#0: any, close_time_exists%1#0: uint64) = (app_global_get_ex 0u "close_time") + let tmp%2#0: uint64 = (! close_time_exists%1#0) (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check vote_id exists let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check vote_id exists let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check quorum exists let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check value exists + (assert app_global_get_ex_did_exist%22#0) // check voter_count exists let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) let item_index_internal%29#0: uint64 = 0u @@ -244,10 +244,10 @@ contract examples.voting.voting.VotingRoundApp: let note#12: bytes = (concat note#1 "]}}") itxn_begin let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check value exists + (assert app_global_get_ex_did_exist%42#0) // check vote_id exists let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check value exists + (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) @@ -345,20 +345,20 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists goto app_global_get_ex_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 - let (tmp%2#0: any, tmp%3#0: uint64) = (app_global_get_ex 0u "close_time") - goto tmp%3#0 ? block@5 : block@2 + let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") + goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check end_time exists let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 @@ -376,7 +376,7 @@ contract examples.voting.voting.VotingRoundApp: puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) return tmp%3#0 @@ -397,7 +397,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check option_counts exists let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) @@ -429,7 +429,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds @@ -444,7 +444,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check voter_count exists let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#3: uint64 = (+ question_index#0 1u) diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir index 4db1e8f852..f84e292b17 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir @@ -131,7 +131,7 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) @@ -140,7 +140,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check total_options exists let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) @@ -156,36 +156,36 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.close() -> void: block@0: // L107 puyapy.ensure_budget(20000u, 0u) - let (tmp%0#0: any, tmp%1#0: uint64) = (app_global_get_ex 0u "close_time") - let tmp%2#0: uint64 = (! tmp%1#0) + let (close_time_exists%0#0: any, close_time_exists%1#0: uint64) = (app_global_get_ex 0u "close_time") + let tmp%2#0: uint64 = (! close_time_exists%1#0) (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check vote_id exists let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check vote_id exists let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check quorum exists let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check value exists + (assert app_global_get_ex_did_exist%22#0) // check voter_count exists let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) let item_index_internal%29#0: uint64 = 0u @@ -244,10 +244,10 @@ contract examples.voting.voting.VotingRoundApp: let note#12: bytes = (concat note#1 "]}}") itxn_begin let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check value exists + (assert app_global_get_ex_did_exist%42#0) // check vote_id exists let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check value exists + (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) @@ -343,20 +343,20 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists goto app_global_get_ex_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 - let (tmp%2#0: any, tmp%3#0: uint64) = (app_global_get_ex 0u "close_time") - goto tmp%3#0 ? block@5 : block@2 + let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") + goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check end_time exists let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 @@ -374,7 +374,7 @@ contract examples.voting.voting.VotingRoundApp: puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) return tmp%3#0 @@ -395,7 +395,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check option_counts exists let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) @@ -427,7 +427,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds @@ -442,7 +442,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check voter_count exists let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#3: uint64 = (+ question_index#0 1u) diff --git a/examples/voting/out/voting.awst b/examples/voting/out/voting.awst index e000348763..9e713b10ac 100644 --- a/examples/voting/out/voting.awst +++ b/examples/voting/out/voting.awst @@ -65,7 +65,7 @@ contract VotingRoundApp abimethod close(): None { puyapy::ensure_budget(required_budget=20000u, fee_source=0u) - assert(!(STATE_GET_EX(this.close_time)[1]), comment="Already closed") + assert(!(STATE_EXISTS(this.close_time)), comment="Already closed") this.close_time: puyapy.UInt64 = global() note: puyapy.Bytes = '{"standard":"arc69","description":"This is a voting result NFT for voting round with ID ' + this.vote_id + '.","properties":{"metadata":"ipfs://' + this.metadata_ipfs_cid + '","id":"' + this.vote_id + '","quorum":' + examples.voting.voting::itoa(this.quorum) + ',"voterCount":' + examples.voting.voting::itoa(this.voter_count) + ',"tallies":[' current_index: puyapy.UInt64 = 0u @@ -122,7 +122,7 @@ contract VotingRoundApp subroutine voting_open(): bool { - return this.is_bootstrapped and !(STATE_GET_EX(this.close_time)[1]) and this.start_time <= tmp$1: puyapy.UInt64 := global() and tmp$1 <= this.end_time + return this.is_bootstrapped and !(STATE_EXISTS(this.close_time)) and this.start_time <= tmp$1: puyapy.UInt64 := global() and tmp$1 <= this.end_time } subroutine already_voted(): bool diff --git a/examples/voting/out_O2/VotingRoundApp.approval.teal b/examples/voting/out_O2/VotingRoundApp.approval.teal index 91b8190af4..55f0b6b4be 100644 --- a/examples/voting/out_O2/VotingRoundApp.approval.teal +++ b/examples/voting/out_O2/VotingRoundApp.approval.teal @@ -203,7 +203,7 @@ bootstrap: int 0 byte "is_bootstrapped" app_global_get_ex - assert // check value exists + assert // check is_bootstrapped exists ! assert // Must not be already bootstrapped byte "is_bootstrapped" @@ -217,7 +217,7 @@ bootstrap: int 0 byte "total_options" app_global_get_ex - assert // check value exists + assert // check total_options exists int 8 * dup @@ -261,7 +261,7 @@ close: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists byte "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " swap concat @@ -270,21 +270,21 @@ close: int 0 byte "metadata_ipfs_cid" app_global_get_ex - assert // check value exists + assert // check metadata_ipfs_cid exists concat byte "\",\"id\":\"" concat int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists concat byte "\",\"quorum\":" concat int 0 byte "quorum" app_global_get_ex - assert // check value exists + assert // check quorum exists callsub itoa concat byte ",\"voterCount\":" @@ -292,7 +292,7 @@ close: int 0 byte "voter_count" app_global_get_ex - assert // check value exists + assert // check voter_count exists callsub itoa concat byte ",\"tallies\":[" @@ -301,7 +301,7 @@ close: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists dup int 0 extract_uint16 @@ -414,14 +414,14 @@ close_after_for@15: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists byte "[VOTE RESULT] " swap concat int 0 byte "nft_image_url" app_global_get_ex - assert // check value exists + assert // check nft_image_url exists itxn_field ConfigAssetURL byte "VOTERSLT" itxn_field ConfigAssetUnitName @@ -578,7 +578,7 @@ voting_open: int 0 byte "is_bootstrapped" app_global_get_ex - assert // check value exists + assert // check is_bootstrapped exists bz voting_open_bool_false@5 int 0 byte "close_time" @@ -588,7 +588,7 @@ voting_open: int 0 byte "start_time" app_global_get_ex - assert // check value exists + assert // check start_time exists global LatestTimestamp dup frame_bury 0 @@ -597,7 +597,7 @@ voting_open: int 0 byte "end_time" app_global_get_ex - assert // check value exists + assert // check end_time exists frame_dig 0 >= bz voting_open_bool_false@5 @@ -622,7 +622,7 @@ allowed_to_vote: int 0 byte "snapshot_public_key" app_global_get_ex - assert // check value exists + assert // check snapshot_public_key exists frame_dig -1 swap ed25519verify_bare @@ -655,7 +655,7 @@ vote: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists int 0 extract_uint16 dup @@ -709,7 +709,7 @@ vote_for_header@1: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists dup int 0 extract_uint16 @@ -738,7 +738,7 @@ vote_for_header@1: int 0 byte "voter_count" app_global_get_ex - assert // check value exists + assert // check voter_count exists int 1 + byte "voter_count" diff --git a/examples/voting/out_O2/VotingRoundApp.destructured.ir b/examples/voting/out_O2/VotingRoundApp.destructured.ir index 19012b2245..d477a4f0a4 100644 --- a/examples/voting/out_O2/VotingRoundApp.destructured.ir +++ b/examples/voting/out_O2/VotingRoundApp.destructured.ir @@ -129,7 +129,7 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) @@ -138,7 +138,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check total_options exists let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) @@ -154,36 +154,36 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.close() -> void: block@0: // L107 puyapy.ensure_budget(20000u, 0u) - let (tmp%0#0: any, tmp%1#0: uint64) = (app_global_get_ex 0u "close_time") - let tmp%2#0: uint64 = (! tmp%1#0) + let (close_time_exists%0#0: any, close_time_exists%1#0: uint64) = (app_global_get_ex 0u "close_time") + let tmp%2#0: uint64 = (! close_time_exists%1#0) (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check vote_id exists let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check vote_id exists let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check quorum exists let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check value exists + (assert app_global_get_ex_did_exist%22#0) // check voter_count exists let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) let item_index_internal%29#0: uint64 = 0u @@ -248,10 +248,10 @@ contract examples.voting.voting.VotingRoundApp: let note#0: bytes = (concat note#0 "]}}") itxn_begin let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check value exists + (assert app_global_get_ex_did_exist%42#0) // check vote_id exists let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check value exists + (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) @@ -347,20 +347,20 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists goto app_global_get_ex_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 - let (tmp%2#0: any, tmp%3#0: uint64) = (app_global_get_ex 0u "close_time") - goto tmp%3#0 ? block@5 : block@2 + let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") + goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check end_time exists let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 @@ -377,7 +377,7 @@ contract examples.voting.voting.VotingRoundApp: puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) return tmp%3#0 @@ -398,7 +398,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check option_counts exists let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) @@ -429,7 +429,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds @@ -444,7 +444,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check voter_count exists let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#0: uint64 = (+ question_index#0 1u) diff --git a/examples/voting/out_unoptimized/VotingRoundApp.approval.teal b/examples/voting/out_unoptimized/VotingRoundApp.approval.teal index de07c10aa7..ad2c9d3496 100644 --- a/examples/voting/out_unoptimized/VotingRoundApp.approval.teal +++ b/examples/voting/out_unoptimized/VotingRoundApp.approval.teal @@ -321,7 +321,7 @@ bootstrap: int 0 byte "is_bootstrapped" app_global_get_ex - assert // check value exists + assert // check is_bootstrapped exists ! assert // Must not be already bootstrapped // voting/voting.py:82 @@ -345,7 +345,7 @@ bootstrap: int 0 byte "total_options" app_global_get_ex - assert // check value exists + assert // check total_options exists int 8 * // voting/voting.py:98-99 @@ -450,7 +450,7 @@ close: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists // voting/voting.py:114-115 // b'{"standard":"arc69",' // b'"description":"This is a voting result NFT for voting round with ID ' @@ -475,7 +475,7 @@ close: int 0 byte "metadata_ipfs_cid" app_global_get_ex - assert // check value exists + assert // check metadata_ipfs_cid exists // voting/voting.py:114-118 // b'{"standard":"arc69",' // b'"description":"This is a voting result NFT for voting round with ID ' @@ -499,7 +499,7 @@ close: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists // voting/voting.py:114-120 // b'{"standard":"arc69",' // b'"description":"This is a voting result NFT for voting round with ID ' @@ -527,7 +527,7 @@ close: int 0 byte "quorum" app_global_get_ex - assert // check value exists + assert // check quorum exists callsub itoa // voting/voting.py:114-122 // b'{"standard":"arc69",' @@ -560,7 +560,7 @@ close: int 0 byte "voter_count" app_global_get_ex - assert // check value exists + assert // check voter_count exists callsub itoa // voting/voting.py:114-124 // b'{"standard":"arc69",' @@ -600,7 +600,7 @@ close: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists dup int 0 extract_uint16 @@ -762,7 +762,7 @@ close_after_for@15: int 0 byte "vote_id" app_global_get_ex - assert // check value exists + assert // check vote_id exists byte "[VOTE RESULT] " swap concat @@ -789,7 +789,7 @@ close_after_for@15: int 0 byte "nft_image_url" app_global_get_ex - assert // check value exists + assert // check nft_image_url exists itxn_field ConfigAssetURL itxn_field ConfigAssetUnitName itxn_field TypeEnum @@ -1055,7 +1055,7 @@ voting_open: int 0 byte "is_bootstrapped" app_global_get_ex - assert // check value exists + assert // check is_bootstrapped exists // voting/voting.py:205-207 // self.is_bootstrapped // and not self.close_time @@ -1074,7 +1074,7 @@ voting_open: int 0 byte "start_time" app_global_get_ex - assert // check value exists + assert // check start_time exists global LatestTimestamp dup frame_bury 0 @@ -1083,7 +1083,7 @@ voting_open: int 0 byte "end_time" app_global_get_ex - assert // check value exists + assert // check end_time exists frame_dig 0 swap <= @@ -1124,7 +1124,7 @@ allowed_to_vote: int 0 byte "snapshot_public_key" app_global_get_ex - assert // check value exists + assert // check snapshot_public_key exists // voting/voting.py:231-235 // return op.ed25519verify_bare( // Txn.sender.bytes, @@ -1191,7 +1191,7 @@ vote: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists int 0 extract_uint16 dup @@ -1293,7 +1293,7 @@ vote_for_header@1: int 0 byte "option_counts" app_global_get_ex - assert // check value exists + assert // check option_counts exists dup int 0 extract_uint16 @@ -1336,7 +1336,7 @@ vote_for_header@1: int 0 byte "voter_count" app_global_get_ex - assert // check value exists + assert // check voter_count exists int 1 + byte "voter_count" diff --git a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir index bca123928c..a7c439df79 100644 --- a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir +++ b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir @@ -142,7 +142,7 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) @@ -151,7 +151,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check total_options exists let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) @@ -167,36 +167,36 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.close() -> void: block@0: // L107 puyapy.ensure_budget(20000u, 0u) - let (tmp%0#0: any, tmp%1#0: uint64) = (app_global_get_ex 0u "close_time") - let tmp%2#0: uint64 = (! tmp%1#0) + let (close_time_exists%0#0: any, close_time_exists%1#0: uint64) = (app_global_get_ex 0u "close_time") + let tmp%2#0: uint64 = (! close_time_exists%1#0) (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check vote_id exists let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check vote_id exists let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check value exists + (assert app_global_get_ex_did_exist%17#0) // check quorum exists let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check value exists + (assert app_global_get_ex_did_exist%22#0) // check voter_count exists let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) let item_index_internal%29#0: uint64 = 0u @@ -267,7 +267,7 @@ contract examples.voting.voting.VotingRoundApp: let note#0: bytes = (concat note#0 "]}}") itxn_begin let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check value exists + (assert app_global_get_ex_did_exist%42#0) // check vote_id exists let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) let inner_txn_params%40%%param_ConfigAssetDecimals_idx_0#0: uint64 = 0u let inner_txn_params%40%%param_ConfigAssetDefaultFrozen_idx_0#0: uint64 = 0u @@ -276,7 +276,7 @@ contract examples.voting.voting.VotingRoundApp: let inner_txn_params%40%%param_TypeEnum_idx_0#0: uint64 = acfg let inner_txn_params%40%%param_ConfigAssetUnitName_idx_0#0: bytes = "VOTERSLT" let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check value exists + (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists let inner_txn_params%40%%param_ConfigAssetURL_idx_0#0: bytes = app_global_get_ex_value%43#0 ((itxn_field ConfigAssetURL) inner_txn_params%40%%param_ConfigAssetURL_idx_0#0) ((itxn_field ConfigAssetUnitName) inner_txn_params%40%%param_ConfigAssetUnitName_idx_0#0) @@ -384,20 +384,20 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists goto app_global_get_ex_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 - let (tmp%2#0: any, tmp%3#0: uint64) = (app_global_get_ex 0u "close_time") - goto tmp%3#0 ? block@5 : block@2 + let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") + goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check value exists + (assert app_global_get_ex_did_exist%9#0) // check end_time exists let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 @@ -414,7 +414,7 @@ contract examples.voting.voting.VotingRoundApp: puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) return tmp%3#0 @@ -436,7 +436,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check option_counts exists let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) @@ -472,7 +472,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 item_index%23#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check value exists + (assert app_global_get_ex_did_exist%26#0) // check option_counts exists let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds @@ -488,7 +488,7 @@ contract examples.voting.voting.VotingRoundApp: let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check voter_count exists let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) goto block@3 diff --git a/examples/voting/puya.log b/examples/voting/puya.log index 48a2379739..7ac79ac0e7 100644 --- a/examples/voting/puya.log +++ b/examples/voting/puya.log @@ -1691,8 +1691,8 @@ debug: Inserted close_block@0.ops[99]: 'store tmp%24#0 to l-stack (copy)' debug: Replaced close_block@0.ops[101]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[122]: 'store item_index_internal%29#0 to l-stack (copy)' debug: Replaced close_block@0.ops[124]: 'load item_index_internal%29#0' with 'load item_index_internal%29#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[6]: 'store tmp%1#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[9]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[6]: 'store close_time_exists%1#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[9]: 'load close_time_exists%1#0' with 'load close_time_exists%1#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[16]: 'store new_state_value%3#0 to l-stack (copy)' debug: Replaced close_block@0.ops[19]: 'load new_state_value%3#0' with 'load new_state_value%3#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[24]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' @@ -1860,8 +1860,8 @@ debug: Inserted voting_open_block@0.ops[3]: 'store app_global_get_ex_did_exist%1 debug: Replaced voting_open_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' debug: Inserted voting_open_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' debug: Replaced voting_open_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' -debug: Inserted voting_open_and_contd@1.ops[3]: 'store tmp%3#0 to l-stack (copy)' -debug: Replaced voting_open_and_contd@1.ops[6]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' +debug: Inserted voting_open_and_contd@1.ops[3]: 'store close_time_exists%3#0 to l-stack (copy)' +debug: Replaced voting_open_and_contd@1.ops[6]: 'load close_time_exists%3#0' with 'load close_time_exists%3#0 from l-stack (no copy)' debug: Inserted voting_open_and_contd@2.ops[12]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced voting_open_and_contd@2.ops[14]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' debug: Inserted voting_open_and_contd@2.ops[3]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index 51bb6df81d..86de47c377 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -8,14 +8,14 @@ AppAccountStateExpression, AppStateKind, BytesEncoding, - ConditionalExpression, Expression, IntegerConstant, Literal, StateDelete, + StateExists, + StateGet, StateGetEx, Statement, - TupleItemExpression, UInt64Constant, ) from puya.awst_build import constants @@ -29,11 +29,7 @@ ) from puya.awst_build.eb.value_proxy import ValueProxyExpressionBuilder from puya.awst_build.eb.var_factory import var_expression -from puya.awst_build.utils import ( - create_temporary_assignment, - expect_operand_wtype, - get_arg_mapping, -) +from puya.awst_build.utils import expect_operand_wtype, get_arg_mapping from puya.errors import CodeError, InternalError from puya.parse import SourceLocation @@ -65,11 +61,9 @@ def index( def contains( self, item: ExpressionBuilder | Literal, location: SourceLocation ) -> ExpressionBuilder: - app_local_get_ex = StateGetEx( - field=_build_field(self.state_decl, item, location), - source_location=location, + exists_expr = StateExists( + field=_build_field(self.state_decl, item, location), source_location=location ) - exists_expr = TupleItemExpression(app_local_get_ex, index=1, source_location=location) return var_expression(exists_expr) def member_access(self, name: str, location: SourceLocation) -> ExpressionBuilder | Literal: @@ -103,21 +97,13 @@ def call( default_expr = expect_operand_wtype( default_arg, target_wtype=self.state_decl.storage_wtype ) - app_local_get_ex = create_temporary_assignment( - _build_app_local_get_ex(self.state_decl, item, location), location - ) - conditional_expr = ConditionalExpression( - location, - wtype=self.state_decl.storage_wtype, - condition=TupleItemExpression( - app_local_get_ex.define, index=1, source_location=location - ), - true_expr=TupleItemExpression( - app_local_get_ex.read, index=0, source_location=location - ), - false_expr=default_expr, + expr = StateGet( + field=_build_field(self.state_decl, item, location), + default=default_expr, + source_location=location, ) - return var_expression(conditional_expr) + + return var_expression(expr) class AppAccountStateMaybeMethodBuilder(IntermediateExpressionBuilder): @@ -135,19 +121,13 @@ def call( ) -> ExpressionBuilder: match args: case [item]: - app_local_get_ex = _build_app_local_get_ex(self.state_decl, item, location) + field = _build_field(self.state_decl, item, location) + app_local_get_ex = StateGetEx(field=field, source_location=location) return var_expression(app_local_get_ex) case _: raise CodeError("Invalid/unhandled arguments", location) -def _build_app_local_get_ex( - state_decl: AppStateDeclaration, item: ExpressionBuilder | Literal, location: SourceLocation -) -> StateGetEx: - field = _build_field(state_decl, item, location) - return StateGetEx(field=field, source_location=location) - - def _validated_index_expr(index: ExpressionBuilder | Literal) -> Expression: # TODO: FIXME tmp: Expression | Literal diff --git a/src/puya/ir/builder/state.py b/src/puya/ir/builder/state.py index 53d53a5a2e..e63b447e54 100644 --- a/src/puya/ir/builder/state.py +++ b/src/puya/ir/builder/state.py @@ -1,4 +1,3 @@ - from puya.avm_type import AVMType from puya.awst import nodes as awst_nodes from puya.ir.avm_ops import AVMOp @@ -99,7 +98,7 @@ def visit_app_account_state_expression( Intrinsic( op=AVMOp.assert_, args=[did_exist_tmp], - comment=f"check {expr.field_name} exists", + comment=f"check {expr.field_name} exists for account", source_location=expr.source_location, ) ) diff --git a/test_cases/abi_routing/out/Reference.approval.mir b/test_cases/abi_routing/out/Reference.approval.mir index 903a457b88..a7fd4fba63 100644 --- a/test_cases/abi_routing/out/Reference.approval.mir +++ b/test_cases/abi_routing/out/Reference.approval.mir @@ -708,7 +708,7 @@ opt_into_asset_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - assert // check value exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 @@ -743,7 +743,7 @@ with_transactions_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.asa abi_routing/contract.py:103 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa abi_routing/contract.py:103 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa abi_routing/contract.py:103 - assert // check value exists // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0 self.asa abi_routing/contract.py:103 + assert // check asa exists // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0 self.asa abi_routing/contract.py:103 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 frame_dig -4 // load asset#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0,asset#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} self.asa == asset, "is correct asset" abi_routing/contract.py:103 diff --git a/test_cases/abi_routing/out/Reference.approval.teal b/test_cases/abi_routing/out/Reference.approval.teal index 3e718326e1..bd0bd3c395 100644 --- a/test_cases/abi_routing/out/Reference.approval.teal +++ b/test_cases/abi_routing/out/Reference.approval.teal @@ -538,7 +538,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in // abi_routing/contract.py:84-85 @@ -590,7 +590,7 @@ with_transactions: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists frame_dig -4 == assert // is correct asset diff --git a/test_cases/abi_routing/out/Reference.arc32.json b/test_cases/abi_routing/out/Reference.arc32.json index 39a7864fb1..5a48f40dd1 100644 --- a/test_cases/abi_routing/out/Reference.arc32.json +++ b/test_cases/abi_routing/out/Reference.arc32.json @@ -136,7 +136,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTgKICAgIG1ldGhvZCAibm9vcF93aXRoX3VpbnQ2NCh1aW50NjQpdWludDgiCiAgICBtZXRob2QgImFsbF90aGVfdGhpbmdzKHVpbnQ2NCl1aW50OCIKICAgIG1ldGhvZCAibWl4ZWRfb2NhKHVpbnQ2NCl1aW50OCIKICAgIG1ldGhvZCAib3B0X2ludG9fYXNzZXQoYXNzZXQpdm9pZCIKICAgIG1ldGhvZCAid2l0aF90cmFuc2FjdGlvbnMoYXNzZXQsdWludDY0LHBheSx1aW50NjQpdm9pZCIKICAgIG1ldGhvZCAiY29tcGFyZV9hc3NldHMoYXNzZXQsYXNzZXQpdm9pZCIKICAgIG1ldGhvZCAiZ2V0X2FkZHJlc3MoKWFkZHJlc3MiCiAgICBtZXRob2QgImdldF9hc3NldCgpdWludDY0IgogICAgbWV0aG9kICJnZXRfYXBwbGljYXRpb24oKXVpbnQ2NCIKICAgIG1ldGhvZCAiZ2V0X2FuX2ludCgpdWludDY0IgogICAgbWV0aG9kICJtZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3MoYXNzZXQsYXNzZXQsYWNjb3VudCxhY2NvdW50LGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uLGJ5dGVbM10sdWludDY0LHVpbnQ2NCl2b2lkIgogICAgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX25vb3Bfd2l0aF91aW50NjRfcm91dGVANCBtYWluX2FsbF90aGVfdGhpbmdzX3JvdXRlQDUgbWFpbl9taXhlZF9vY2Ffcm91dGVANiBtYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDcgbWFpbl93aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA4IG1haW5fY29tcGFyZV9hc3NldHNfcm91dGVAOSBtYWluX2dldF9hZGRyZXNzX3JvdXRlQDEwIG1haW5fZ2V0X2Fzc2V0X3JvdXRlQDExIG1haW5fZ2V0X2FwcGxpY2F0aW9uX3JvdXRlQDEyIG1haW5fZ2V0X2FuX2ludF9yb3V0ZUAxMyBtYWluX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxNCBtYWluX21ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzX3JvdXRlQDE1CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX25vb3Bfd2l0aF91aW50NjRfcm91dGVANDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbm9vcF93aXRoX3VpbnQ2NAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9hbGxfdGhlX3RoaW5nc19yb3V0ZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzYtNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIGZ1bGxfYWJpX2NvbmZpZwogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9taXhlZF9vY2Ffcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUyLTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT1GYWxzZSwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgaW50IDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgaW50IDM3CiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG9uZSBvZiBOb09wLCBDbG9zZU91dCwgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1Mi02MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9RmFsc2UsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIGNhbGxzdWIgbWl4ZWRfb2NhCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3B0X2ludG9fYXNzZXQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVAODoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHdpdGhfdHJhbnNhY3Rpb25zCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNvbXBhcmVfYXNzZXRzCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2dldF9hZGRyZXNzX3JvdXRlQDEwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FkZHJlc3MKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3JvdXRlQDExOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2dldF9hcHBsaWNhdGlvbl9yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcHAKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FuX2ludF9yb3V0ZUAxMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hbl9pbnQiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzX3JvdXRlQDE0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI4LTE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI4LTE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoX2RlZmF1bHRfYXJncwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDggOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMTYgOAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMzIgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgaW50IDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludCAyCiAgICArCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludCA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnQgMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgNDUgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgNTMgOAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE4OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fYmFyZV9hYmlfY29uZmlnQDE5IG1haW5fYmFyZV9hYmlfY29uZmlnQDE5IG1haW5fYmFyZV9hYmlfY29uZmlnQDE5IG1haW5fcmVqZWN0X2JhcmVfb25fY29tcGxldGlvbkAyMCBtYWluX2JhcmVfYWJpX2NvbmZpZ0AxOSBtYWluX2JhcmVfYWJpX2NvbmZpZ0AxOQogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl9iYXJlX2FiaV9jb25maWdAMTk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2NS03NAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPVRydWUsCiAgICAvLyApCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2NS03NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgYmFyZV9hYmlfY29uZmlnKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGJhcmVfYWJpX2NvbmZpZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9yZWplY3RfYmFyZV9vbl9jb21wbGV0aW9uQDIwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzEtMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXN1bHQgPSAxICsgYS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnQgMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5mdWxsX2FiaV9jb25maWcoYTogYnl0ZXMpIC0+IGJ5dGVzOgpmdWxsX2FiaV9jb25maWc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTozNi00OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uT3B0SW4sCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uVXBkYXRlQXBwbGljYXRpb24sCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBuYW1lPSJhbGxfdGhlX3RoaW5ncyIsCiAgICAvLyAgICAgY3JlYXRlPSJhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBmdWxsX2FiaV9jb25maWcoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGludCAxCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmV0dXJuIGFyYzQuVUludDgocmVzdWx0KQogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm1peGVkX29jYShhOiBieXRlcykgLT4gYnl0ZXM6Cm1peGVkX29jYToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUyLTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT1GYWxzZSwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgLy8gZGVmIG1peGVkX29jYShzZWxmLCBhOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50ODoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJlc3VsdCA9IFVJbnQ2NCgxKSArIGEuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50IDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uub3B0X2ludG9fYXNzZXQoYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0X2ludG9fYXNzZXQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OC03OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3B0X2ludG9fYXNzZXQoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IG9wLlR4bi5zZW5kZXIgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgyLTgzCiAgICAvLyAjIFZlcmlmeSBhIEFTQSBoYXNuJ3QgYWxyZWFkeSBiZWVuIG9wdGVkIGludG8KICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc2EsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludCAwCiAgICBieXRlICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo4NC04NQogICAgLy8gIyBTYXZlIEFTQSBJRCBpbiBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhID0gYXNzZXQKICAgIGJ5dGUgImFzYSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg3LTg4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gb3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo4OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyKQogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfZmVlKFVJbnQ2NCgwKSkgICMgY292ZXIgZmVlIHdpdGggb3V0ZXIgdHhuCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9hc3NldF9yZWNlaXZlcihvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X3hmZXJfYXNzZXQoYXNzZXQuYXNzZXRfaWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLndpdGhfdHJhbnNhY3Rpb25zKGFzc2V0OiB1aW50NjQsIGFuX2ludDogYnl0ZXMsIHBheTogdWludDY0LCBhbm90aGVyX2ludDogYnl0ZXMpIC0+IHZvaWQ6CndpdGhfdHJhbnNhY3Rpb25zOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTUtMTAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB3aXRoX3RyYW5zYWN0aW9ucygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBhbl9pbnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYW5vdGhlcl9pbnQ6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gNCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDMKICAgIC8vIGFzc2VydCBzZWxmLmFzYSA9PSBhc3NldCwgImlzIGNvcnJlY3QgYXNzZXQiCiAgICBpbnQgMAogICAgYnl0ZSAiYXNhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtNAogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGFzc2V0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBhbl9pbnQuZGVjb2RlKCkgPT0gMSwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnQgMQogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA1CiAgICAvLyBhc3NlcnQgcGF5LnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJpcyBwYXltZW50IHRvIGFwcCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIHBheW1lbnQgdG8gYXBwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGFzc2VydCBhbm90aGVyX2ludC5kZWNvZGUoKSA9PSAyLCAiaXMgY29ycmVjdCBpbnQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgaW50CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5jb21wYXJlX2Fzc2V0cyhhc3NldF9hOiB1aW50NjQsIGFzc2V0X2I6IHVpbnQ2NCkgLT4gdm9pZDoKY29tcGFyZV9hc3NldHM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDgtMTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjb21wYXJlX2Fzc2V0cyhzZWxmLCBhc3NldF9hOiBBc3NldCwgYXNzZXRfYjogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExMAogICAgLy8gYXNzZXJ0IGFzc2V0X2EgPT0gYXNzZXRfYiwgImFzc2V0IGEgPT0gYiIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgPT0gYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FkZHJlc3MoKSAtPiBieXRlczoKZ2V0X2FkZHJlc3M6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWRkcmVzcyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcy5mcm9tX2J5dGVzKG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMpCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hc3NldCgpIC0+IGJ5dGVzOgpnZXRfYXNzZXQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTYtMTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXQoc2VsZikgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDQ1NikKICAgIGJ5dGUgMHgwMDAwMDAwMDAwMDAwMWM4CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYXBwKCkgLT4gYnl0ZXM6CmdldF9hcHA6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjAtMTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FwcGxpY2F0aW9uIikKICAgIC8vIGRlZiBnZXRfYXBwKHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCg0NTYpCiAgICBieXRlIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FfaW50KCkgLT4gYnl0ZXM6CmdldF9hX2ludDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYW5faW50IikKICAgIC8vIGRlZiBnZXRfYV9pbnQoc2VsZikgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDMpCiAgICBieXRlIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKGFzc2V0X2Zyb21fc3RvcmFnZTogdWludDY0LCBhc3NldF9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGFjY291bnRfZnJvbV9zdG9yYWdlOiBieXRlcywgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBieXRlcywgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYnl0ZXNfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX2Z1bmN0aW9uOiBieXRlcykgLT4gdm9pZDoKbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI4LTE1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9zdG9yYWdlOiBBc3NldCwKICAgIC8vICAgICBhc3NldF9mcm9tX2Z1bmN0aW9uOiBBc3NldCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fc3RvcmFnZTogQWNjb3VudCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fZnVuY3Rpb246IEFjY291bnQsCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBieXRlc19mcm9tX3N0b3JhZ2U6IEJ5dGVzMywKICAgIC8vICAgICBpbnRfZnJvbV9zdG9yYWdlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpbnRfZnJvbV9mdW5jdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fc3RvcmFnZSA9PSBBc3NldCgxMjMpLCAid3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC05CiAgICBpbnQgMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU0CiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9mdW5jdGlvbiA9PSBBc3NldCg0NTYpLCAid3JvbmcgYXNzZXQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtOAogICAgaW50IDQ1NgogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhc3NldCBmcm9tIGZ1bmN0aW9uCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTUKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fc3RvcmFnZSA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAid3JvbmcgYWNjb3VudCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTcKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgYWNjb3VudF9mcm9tX2Z1bmN0aW9uID09IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTYKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhY2NvdW50IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NwogICAgLy8gYXNzZXJ0IGFwcGxpY2F0aW9uX2Zyb21fc3RvcmFnZSA9PSBBcHBsaWNhdGlvbigxMjMpLCAid3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC01CiAgICBpbnQgMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFwcGxpY2F0aW9uIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9mdW5jdGlvbiA9PSBBcHBsaWNhdGlvbig0NTYpLCAid3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50IDQ1NgogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMF0gPT0gYXJjNC5CeXRlKDcpLCAid3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDAgMQogICAgYnl0ZSAweDA3CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzFdID09IGFyYzQuQnl0ZSg4KSwgIndyb25nIDFzdCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAxIDEKICAgIGJ5dGUgMHgwOAogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyAxc3QgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVsyXSA9PSBhcmM0LkJ5dGUoOSksICJ3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAxCiAgICBieXRlIDB4MDkKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgMm5kIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjIKICAgIC8vIGFzc2VydCBpbnRfZnJvbV9zdG9yYWdlLmRlY29kZSgpID09IDIsICJ3cm9uZyBpbnQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBpbnQgMgogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBpbnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIGFzc2VydCBpbnRfZnJvbV9mdW5jdGlvbi5kZWNvZGUoKSA9PSAzLCAid3JvbmcgaW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIGZ1bmN0aW9uCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyhhOiBieXRlcywgYjogYnl0ZXMsIGM6IGJ5dGVzLCBkOiB1aW50NjQsIGFzc2V0OiB1aW50NjQsIGU6IGJ5dGVzLCBmOiBieXRlcywgcGF5OiB1aW50NjQsIGc6IGJ5dGVzLCBoOiBieXRlcywgaTogYnl0ZXMsIGo6IGJ5dGVzLCBrOiBieXRlcywgbDogYnl0ZXMsIG06IGJ5dGVzLCBuOiBieXRlcywgbzogYnl0ZXMsIHA6IHVpbnQ2NCwgcTogYnl0ZXMsIHI6IGJ5dGVzLCBzOiBieXRlcywgdDogYnl0ZXMsIGFzc2V0MjogdWludDY0LCBwYXkyOiB1aW50NjQsIHU6IGJ5dGVzLCB2OiBieXRlcykgLT4gYnl0ZXM6Cm1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTY1LTE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBiOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBjOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkOiBVSW50NjQsCiAgICAvLyAgICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGY6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgZzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgaDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgaTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgajogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgazogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgIyBydWZmOiBub3FhOiBFNzQxCiAgICAvLyAgICAgbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcDogVUludDY0LAogICAgLy8gICAgIHE6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHI6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHM6IEJ5dGVzLAogICAgLy8gICAgIHQ6IEJ5dGVzLAogICAgLy8gICAgIGFzc2V0MjogQXNzZXQsCiAgICAvLyAgICAgcGF5MjogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgdTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgdjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMjYgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NlcnQgb3AuVHhuLm51bV9hcHBfYXJncyA9PSAxNgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludCAxNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBhc3NlcnQgcGF5LmFtb3VudCA9PSAxMDAwMDAKICAgIGZyYW1lX2RpZyAtMTkKICAgIGd0eG5zIEFtb3VudAogICAgaW50IDEwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBhc3NlcnQgcGF5Mi5hbW91bnQgPT0gMjAwMDAwCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFtb3VudAogICAgaW50IDIwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBhc3NlcnQgYXNzZXQuYXNzZXRfaWQKICAgIGZyYW1lX2RpZyAtMjIKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgYXNzZXQyLmFzc2V0X2lkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA2CiAgICAvLyBsb2cocyArIHQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gYS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0yNgogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMjUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMTAKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjExCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMjQKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMTEKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgLy8gKyBjLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjEyCiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICBmcmFtZV9kaWcgLTIzCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMTMKICAgIC8vICsgZS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0yMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIxMwogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMTQKICAgIC8vICsgZi5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0yMAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIxNAogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gKyBnLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTE4CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjE1CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMTYKICAgIC8vICsgaC5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xNwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIxNgogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMTcKICAgIC8vICsgaS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xNgogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIxNwogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gKyBqLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTE1CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjE4CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMTkKICAgIC8vICsgay5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIxOQogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMjAKICAgIC8vICsgbC5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xMwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIyMAogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICAvLyArIGwuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gKyBtLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTEyCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjIxCiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgLy8gKyBtLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMjIKICAgIC8vICsgbi5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIyMgogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICAvLyArIGwuZGVjb2RlKCkKICAgIC8vICsgbS5kZWNvZGUoKQogICAgLy8gKyBuLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMjMKICAgIC8vICsgby5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xMAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIyMwogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICAvLyArIGwuZGVjb2RlKCkKICAgIC8vICsgbS5kZWNvZGUoKQogICAgLy8gKyBuLmRlY29kZSgpCiAgICAvLyArIG8uZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMjQKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgLy8gKyBjLmRlY29kZSgpCiAgICAvLyArIGQKICAgIC8vICsgZS5kZWNvZGUoKQogICAgLy8gKyBmLmRlY29kZSgpCiAgICAvLyArIGcuZGVjb2RlKCkKICAgIC8vICsgaC5kZWNvZGUoKQogICAgLy8gKyBpLmRlY29kZSgpCiAgICAvLyArIGouZGVjb2RlKCkKICAgIC8vICsgay5kZWNvZGUoKQogICAgLy8gKyBsLmRlY29kZSgpCiAgICAvLyArIG0uZGVjb2RlKCkKICAgIC8vICsgbi5kZWNvZGUoKQogICAgLy8gKyBvLmRlY29kZSgpCiAgICAvLyArIHAKICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjI1CiAgICAvLyArIHEuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIyNQogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICAvLyArIGwuZGVjb2RlKCkKICAgIC8vICsgbS5kZWNvZGUoKQogICAgLy8gKyBuLmRlY29kZSgpCiAgICAvLyArIG8uZGVjb2RlKCkKICAgIC8vICsgcAogICAgLy8gKyBxLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMjYKICAgIC8vICsgci5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjI2CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgLy8gKyBtLmRlY29kZSgpCiAgICAvLyArIG4uZGVjb2RlKCkKICAgIC8vICsgby5kZWNvZGUoKQogICAgLy8gKyBwCiAgICAvLyArIHEuZGVjb2RlKCkKICAgIC8vICsgci5kZWNvZGUoKQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyArIHUuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIyNwogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICAvLyArIGwuZGVjb2RlKCkKICAgIC8vICsgbS5kZWNvZGUoKQogICAgLy8gKyBuLmRlY29kZSgpCiAgICAvLyArIG8uZGVjb2RlKCkKICAgIC8vICsgcAogICAgLy8gKyBxLmRlY29kZSgpCiAgICAvLyArIHIuZGVjb2RlKCkKICAgIC8vICsgdS5kZWNvZGUoKQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjI4CiAgICAvLyArIHYuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIyOAogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICAvLyArIGwuZGVjb2RlKCkKICAgIC8vICsgbS5kZWNvZGUoKQogICAgLy8gKyBuLmRlY29kZSgpCiAgICAvLyArIG8uZGVjb2RlKCkKICAgIC8vICsgcAogICAgLy8gKyBxLmRlY29kZSgpCiAgICAvLyArIHIuZGVjb2RlKCkKICAgIC8vICsgdS5kZWNvZGUoKQogICAgLy8gKyB2LmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDgtMjI5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgYS5kZWNvZGUoKQogICAgLy8gICAgICsgYi5kZWNvZGUoKQogICAgLy8gICAgICsgYy5kZWNvZGUoKQogICAgLy8gICAgICsgZAogICAgLy8gICAgICsgZS5kZWNvZGUoKQogICAgLy8gICAgICsgZi5kZWNvZGUoKQogICAgLy8gICAgICsgZy5kZWNvZGUoKQogICAgLy8gICAgICsgaC5kZWNvZGUoKQogICAgLy8gICAgICsgaS5kZWNvZGUoKQogICAgLy8gICAgICsgai5kZWNvZGUoKQogICAgLy8gICAgICsgay5kZWNvZGUoKQogICAgLy8gICAgICsgbC5kZWNvZGUoKQogICAgLy8gICAgICsgbS5kZWNvZGUoKQogICAgLy8gICAgICsgbi5kZWNvZGUoKQogICAgLy8gICAgICsgby5kZWNvZGUoKQogICAgLy8gICAgICsgcAogICAgLy8gICAgICsgcS5kZWNvZGUoKQogICAgLy8gICAgICsgci5kZWNvZGUoKQogICAgLy8gICAgICsgdS5kZWNvZGUoKQogICAgLy8gICAgICsgdi5kZWNvZGUoKQogICAgLy8gKQogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuYmFyZV9hYmlfY29uZmlnKCkgLT4gdm9pZDoKYmFyZV9hYmlfY29uZmlnOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjUtNzUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIk9wdEluIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIlVwZGF0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT1UcnVlLAogICAgLy8gKQogICAgLy8gZGVmIGJhcmVfYWJpX2NvbmZpZyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3NgogICAgLy8gbG9nKGIiSGVsbG8gV29ybGQiKQogICAgYnl0ZSAiSGVsbG8gV29ybGQiCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBzZWxmLmFzYSA9IEFzc2V0KDEyMykKICAgIGJ5dGUgImFzYSIKICAgIGludCAxMjMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNAogICAgLy8gc2VsZi5hbl9pbnQgPSBVSW50NjQoMikKICAgIGJ5dGUgImFuX2ludCIKICAgIGludCAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIHNlbGYuc29tZV9ieXRlcyA9IEJ5dGVzMyhhcmM0LkJ5dGUoNyksIGFyYzQuQnl0ZSg4KSwgYXJjNC5CeXRlKDkpKQogICAgYnl0ZSAic29tZV9ieXRlcyIKICAgIGJ5dGUgMHgwNzA4MDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNgogICAgLy8gc2VsZi5jcmVhdG9yID0gb3AuVHhuLnNlbmRlcgogICAgYnl0ZSAiY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNwogICAgLy8gc2VsZi5hcHAgPSBBcHBsaWNhdGlvbigxMjMpCiAgICBieXRlICJhcHAiCiAgICBpbnQgMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCBhcmM0LmFyYzRfc2lnbmF0dXJlKCJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iKSwgImhhcyBtZXRob2Qgc2VsZWN0b3IiCiAgICBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGxlbgogICAgYXNzZXJ0IC8vIGhhcyBtZXRob2Qgc2VsZWN0b3IKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTgKICAgIG1ldGhvZCAibm9vcF93aXRoX3VpbnQ2NCh1aW50NjQpdWludDgiCiAgICBtZXRob2QgImFsbF90aGVfdGhpbmdzKHVpbnQ2NCl1aW50OCIKICAgIG1ldGhvZCAibWl4ZWRfb2NhKHVpbnQ2NCl1aW50OCIKICAgIG1ldGhvZCAib3B0X2ludG9fYXNzZXQoYXNzZXQpdm9pZCIKICAgIG1ldGhvZCAid2l0aF90cmFuc2FjdGlvbnMoYXNzZXQsdWludDY0LHBheSx1aW50NjQpdm9pZCIKICAgIG1ldGhvZCAiY29tcGFyZV9hc3NldHMoYXNzZXQsYXNzZXQpdm9pZCIKICAgIG1ldGhvZCAiZ2V0X2FkZHJlc3MoKWFkZHJlc3MiCiAgICBtZXRob2QgImdldF9hc3NldCgpdWludDY0IgogICAgbWV0aG9kICJnZXRfYXBwbGljYXRpb24oKXVpbnQ2NCIKICAgIG1ldGhvZCAiZ2V0X2FuX2ludCgpdWludDY0IgogICAgbWV0aG9kICJtZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3MoYXNzZXQsYXNzZXQsYWNjb3VudCxhY2NvdW50LGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uLGJ5dGVbM10sdWludDY0LHVpbnQ2NCl2b2lkIgogICAgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX25vb3Bfd2l0aF91aW50NjRfcm91dGVANCBtYWluX2FsbF90aGVfdGhpbmdzX3JvdXRlQDUgbWFpbl9taXhlZF9vY2Ffcm91dGVANiBtYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDcgbWFpbl93aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA4IG1haW5fY29tcGFyZV9hc3NldHNfcm91dGVAOSBtYWluX2dldF9hZGRyZXNzX3JvdXRlQDEwIG1haW5fZ2V0X2Fzc2V0X3JvdXRlQDExIG1haW5fZ2V0X2FwcGxpY2F0aW9uX3JvdXRlQDEyIG1haW5fZ2V0X2FuX2ludF9yb3V0ZUAxMyBtYWluX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxNCBtYWluX21ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzX3JvdXRlQDE1CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX25vb3Bfd2l0aF91aW50NjRfcm91dGVANDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbm9vcF93aXRoX3VpbnQ2NAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9hbGxfdGhlX3RoaW5nc19yb3V0ZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzYtNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIGZ1bGxfYWJpX2NvbmZpZwogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9taXhlZF9vY2Ffcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUyLTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT1GYWxzZSwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgaW50IDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgaW50IDM3CiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG9uZSBvZiBOb09wLCBDbG9zZU91dCwgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1Mi02MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9RmFsc2UsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIGNhbGxzdWIgbWl4ZWRfb2NhCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3B0X2ludG9fYXNzZXQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVAODoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHdpdGhfdHJhbnNhY3Rpb25zCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNvbXBhcmVfYXNzZXRzCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2dldF9hZGRyZXNzX3JvdXRlQDEwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FkZHJlc3MKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3JvdXRlQDExOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2dldF9hcHBsaWNhdGlvbl9yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcHAKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FuX2ludF9yb3V0ZUAxMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hbl9pbnQiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzX3JvdXRlQDE0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI4LTE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI4LTE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoX2RlZmF1bHRfYXJncwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMQogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDggOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMTYgOAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMzIgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgaW50IDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludCAyCiAgICArCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludCA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnQgMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnQgMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50IHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgNDUgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgNTMgOAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE4OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fYmFyZV9hYmlfY29uZmlnQDE5IG1haW5fYmFyZV9hYmlfY29uZmlnQDE5IG1haW5fYmFyZV9hYmlfY29uZmlnQDE5IG1haW5fcmVqZWN0X2JhcmVfb25fY29tcGxldGlvbkAyMCBtYWluX2JhcmVfYWJpX2NvbmZpZ0AxOSBtYWluX2JhcmVfYWJpX2NvbmZpZ0AxOQogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl9iYXJlX2FiaV9jb25maWdAMTk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2NS03NAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPVRydWUsCiAgICAvLyApCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2NS03NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgYmFyZV9hYmlfY29uZmlnKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGJhcmVfYWJpX2NvbmZpZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9yZWplY3RfYmFyZV9vbl9jb21wbGV0aW9uQDIwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzEtMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXN1bHQgPSAxICsgYS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnQgMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5mdWxsX2FiaV9jb25maWcoYTogYnl0ZXMpIC0+IGJ5dGVzOgpmdWxsX2FiaV9jb25maWc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTozNi00OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uT3B0SW4sCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uVXBkYXRlQXBwbGljYXRpb24sCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBuYW1lPSJhbGxfdGhlX3RoaW5ncyIsCiAgICAvLyAgICAgY3JlYXRlPSJhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBmdWxsX2FiaV9jb25maWcoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGludCAxCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmV0dXJuIGFyYzQuVUludDgocmVzdWx0KQogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm1peGVkX29jYShhOiBieXRlcykgLT4gYnl0ZXM6Cm1peGVkX29jYToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUyLTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT1GYWxzZSwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgLy8gZGVmIG1peGVkX29jYShzZWxmLCBhOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50ODoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJlc3VsdCA9IFVJbnQ2NCgxKSArIGEuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50IDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uub3B0X2ludG9fYXNzZXQoYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0X2ludG9fYXNzZXQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OC03OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3B0X2ludG9fYXNzZXQoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IG9wLlR4bi5zZW5kZXIgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgyLTgzCiAgICAvLyAjIFZlcmlmeSBhIEFTQSBoYXNuJ3QgYWxyZWFkeSBiZWVuIG9wdGVkIGludG8KICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc2EsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludCAwCiAgICBieXRlICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzYSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBBU0EgYWxyZWFkeSBvcHRlZCBpbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODQtODUKICAgIC8vICMgU2F2ZSBBU0EgSUQgaW4gZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLmFzYSA9IGFzc2V0CiAgICBieXRlICJhc2EiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo4Ny04OAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIG9wLklUeG5DcmVhdGUuYmVnaW4oKQogICAgaXR4bl9iZWdpbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShUcmFuc2FjdGlvblR5cGUuQXNzZXRUcmFuc2ZlcikKICAgIGludCBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X2ZlZShVSW50NjQoMCkpICAjIGNvdmVyIGZlZSB3aXRoIG91dGVyIHR4bgogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfYXNzZXRfcmVjZWl2ZXIob3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF94ZmVyX2Fzc2V0KGFzc2V0LmFzc2V0X2lkKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTMKICAgIC8vIG9wLklUeG5DcmVhdGUuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS53aXRoX3RyYW5zYWN0aW9ucyhhc3NldDogdWludDY0LCBhbl9pbnQ6IGJ5dGVzLCBwYXk6IHVpbnQ2NCwgYW5vdGhlcl9pbnQ6IGJ5dGVzKSAtPiB2b2lkOgp3aXRoX3RyYW5zYWN0aW9uczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk1LTEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgd2l0aF90cmFuc2FjdGlvbnMoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhc3NldDogQXNzZXQsCiAgICAvLyAgICAgYW5faW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIGFub3RoZXJfaW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5hc2EgPT0gYXNzZXQsICJpcyBjb3JyZWN0IGFzc2V0IgogICAgaW50IDAKICAgIGJ5dGUgImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXNhIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgYXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IGFuX2ludC5kZWNvZGUoKSA9PSAxLCAiaXMgY29ycmVjdCBpbnQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ0b2kKICAgIGludCAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgaW50CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBwYXkucmVjZWl2ZXIgPT0gb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgImlzIHBheW1lbnQgdG8gYXBwIgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gaXMgcGF5bWVudCB0byBhcHAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gYXNzZXJ0IGFub3RoZXJfaW50LmRlY29kZSgpID09IDIsICJpcyBjb3JyZWN0IGludCIKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaXMgY29ycmVjdCBpbnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmNvbXBhcmVfYXNzZXRzKGFzc2V0X2E6IHVpbnQ2NCwgYXNzZXRfYjogdWludDY0KSAtPiB2b2lkOgpjb21wYXJlX2Fzc2V0czoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNvbXBhcmVfYXNzZXRzKHNlbGYsIGFzc2V0X2E6IEFzc2V0LCBhc3NldF9iOiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgYXNzZXRfYSA9PSBhc3NldF9iLCAiYXNzZXQgYSA9PSBiIgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSA9PSBiCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYWRkcmVzcygpIC0+IGJ5dGVzOgpnZXRfYWRkcmVzczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hZGRyZXNzKHNlbGYpIC0+IGFyYzQuQWRkcmVzczoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE0CiAgICAvLyByZXR1cm4gYXJjNC5BZGRyZXNzLmZyb21fYnl0ZXMob3AuR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcykKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2Fzc2V0KCkgLT4gYnl0ZXM6CmdldF9hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNi0xMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZSAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hcHAoKSAtPiBieXRlczoKZ2V0X2FwcDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYXBwbGljYXRpb24iKQogICAgLy8gZGVmIGdldF9hcHAoc2VsZikgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDQ1NikKICAgIGJ5dGUgMHgwMDAwMDAwMDAwMDAwMWM4CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYV9pbnQoKSAtPiBieXRlczoKZ2V0X2FfaW50OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI0LTEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hbl9pbnQiKQogICAgLy8gZGVmIGdldF9hX2ludChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoMykKICAgIGJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3MoYXNzZXRfZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFzc2V0X2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYWNjb3VudF9mcm9tX3N0b3JhZ2U6IGJ5dGVzLCBhY2NvdW50X2Zyb21fZnVuY3Rpb246IGJ5dGVzLCBhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2U6IHVpbnQ2NCwgYXBwbGljYXRpb25fZnJvbV9mdW5jdGlvbjogdWludDY0LCBieXRlc19mcm9tX3N0b3JhZ2U6IGJ5dGVzLCBpbnRfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fZnVuY3Rpb246IGJ5dGVzKSAtPiB2b2lkOgptZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3M6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjgtMTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fc3RvcmFnZSI6ICJhc2EiLAogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9mdW5jdGlvbiI6IGdldF9hc3NldCwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9zdG9yYWdlIjogImNyZWF0b3IiLAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX2Z1bmN0aW9uIjogImdldF9hZGRyZXNzIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fc3RvcmFnZSI6ICJhcHAiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9mdW5jdGlvbiI6IGdldF9hcHAsCiAgICAvLyAgICAgICAgICJieXRlc19mcm9tX3N0b3JhZ2UiOiAic29tZV9ieXRlcyIsCiAgICAvLyAgICAgICAgICJpbnRfZnJvbV9zdG9yYWdlIjogImFuX2ludCIsCiAgICAvLyAgICAgICAgICJpbnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYV9pbnQiLAogICAgLy8gICAgIH0KICAgIC8vICkKICAgIC8vIGRlZiBtZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhc3NldF9mcm9tX3N0b3JhZ2U6IEFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Zyb21fZnVuY3Rpb246IEFzc2V0LAogICAgLy8gICAgIGFjY291bnRfZnJvbV9zdG9yYWdlOiBBY2NvdW50LAogICAgLy8gICAgIGFjY291bnRfZnJvbV9mdW5jdGlvbjogQWNjb3VudCwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2U6IEFwcGxpY2F0aW9uLAogICAgLy8gICAgIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IEFwcGxpY2F0aW9uLAogICAgLy8gICAgIGJ5dGVzX2Zyb21fc3RvcmFnZTogQnl0ZXMzLAogICAgLy8gICAgIGludF9mcm9tX3N0b3JhZ2U6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGludF9mcm9tX2Z1bmN0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDkgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9zdG9yYWdlID09IEFzc2V0KDEyMyksICJ3cm9uZyBhc3NldCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTkKICAgIGludCAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBhc3NldF9mcm9tX2Z1bmN0aW9uID09IEFzc2V0KDQ1NiksICJ3cm9uZyBhc3NldCBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC04CiAgICBpbnQgNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gYXNzZXJ0IGFjY291bnRfZnJvbV9zdG9yYWdlID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtNwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fZnVuY3Rpb24gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgIndyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlID09IEFwcGxpY2F0aW9uKDEyMyksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTUKICAgIGludCAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTgKICAgIC8vIGFzc2VydCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uID09IEFwcGxpY2F0aW9uKDQ1NiksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC00CiAgICBpbnQgNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFwcGxpY2F0aW9uIGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVswXSA9PSBhcmM0LkJ5dGUoNyksICJ3cm9uZyAwdGggYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMCAxCiAgICBieXRlIDB4MDcKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMV0gPT0gYXJjNC5CeXRlKDgpLCAid3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDEgMQogICAgYnl0ZSAweDA4CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIDFzdCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzJdID09IGFyYzQuQnl0ZSg5KSwgIndyb25nIDJuZCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDEKICAgIGJ5dGUgMHgwOQogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNzZXJ0IGludF9mcm9tX3N0b3JhZ2UuZGVjb2RlKCkgPT0gMiwgIndyb25nIGludCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gYXNzZXJ0IGludF9mcm9tX2Z1bmN0aW9uLmRlY29kZSgpID09IDMsICJ3cm9uZyBpbnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50IDMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgaW50IGZyb20gZnVuY3Rpb24KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKGE6IGJ5dGVzLCBiOiBieXRlcywgYzogYnl0ZXMsIGQ6IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCwgZTogYnl0ZXMsIGY6IGJ5dGVzLCBwYXk6IHVpbnQ2NCwgZzogYnl0ZXMsIGg6IGJ5dGVzLCBpOiBieXRlcywgajogYnl0ZXMsIGs6IGJ5dGVzLCBsOiBieXRlcywgbTogYnl0ZXMsIG46IGJ5dGVzLCBvOiBieXRlcywgcDogdWludDY0LCBxOiBieXRlcywgcjogYnl0ZXMsIHM6IGJ5dGVzLCB0OiBieXRlcywgYXNzZXQyOiB1aW50NjQsIHBheTI6IHVpbnQ2NCwgdTogYnl0ZXMsIHY6IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3M6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjUtMTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGE6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGI6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGM6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGQ6IFVJbnQ2NCwKICAgIC8vICAgICBhc3NldDogQXNzZXQsCiAgICAvLyAgICAgZTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBnOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBoOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBqOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBrOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICAjIHJ1ZmY6IG5vcWE6IEU3NDEKICAgIC8vICAgICBsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBuOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBvOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwOiBVSW50NjQsCiAgICAvLyAgICAgcTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgczogQnl0ZXMsCiAgICAvLyAgICAgdDogQnl0ZXMsCiAgICAvLyAgICAgYXNzZXQyOiBBc3NldCwKICAgIC8vICAgICBwYXkyOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICB1OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICB2OiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyNiAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGFzc2VydCBvcC5UeG4ubnVtX2FwcF9hcmdzID09IDE2CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50IDE2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEwMDAwMAogICAgZnJhbWVfZGlnIC0xOQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnQgMTAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGFzc2VydCBwYXkyLmFtb3VudCA9PSAyMDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICBpbnQgMjAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDMKICAgIC8vIGFzc2VydCBhc3NldC5hc3NldF9pZAogICAgZnJhbWVfZGlnIC0yMgogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGFzc2VydCBhc3NldDIuYXNzZXRfaWQKICAgIGZyYW1lX2RpZyAtNAogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGxvZyhzICsgdCkKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBhLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTI2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMTAKICAgIC8vICsgYi5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0yNQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIxMAogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMTEKICAgIC8vICsgYy5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0yNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIxMQogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMTIKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgLy8gKyBjLmRlY29kZSgpCiAgICAvLyArIGQKICAgIGZyYW1lX2RpZyAtMjMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gKyBlLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTIxCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjEzCiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gKyBmLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTIwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjE0CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyArIGcuZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMTUKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgLy8gKyBjLmRlY29kZSgpCiAgICAvLyArIGQKICAgIC8vICsgZS5kZWNvZGUoKQogICAgLy8gKyBmLmRlY29kZSgpCiAgICAvLyArIGcuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gKyBoLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTE3CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjE2CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gKyBpLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTE2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjE3CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyArIGouZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMTUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMTgKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgLy8gKyBjLmRlY29kZSgpCiAgICAvLyArIGQKICAgIC8vICsgZS5kZWNvZGUoKQogICAgLy8gKyBmLmRlY29kZSgpCiAgICAvLyArIGcuZGVjb2RlKCkKICAgIC8vICsgaC5kZWNvZGUoKQogICAgLy8gKyBpLmRlY29kZSgpCiAgICAvLyArIGouZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIxOQogICAgLy8gKyBrLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTE0CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjE5CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gKyBsLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTEzCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjIwCiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyArIG0uZGVjb2RlKCkKICAgIGZyYW1lX2RpZyAtMTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMjEKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgLy8gKyBjLmRlY29kZSgpCiAgICAvLyArIGQKICAgIC8vICsgZS5kZWNvZGUoKQogICAgLy8gKyBmLmRlY29kZSgpCiAgICAvLyArIGcuZGVjb2RlKCkKICAgIC8vICsgaC5kZWNvZGUoKQogICAgLy8gKyBpLmRlY29kZSgpCiAgICAvLyArIGouZGVjb2RlKCkKICAgIC8vICsgay5kZWNvZGUoKQogICAgLy8gKyBsLmRlY29kZSgpCiAgICAvLyArIG0uZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gKyBuLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTExCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjIyCiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgLy8gKyBtLmRlY29kZSgpCiAgICAvLyArIG4uZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gKyBvLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTEwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjIzCiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgLy8gKyBtLmRlY29kZSgpCiAgICAvLyArIG4uZGVjb2RlKCkKICAgIC8vICsgby5kZWNvZGUoKQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA5LTIyNAogICAgLy8gYS5kZWNvZGUoKQogICAgLy8gKyBiLmRlY29kZSgpCiAgICAvLyArIGMuZGVjb2RlKCkKICAgIC8vICsgZAogICAgLy8gKyBlLmRlY29kZSgpCiAgICAvLyArIGYuZGVjb2RlKCkKICAgIC8vICsgZy5kZWNvZGUoKQogICAgLy8gKyBoLmRlY29kZSgpCiAgICAvLyArIGkuZGVjb2RlKCkKICAgIC8vICsgai5kZWNvZGUoKQogICAgLy8gKyBrLmRlY29kZSgpCiAgICAvLyArIGwuZGVjb2RlKCkKICAgIC8vICsgbS5kZWNvZGUoKQogICAgLy8gKyBuLmRlY29kZSgpCiAgICAvLyArIG8uZGVjb2RlKCkKICAgIC8vICsgcAogICAgZnJhbWVfZGlnIC05CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMjUKICAgIC8vICsgcS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjI1CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgLy8gKyBtLmRlY29kZSgpCiAgICAvLyArIG4uZGVjb2RlKCkKICAgIC8vICsgby5kZWNvZGUoKQogICAgLy8gKyBwCiAgICAvLyArIHEuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gKyByLmRlY29kZSgpCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOS0yMjYKICAgIC8vIGEuZGVjb2RlKCkKICAgIC8vICsgYi5kZWNvZGUoKQogICAgLy8gKyBjLmRlY29kZSgpCiAgICAvLyArIGQKICAgIC8vICsgZS5kZWNvZGUoKQogICAgLy8gKyBmLmRlY29kZSgpCiAgICAvLyArIGcuZGVjb2RlKCkKICAgIC8vICsgaC5kZWNvZGUoKQogICAgLy8gKyBpLmRlY29kZSgpCiAgICAvLyArIGouZGVjb2RlKCkKICAgIC8vICsgay5kZWNvZGUoKQogICAgLy8gKyBsLmRlY29kZSgpCiAgICAvLyArIG0uZGVjb2RlKCkKICAgIC8vICsgbi5kZWNvZGUoKQogICAgLy8gKyBvLmRlY29kZSgpCiAgICAvLyArIHAKICAgIC8vICsgcS5kZWNvZGUoKQogICAgLy8gKyByLmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMjcKICAgIC8vICsgdS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjI3CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgLy8gKyBtLmRlY29kZSgpCiAgICAvLyArIG4uZGVjb2RlKCkKICAgIC8vICsgby5kZWNvZGUoKQogICAgLy8gKyBwCiAgICAvLyArIHEuZGVjb2RlKCkKICAgIC8vICsgci5kZWNvZGUoKQogICAgLy8gKyB1LmRlY29kZSgpCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMjgKICAgIC8vICsgdi5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDktMjI4CiAgICAvLyBhLmRlY29kZSgpCiAgICAvLyArIGIuZGVjb2RlKCkKICAgIC8vICsgYy5kZWNvZGUoKQogICAgLy8gKyBkCiAgICAvLyArIGUuZGVjb2RlKCkKICAgIC8vICsgZi5kZWNvZGUoKQogICAgLy8gKyBnLmRlY29kZSgpCiAgICAvLyArIGguZGVjb2RlKCkKICAgIC8vICsgaS5kZWNvZGUoKQogICAgLy8gKyBqLmRlY29kZSgpCiAgICAvLyArIGsuZGVjb2RlKCkKICAgIC8vICsgbC5kZWNvZGUoKQogICAgLy8gKyBtLmRlY29kZSgpCiAgICAvLyArIG4uZGVjb2RlKCkKICAgIC8vICsgby5kZWNvZGUoKQogICAgLy8gKyBwCiAgICAvLyArIHEuZGVjb2RlKCkKICAgIC8vICsgci5kZWNvZGUoKQogICAgLy8gKyB1LmRlY29kZSgpCiAgICAvLyArIHYuZGVjb2RlKCkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwOC0yMjkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBhLmRlY29kZSgpCiAgICAvLyAgICAgKyBiLmRlY29kZSgpCiAgICAvLyAgICAgKyBjLmRlY29kZSgpCiAgICAvLyAgICAgKyBkCiAgICAvLyAgICAgKyBlLmRlY29kZSgpCiAgICAvLyAgICAgKyBmLmRlY29kZSgpCiAgICAvLyAgICAgKyBnLmRlY29kZSgpCiAgICAvLyAgICAgKyBoLmRlY29kZSgpCiAgICAvLyAgICAgKyBpLmRlY29kZSgpCiAgICAvLyAgICAgKyBqLmRlY29kZSgpCiAgICAvLyAgICAgKyBrLmRlY29kZSgpCiAgICAvLyAgICAgKyBsLmRlY29kZSgpCiAgICAvLyAgICAgKyBtLmRlY29kZSgpCiAgICAvLyAgICAgKyBuLmRlY29kZSgpCiAgICAvLyAgICAgKyBvLmRlY29kZSgpCiAgICAvLyAgICAgKyBwCiAgICAvLyAgICAgKyBxLmRlY29kZSgpCiAgICAvLyAgICAgKyByLmRlY29kZSgpCiAgICAvLyAgICAgKyB1LmRlY29kZSgpCiAgICAvLyAgICAgKyB2LmRlY29kZSgpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5iYXJlX2FiaV9jb25maWcoKSAtPiB2b2lkOgpiYXJlX2FiaV9jb25maWc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2NS03NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgYmFyZV9hYmlfY29uZmlnKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBsb2coYiJIZWxsbyBXb3JsZCIpCiAgICBieXRlICJIZWxsbyBXb3JsZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjMKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoMTIzKQogICAgYnl0ZSAiYXNhIgogICAgaW50IDEyMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBzZWxmLmFuX2ludCA9IFVJbnQ2NCgyKQogICAgYnl0ZSAiYW5faW50IgogICAgaW50IDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNQogICAgLy8gc2VsZi5zb21lX2J5dGVzID0gQnl0ZXMzKGFyYzQuQnl0ZSg3KSwgYXJjNC5CeXRlKDgpLCBhcmM0LkJ5dGUoOSkpCiAgICBieXRlICJzb21lX2J5dGVzIgogICAgYnl0ZSAweDA3MDgwOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBieXRlICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmFwcCA9IEFwcGxpY2F0aW9uKDEyMykKICAgIGJ5dGUgImFwcCIKICAgIGludCAxMjMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IGFyYzQuYXJjNF9zaWduYXR1cmUoImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIpLCAiaGFzIG1ldGhvZCBzZWxlY3RvciIKICAgIG1ldGhvZCAiZ2V0KHVpbnQ2NCxieXRlW10pYnl0ZVtdIgogICAgbGVuCiAgICBhc3NlcnQgLy8gaGFzIG1ldGhvZCBzZWxlY3RvcgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjEKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo=" }, "state": { diff --git a/test_cases/abi_routing/out/Reference.destructured.ir b/test_cases/abi_routing/out/Reference.destructured.ir index 762df98f5b..1d94fe44a0 100644 --- a/test_cases/abi_routing/out/Reference.destructured.ir +++ b/test_cases/abi_routing/out/Reference.destructured.ir @@ -265,7 +265,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -281,7 +281,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/abi_routing/out/Reference.ssa.ir b/test_cases/abi_routing/out/Reference.ssa.ir index d7d0f84f9e..f3183f48ff 100644 --- a/test_cases/abi_routing/out/Reference.ssa.ir +++ b/test_cases/abi_routing/out/Reference.ssa.ir @@ -274,7 +274,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -290,7 +290,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir index b71f86c285..f6ccd1bdc6 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir @@ -265,7 +265,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -281,7 +281,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir index 43279cfb54..7d9e00081f 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir @@ -265,7 +265,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -281,7 +281,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir index c5e2d12185..78d2e16cda 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir @@ -265,7 +265,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -281,7 +281,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir index c729da30ab..50205de6b2 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir @@ -265,7 +265,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -281,7 +281,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/abi_routing/out_O2/Reference.approval.teal b/test_cases/abi_routing/out_O2/Reference.approval.teal index 8aa3c9c624..07e8849f3b 100644 --- a/test_cases/abi_routing/out_O2/Reference.approval.teal +++ b/test_cases/abi_routing/out_O2/Reference.approval.teal @@ -355,7 +355,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in byte "asa" @@ -380,7 +380,7 @@ with_transactions: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists frame_dig -4 == assert // is correct asset diff --git a/test_cases/abi_routing/out_O2/Reference.destructured.ir b/test_cases/abi_routing/out_O2/Reference.destructured.ir index 762df98f5b..1d94fe44a0 100644 --- a/test_cases/abi_routing/out_O2/Reference.destructured.ir +++ b/test_cases/abi_routing/out_O2/Reference.destructured.ir @@ -265,7 +265,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -281,7 +281,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/abi_routing/out_unoptimized/Reference.approval.teal b/test_cases/abi_routing/out_unoptimized/Reference.approval.teal index ee9340d427..fd334549f1 100644 --- a/test_cases/abi_routing/out_unoptimized/Reference.approval.teal +++ b/test_cases/abi_routing/out_unoptimized/Reference.approval.teal @@ -630,7 +630,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in // abi_routing/contract.py:84-85 @@ -682,7 +682,7 @@ with_transactions: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists frame_dig -4 == assert // is correct asset diff --git a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir index 33769c3a15..626c0fb6c1 100644 --- a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir +++ b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir @@ -277,7 +277,7 @@ contract test_cases.abi_routing.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -293,7 +293,7 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) diff --git a/test_cases/asset/out/Reference.approval.mir b/test_cases/asset/out/Reference.approval.mir index 1871676d51..519acc7c34 100644 --- a/test_cases/asset/out/Reference.approval.mir +++ b/test_cases/asset/out/Reference.approval.mir @@ -84,7 +84,7 @@ opt_into_asset_block@0: // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - assert // check value exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 @@ -119,7 +119,7 @@ is_opted_asset_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.asa asset/contract.py:54 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa asset/contract.py:54 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa asset/contract.py:54 - assert // check value exists // (𝕡) asset#0 | app_global_get_ex_value%0#0 self.asa asset/contract.py:54 + assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%0#0 self.asa asset/contract.py:54 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%0#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | app_global_get_ex_value%0#0,asset#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 == // (𝕡) asset#0 | {==} self.asa == asset, "asset self.asa == asset" asset/contract.py:54 diff --git a/test_cases/asset/out/Reference.approval.teal b/test_cases/asset/out/Reference.approval.teal index 2b24af0157..db67e72f3d 100644 --- a/test_cases/asset/out/Reference.approval.teal +++ b/test_cases/asset/out/Reference.approval.teal @@ -66,7 +66,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in // asset/contract.py:41-42 @@ -112,7 +112,7 @@ is_opted_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists frame_dig -1 == assert // asset self.asa == asset diff --git a/test_cases/asset/out/Reference.destructured.ir b/test_cases/asset/out/Reference.destructured.ir index c9de38e2cd..2ebc8010bd 100644 --- a/test_cases/asset/out/Reference.destructured.ir +++ b/test_cases/asset/out/Reference.destructured.ir @@ -36,7 +36,7 @@ contract test_cases.asset.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -52,7 +52,7 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) diff --git a/test_cases/asset/out/Reference.ssa.ir b/test_cases/asset/out/Reference.ssa.ir index 3591051db8..757de16c9b 100644 --- a/test_cases/asset/out/Reference.ssa.ir +++ b/test_cases/asset/out/Reference.ssa.ir @@ -43,7 +43,7 @@ contract test_cases.asset.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -59,7 +59,7 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) diff --git a/test_cases/asset/out/Reference.ssa.opt_pass_1.ir b/test_cases/asset/out/Reference.ssa.opt_pass_1.ir index 8134699828..ad249bf7aa 100644 --- a/test_cases/asset/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/asset/out/Reference.ssa.opt_pass_1.ir @@ -36,7 +36,7 @@ contract test_cases.asset.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -52,7 +52,7 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) diff --git a/test_cases/asset/out_O2/Reference.approval.teal b/test_cases/asset/out_O2/Reference.approval.teal index eb718494ed..796fc2be7f 100644 --- a/test_cases/asset/out_O2/Reference.approval.teal +++ b/test_cases/asset/out_O2/Reference.approval.teal @@ -41,7 +41,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in byte "asa" @@ -66,7 +66,7 @@ is_opted_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists frame_dig -1 == assert // asset self.asa == asset diff --git a/test_cases/asset/out_O2/Reference.destructured.ir b/test_cases/asset/out_O2/Reference.destructured.ir index c9de38e2cd..2ebc8010bd 100644 --- a/test_cases/asset/out_O2/Reference.destructured.ir +++ b/test_cases/asset/out_O2/Reference.destructured.ir @@ -36,7 +36,7 @@ contract test_cases.asset.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -52,7 +52,7 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) diff --git a/test_cases/asset/out_unoptimized/Reference.approval.teal b/test_cases/asset/out_unoptimized/Reference.approval.teal index 5f6c6a51d7..45969c49d7 100644 --- a/test_cases/asset/out_unoptimized/Reference.approval.teal +++ b/test_cases/asset/out_unoptimized/Reference.approval.teal @@ -76,7 +76,7 @@ opt_into_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists ! assert // ASA already opted in // asset/contract.py:41-42 @@ -122,7 +122,7 @@ is_opted_asset: int 0 byte "asa" app_global_get_ex - assert // check value exists + assert // check asa exists frame_dig -1 == assert // asset self.asa == asset diff --git a/test_cases/asset/out_unoptimized/Reference.destructured.ir b/test_cases/asset/out_unoptimized/Reference.destructured.ir index 2bdd965856..28685b4e91 100644 --- a/test_cases/asset/out_unoptimized/Reference.destructured.ir +++ b/test_cases/asset/out_unoptimized/Reference.destructured.ir @@ -43,7 +43,7 @@ contract test_cases.asset.contract.Reference: let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check value exists + (assert app_global_get_ex_did_exist%4#0) // check asa exists let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) @@ -59,7 +59,7 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check asa exists let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) diff --git a/test_cases/augmented_assignment/out/Augmented.approval.mir b/test_cases/augmented_assignment/out/Augmented.approval.mir index 8926ab9b8b..39557daf6f 100644 --- a/test_cases/augmented_assignment/out/Augmented.approval.mir +++ b/test_cases/augmented_assignment/out/Augmented.approval.mir @@ -68,7 +68,7 @@ main_if_body@5: // virtual: store app_local_get_ex_did_exist%6#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_did_exist%6#0,{app_local_get_ex}.0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 // virtual: store app_local_get_ex_value%5#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0,app_local_get_ex_did_exist%6#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 // virtual: load app_local_get_ex_did_exist%6#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0,app_local_get_ex_did_exist%6#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - assert // check value exists // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + assert // check my_uint exists for account // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 // virtual: load app_local_get_ex_value%5#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 dig 1 // load n#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0,n#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{+} # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 @@ -84,7 +84,7 @@ main_if_body@5: // virtual: store app_local_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_did_exist%9#0,{app_local_get_ex}.0 self.my_bytes[me] augmented_assignment/contract.py:33 // virtual: store app_local_get_ex_value%8#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0,app_local_get_ex_did_exist%9#0 self.my_bytes[me] augmented_assignment/contract.py:33 // virtual: load app_local_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0,app_local_get_ex_did_exist%9#0 self.my_bytes[me] augmented_assignment/contract.py:33 - assert // check value exists // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0 self.my_bytes[me] augmented_assignment/contract.py:33 + assert // check my_bytes exists for account // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0 self.my_bytes[me] augmented_assignment/contract.py:33 // virtual: load app_local_get_ex_value%8#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 dig 3 // load bytes_to_add#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0,bytes_to_add#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 concat // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{concat} self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 @@ -99,7 +99,7 @@ main_if_body@5: // virtual: store app_global_get_ex_did_exist%12#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_did_exist%12#0,{app_global_get_ex}.0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 // virtual: store app_global_get_ex_value%11#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 // virtual: load app_global_get_ex_did_exist%12#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - assert // check value exists // (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + assert // check global_uint exists // (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 // virtual: load app_global_get_ex_value%11#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 swap // load n#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%11#0,n#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 + // (𝕗) me#0 | bytes_to_add#0,{+} # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 @@ -113,7 +113,7 @@ main_if_body@5: // virtual: store app_global_get_ex_did_exist%15#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_did_exist%15#0,{app_global_get_ex}.0 self.global_bytes augmented_assignment/contract.py:37 // virtual: store app_global_get_ex_value%14#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.global_bytes augmented_assignment/contract.py:37 // virtual: load app_global_get_ex_did_exist%15#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.global_bytes augmented_assignment/contract.py:37 - assert // check value exists // (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0 self.global_bytes augmented_assignment/contract.py:37 + assert // check global_bytes exists // (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0 self.global_bytes augmented_assignment/contract.py:37 // virtual: load app_global_get_ex_value%14#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 swap // load bytes_to_add#0 from l-stack (no copy) (𝕗) me#0 | app_global_get_ex_value%14#0,bytes_to_add#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 concat // (𝕗) me#0 | {concat} self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 diff --git a/test_cases/augmented_assignment/out/Augmented.approval.teal b/test_cases/augmented_assignment/out/Augmented.approval.teal index ce1a917c9b..50ae84d096 100644 --- a/test_cases/augmented_assignment/out/Augmented.approval.teal +++ b/test_cases/augmented_assignment/out/Augmented.approval.teal @@ -55,7 +55,7 @@ main_after_if_else@4: int 0 byte "my_uint" app_local_get_ex - assert // check value exists + assert // check my_uint exists for account dig 1 + dig 2 @@ -68,7 +68,7 @@ main_after_if_else@4: int 0 byte "my_bytes" app_local_get_ex - assert // check value exists + assert // check my_bytes exists for account dig 3 concat uncover 2 @@ -81,7 +81,7 @@ main_after_if_else@4: int 0 byte "global_uint" app_global_get_ex - assert // check value exists + assert // check global_uint exists + byte "global_uint" swap @@ -91,7 +91,7 @@ main_after_if_else@4: int 0 byte "global_bytes" app_global_get_ex - assert // check value exists + assert // check global_bytes exists swap concat byte "global_bytes" diff --git a/test_cases/augmented_assignment/out/Augmented.destructured.ir b/test_cases/augmented_assignment/out/Augmented.destructured.ir index 99e3d4ac3f..e34cbe0600 100644 --- a/test_cases/augmented_assignment/out/Augmented.destructured.ir +++ b/test_cases/augmented_assignment/out/Augmented.destructured.ir @@ -24,19 +24,19 @@ contract test_cases.augmented_assignment.contract.Augmented: let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check value exists + (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check value exists + (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check global_uint exists let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 diff --git a/test_cases/augmented_assignment/out/Augmented.ssa.ir b/test_cases/augmented_assignment/out/Augmented.ssa.ir index 99e3d4ac3f..e34cbe0600 100644 --- a/test_cases/augmented_assignment/out/Augmented.ssa.ir +++ b/test_cases/augmented_assignment/out/Augmented.ssa.ir @@ -24,19 +24,19 @@ contract test_cases.augmented_assignment.contract.Augmented: let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check value exists + (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check value exists + (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check global_uint exists let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 diff --git a/test_cases/augmented_assignment/out_O2/Augmented.approval.teal b/test_cases/augmented_assignment/out_O2/Augmented.approval.teal index f9b3c692ab..1576aa7a04 100644 --- a/test_cases/augmented_assignment/out_O2/Augmented.approval.teal +++ b/test_cases/augmented_assignment/out_O2/Augmented.approval.teal @@ -36,7 +36,7 @@ main_after_if_else@4: int 0 byte "my_uint" app_local_get_ex - assert // check value exists + assert // check my_uint exists for account dig 1 + dig 2 @@ -47,7 +47,7 @@ main_after_if_else@4: int 0 byte "my_bytes" app_local_get_ex - assert // check value exists + assert // check my_bytes exists for account dig 3 concat uncover 2 @@ -57,7 +57,7 @@ main_after_if_else@4: int 0 byte "global_uint" app_global_get_ex - assert // check value exists + assert // check global_uint exists + byte "global_uint" swap @@ -65,7 +65,7 @@ main_after_if_else@4: int 0 byte "global_bytes" app_global_get_ex - assert // check value exists + assert // check global_bytes exists swap concat byte "global_bytes" diff --git a/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir b/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir index 99e3d4ac3f..e34cbe0600 100644 --- a/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir +++ b/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir @@ -24,19 +24,19 @@ contract test_cases.augmented_assignment.contract.Augmented: let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check value exists + (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check value exists + (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check global_uint exists let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 diff --git a/test_cases/augmented_assignment/out_unoptimized/Augmented.approval.teal b/test_cases/augmented_assignment/out_unoptimized/Augmented.approval.teal index 34edeb5aa5..070515da23 100644 --- a/test_cases/augmented_assignment/out_unoptimized/Augmented.approval.teal +++ b/test_cases/augmented_assignment/out_unoptimized/Augmented.approval.teal @@ -56,7 +56,7 @@ main_after_if_else@4: int 0 byte "my_uint" app_local_get_ex - assert // check value exists + assert // check my_uint exists for account dig 1 + dig 2 @@ -69,7 +69,7 @@ main_after_if_else@4: int 0 byte "my_bytes" app_local_get_ex - assert // check value exists + assert // check my_bytes exists for account dig 3 concat uncover 2 @@ -82,7 +82,7 @@ main_after_if_else@4: int 0 byte "global_uint" app_global_get_ex - assert // check value exists + assert // check global_uint exists swap + byte "global_uint" @@ -93,7 +93,7 @@ main_after_if_else@4: int 0 byte "global_bytes" app_global_get_ex - assert // check value exists + assert // check global_bytes exists swap concat byte "global_bytes" diff --git a/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir b/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir index 99e3d4ac3f..e34cbe0600 100644 --- a/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir +++ b/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir @@ -24,19 +24,19 @@ contract test_cases.augmented_assignment.contract.Augmented: let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check value exists + (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check value exists + (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check value exists + (assert app_global_get_ex_did_exist%12#0) // check global_uint exists let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir b/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir index 45ee05a95e..258c5facf6 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir @@ -35,7 +35,7 @@ main_bool_merge@6: // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:13 // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.did_execute_a conditional_execution/contract.py:13 // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.did_execute_a conditional_execution/contract.py:13 - assert // check value exists // app_global_get_ex_value%4#0 self.did_execute_a conditional_execution/contract.py:13 + assert // check did_execute_a exists // app_global_get_ex_value%4#0 self.did_execute_a conditional_execution/contract.py:13 // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) app_global_get_ex_value%4#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 bz main_bool_false@9 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 // Implicit fall through to main_and_contd@7 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 @@ -47,7 +47,7 @@ main_and_contd@7: // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:13 // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.did_execute_b conditional_execution/contract.py:13 // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.did_execute_b conditional_execution/contract.py:13 - assert // check value exists // app_global_get_ex_value%6#0 self.did_execute_b conditional_execution/contract.py:13 + assert // check did_execute_b exists // app_global_get_ex_value%6#0 self.did_execute_b conditional_execution/contract.py:13 // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) app_global_get_ex_value%6#0 not self.did_execute_b conditional_execution/contract.py:13 bnz main_bool_false@9 // not self.did_execute_b conditional_execution/contract.py:13 // Implicit fall through to main_bool_true@8 // not self.did_execute_b conditional_execution/contract.py:13 @@ -85,7 +85,7 @@ main_bool_merge@14: // virtual: store app_global_get_ex_did_exist%13#0 to l-stack (no copy) app_global_get_ex_did_exist%13#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:19 // virtual: store app_global_get_ex_value%12#0 to l-stack (no copy) app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.did_execute_a conditional_execution/contract.py:19 // virtual: load app_global_get_ex_did_exist%13#0 from l-stack (no copy) app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.did_execute_a conditional_execution/contract.py:19 - assert // check value exists // app_global_get_ex_value%12#0 self.did_execute_a conditional_execution/contract.py:19 + assert // check did_execute_a exists // app_global_get_ex_value%12#0 self.did_execute_a conditional_execution/contract.py:19 // virtual: load app_global_get_ex_value%12#0 from l-stack (no copy) app_global_get_ex_value%12#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 bz main_bool_false@17 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 // Implicit fall through to main_and_contd@15 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 @@ -97,7 +97,7 @@ main_and_contd@15: // virtual: store app_global_get_ex_did_exist%15#0 to l-stack (no copy) app_global_get_ex_did_exist%15#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:19 // virtual: store app_global_get_ex_value%14#0 to l-stack (no copy) app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.did_execute_b conditional_execution/contract.py:19 // virtual: load app_global_get_ex_did_exist%15#0 from l-stack (no copy) app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.did_execute_b conditional_execution/contract.py:19 - assert // check value exists // app_global_get_ex_value%14#0 self.did_execute_b conditional_execution/contract.py:19 + assert // check did_execute_b exists // app_global_get_ex_value%14#0 self.did_execute_b conditional_execution/contract.py:19 // virtual: load app_global_get_ex_value%14#0 from l-stack (no copy) app_global_get_ex_value%14#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 bz main_bool_false@17 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 // Implicit fall through to main_bool_true@16 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 @@ -135,7 +135,7 @@ main_bool_merge@22: // virtual: store app_global_get_ex_did_exist%21#0 to l-stack (no copy) app_global_get_ex_did_exist%21#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:25 // virtual: store app_global_get_ex_value%20#0 to l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.did_execute_a conditional_execution/contract.py:25 // virtual: load app_global_get_ex_did_exist%21#0 from l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.did_execute_a conditional_execution/contract.py:25 - assert // check value exists // app_global_get_ex_value%20#0 self.did_execute_a conditional_execution/contract.py:25 + assert // check did_execute_a exists // app_global_get_ex_value%20#0 self.did_execute_a conditional_execution/contract.py:25 // virtual: load app_global_get_ex_value%20#0 from l-stack (no copy) app_global_get_ex_value%20#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 bz main_bool_false@25 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 // Implicit fall through to main_and_contd@23 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 @@ -147,7 +147,7 @@ main_and_contd@23: // virtual: store app_global_get_ex_did_exist%23#0 to l-stack (no copy) app_global_get_ex_did_exist%23#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:25 // virtual: store app_global_get_ex_value%22#0 to l-stack (no copy) app_global_get_ex_value%22#0,app_global_get_ex_did_exist%23#0 self.did_execute_b conditional_execution/contract.py:25 // virtual: load app_global_get_ex_did_exist%23#0 from l-stack (no copy) app_global_get_ex_value%22#0,app_global_get_ex_did_exist%23#0 self.did_execute_b conditional_execution/contract.py:25 - assert // check value exists // app_global_get_ex_value%22#0 self.did_execute_b conditional_execution/contract.py:25 + assert // check did_execute_b exists // app_global_get_ex_value%22#0 self.did_execute_b conditional_execution/contract.py:25 // virtual: load app_global_get_ex_value%22#0 from l-stack (no copy) app_global_get_ex_value%22#0 not self.did_execute_b conditional_execution/contract.py:25 bnz main_bool_false@25 // not self.did_execute_b conditional_execution/contract.py:25 // Implicit fall through to main_bool_true@24 // not self.did_execute_b conditional_execution/contract.py:25 @@ -185,7 +185,7 @@ main_bool_merge@30: // virtual: store app_global_get_ex_did_exist%29#0 to l-stack (no copy) app_global_get_ex_did_exist%29#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:31 // virtual: store app_global_get_ex_value%28#0 to l-stack (no copy) app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.did_execute_a conditional_execution/contract.py:31 // virtual: load app_global_get_ex_did_exist%29#0 from l-stack (no copy) app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.did_execute_a conditional_execution/contract.py:31 - assert // check value exists // app_global_get_ex_value%28#0 self.did_execute_a conditional_execution/contract.py:31 + assert // check did_execute_a exists // app_global_get_ex_value%28#0 self.did_execute_a conditional_execution/contract.py:31 // virtual: load app_global_get_ex_value%28#0 from l-stack (no copy) app_global_get_ex_value%28#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 bz main_bool_false@33 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 // Implicit fall through to main_and_contd@31 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 @@ -197,7 +197,7 @@ main_and_contd@31: // virtual: store app_global_get_ex_did_exist%31#0 to l-stack (no copy) app_global_get_ex_did_exist%31#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:31 // virtual: store app_global_get_ex_value%30#0 to l-stack (no copy) app_global_get_ex_value%30#0,app_global_get_ex_did_exist%31#0 self.did_execute_b conditional_execution/contract.py:31 // virtual: load app_global_get_ex_did_exist%31#0 from l-stack (no copy) app_global_get_ex_value%30#0,app_global_get_ex_did_exist%31#0 self.did_execute_b conditional_execution/contract.py:31 - assert // check value exists // app_global_get_ex_value%30#0 self.did_execute_b conditional_execution/contract.py:31 + assert // check did_execute_b exists // app_global_get_ex_value%30#0 self.did_execute_b conditional_execution/contract.py:31 // virtual: load app_global_get_ex_value%30#0 from l-stack (no copy) app_global_get_ex_value%30#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 bz main_bool_false@33 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 // Implicit fall through to main_bool_true@32 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 @@ -227,7 +227,7 @@ main_bool_merge@34: // virtual: store app_global_get_ex_did_exist%36#0 to l-stack (no copy) app_global_get_ex_did_exist%36#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:37 // virtual: store app_global_get_ex_value%35#0 to l-stack (no copy) app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.did_execute_a conditional_execution/contract.py:37 // virtual: load app_global_get_ex_did_exist%36#0 from l-stack (no copy) app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.did_execute_a conditional_execution/contract.py:37 - assert // check value exists // app_global_get_ex_value%35#0 self.did_execute_a conditional_execution/contract.py:37 + assert // check did_execute_a exists // app_global_get_ex_value%35#0 self.did_execute_a conditional_execution/contract.py:37 // virtual: load app_global_get_ex_value%35#0 from l-stack (no copy) app_global_get_ex_value%35#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 bz main_bool_false@37 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 // Implicit fall through to main_and_contd@35 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 @@ -239,7 +239,7 @@ main_and_contd@35: // virtual: store app_global_get_ex_did_exist%38#0 to l-stack (no copy) app_global_get_ex_did_exist%38#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:37 // virtual: store app_global_get_ex_value%37#0 to l-stack (no copy) app_global_get_ex_value%37#0,app_global_get_ex_did_exist%38#0 self.did_execute_b conditional_execution/contract.py:37 // virtual: load app_global_get_ex_did_exist%38#0 from l-stack (no copy) app_global_get_ex_value%37#0,app_global_get_ex_did_exist%38#0 self.did_execute_b conditional_execution/contract.py:37 - assert // check value exists // app_global_get_ex_value%37#0 self.did_execute_b conditional_execution/contract.py:37 + assert // check did_execute_b exists // app_global_get_ex_value%37#0 self.did_execute_b conditional_execution/contract.py:37 // virtual: load app_global_get_ex_value%37#0 from l-stack (no copy) app_global_get_ex_value%37#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 bz main_bool_false@37 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 // Implicit fall through to main_bool_true@36 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 @@ -283,7 +283,7 @@ main_ternary_merge@41: // virtual: store app_global_get_ex_did_exist%43#0 to l-stack (no copy) app_global_get_ex_did_exist%43#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:43 // virtual: store app_global_get_ex_value%42#0 to l-stack (no copy) app_global_get_ex_value%42#0,app_global_get_ex_did_exist%43#0 self.did_execute_a conditional_execution/contract.py:43 // virtual: load app_global_get_ex_did_exist%43#0 from l-stack (no copy) app_global_get_ex_value%42#0,app_global_get_ex_did_exist%43#0 self.did_execute_a conditional_execution/contract.py:43 - assert // check value exists // app_global_get_ex_value%42#0 self.did_execute_a conditional_execution/contract.py:43 + assert // check did_execute_a exists // app_global_get_ex_value%42#0 self.did_execute_a conditional_execution/contract.py:43 // virtual: load app_global_get_ex_value%42#0 from l-stack (no copy) app_global_get_ex_value%42#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 bz main_bool_false@44 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 // Implicit fall through to main_and_contd@42 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 @@ -295,7 +295,7 @@ main_and_contd@42: // virtual: store app_global_get_ex_did_exist%45#0 to l-stack (no copy) app_global_get_ex_did_exist%45#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:43 // virtual: store app_global_get_ex_value%44#0 to l-stack (no copy) app_global_get_ex_value%44#0,app_global_get_ex_did_exist%45#0 self.did_execute_b conditional_execution/contract.py:43 // virtual: load app_global_get_ex_did_exist%45#0 from l-stack (no copy) app_global_get_ex_value%44#0,app_global_get_ex_did_exist%45#0 self.did_execute_b conditional_execution/contract.py:43 - assert // check value exists // app_global_get_ex_value%44#0 self.did_execute_b conditional_execution/contract.py:43 + assert // check did_execute_b exists // app_global_get_ex_value%44#0 self.did_execute_b conditional_execution/contract.py:43 // virtual: load app_global_get_ex_value%44#0 from l-stack (no copy) app_global_get_ex_value%44#0 not self.did_execute_b conditional_execution/contract.py:43 bnz main_bool_false@44 // not self.did_execute_b conditional_execution/contract.py:43 // Implicit fall through to main_bool_true@43 // not self.did_execute_b conditional_execution/contract.py:43 @@ -339,7 +339,7 @@ main_ternary_merge@48: // virtual: store app_global_get_ex_did_exist%50#0 to l-stack (no copy) app_global_get_ex_did_exist%50#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:49 // virtual: store app_global_get_ex_value%49#0 to l-stack (no copy) app_global_get_ex_value%49#0,app_global_get_ex_did_exist%50#0 self.did_execute_a conditional_execution/contract.py:49 // virtual: load app_global_get_ex_did_exist%50#0 from l-stack (no copy) app_global_get_ex_value%49#0,app_global_get_ex_did_exist%50#0 self.did_execute_a conditional_execution/contract.py:49 - assert // check value exists // app_global_get_ex_value%49#0 self.did_execute_a conditional_execution/contract.py:49 + assert // check did_execute_a exists // app_global_get_ex_value%49#0 self.did_execute_a conditional_execution/contract.py:49 // virtual: load app_global_get_ex_value%49#0 from l-stack (no copy) app_global_get_ex_value%49#0 not self.did_execute_a conditional_execution/contract.py:49 bnz main_bool_false@51 // not self.did_execute_a conditional_execution/contract.py:49 // Implicit fall through to main_and_contd@49 // not self.did_execute_a conditional_execution/contract.py:49 @@ -351,7 +351,7 @@ main_and_contd@49: // virtual: store app_global_get_ex_did_exist%52#0 to l-stack (no copy) app_global_get_ex_did_exist%52#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:49 // virtual: store app_global_get_ex_value%51#0 to l-stack (no copy) app_global_get_ex_value%51#0,app_global_get_ex_did_exist%52#0 self.did_execute_b conditional_execution/contract.py:49 // virtual: load app_global_get_ex_did_exist%52#0 from l-stack (no copy) app_global_get_ex_value%51#0,app_global_get_ex_did_exist%52#0 self.did_execute_b conditional_execution/contract.py:49 - assert // check value exists // app_global_get_ex_value%51#0 self.did_execute_b conditional_execution/contract.py:49 + assert // check did_execute_b exists // app_global_get_ex_value%51#0 self.did_execute_b conditional_execution/contract.py:49 // virtual: load app_global_get_ex_value%51#0 from l-stack (no copy) app_global_get_ex_value%51#0 not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 bz main_bool_false@51 // not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 // Implicit fall through to main_bool_true@50 // not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.teal b/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.teal index 8be1901071..f30c42584d 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.teal +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.teal @@ -22,12 +22,12 @@ main_bool_merge@6: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@9 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@9 int 1 b main_bool_merge@10 @@ -57,12 +57,12 @@ main_bool_merge@14: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@17 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@17 int 1 b main_bool_merge@18 @@ -92,12 +92,12 @@ main_bool_merge@22: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@25 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@25 int 1 b main_bool_merge@26 @@ -127,12 +127,12 @@ main_bool_merge@30: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@33 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@33 int 1 b main_bool_merge@34 @@ -160,12 +160,12 @@ main_bool_merge@34: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@37 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@37 int 1 b main_bool_merge@38 @@ -204,12 +204,12 @@ main_ternary_merge@41: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@44 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@44 int 1 b main_bool_merge@45 @@ -248,12 +248,12 @@ main_ternary_merge@48: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bnz main_bool_false@51 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@51 int 1 b main_bool_merge@52 diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir index 8401ca35f2..b568cfd4c9 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir @@ -15,11 +15,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@6 block@6: // bool_merge_L10 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists goto app_global_get_ex_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists goto app_global_get_ex_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u @@ -36,11 +36,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@14 block@14: // bool_merge_L16 let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists goto app_global_get_ex_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists goto app_global_get_ex_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u @@ -57,11 +57,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@22 block@22: // bool_merge_L22 let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists goto app_global_get_ex_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check value exists + (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists goto app_global_get_ex_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u @@ -78,11 +78,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@30 block@30: // bool_merge_L28 let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists goto app_global_get_ex_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check value exists + (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists goto app_global_get_ex_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u @@ -95,11 +95,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists goto app_global_get_ex_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check value exists + (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists goto app_global_get_ex_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u @@ -119,11 +119,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@41 block@41: // ternary_merge_L40 let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check value exists + (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists goto app_global_get_ex_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check value exists + (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists goto app_global_get_ex_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u @@ -143,11 +143,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@48 block@48: // ternary_merge_L46 let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check value exists + (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists goto app_global_get_ex_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check value exists + (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists goto app_global_get_ex_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir index 66106c93ff..8c8ca50fa9 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir @@ -22,11 +22,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@6: // bool_merge_L10 let or_result%3#2: uint64 = φ(or_result%3#0 <- block@4, or_result%3#1 <- block@5) let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists goto app_global_get_ex_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists goto app_global_get_ex_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u @@ -51,11 +51,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@14: // bool_merge_L16 let or_result%11#2: uint64 = φ(or_result%11#0 <- block@12, or_result%11#1 <- block@13) let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists goto app_global_get_ex_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists goto app_global_get_ex_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u @@ -80,11 +80,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@22: // bool_merge_L22 let and_result%19#2: uint64 = φ(and_result%19#0 <- block@20, and_result%19#1 <- block@21) let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists goto app_global_get_ex_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check value exists + (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists goto app_global_get_ex_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u @@ -109,11 +109,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@30: // bool_merge_L28 let and_result%27#2: uint64 = φ(and_result%27#0 <- block@28, and_result%27#1 <- block@29) let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists goto app_global_get_ex_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check value exists + (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists goto app_global_get_ex_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u @@ -127,11 +127,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists goto app_global_get_ex_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check value exists + (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists goto app_global_get_ex_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u @@ -153,11 +153,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@41: // ternary_merge_L40 let ternary_result%41#2: uint64 = φ(ternary_result%41#0 <- block@39, ternary_result%41#1 <- block@40) let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check value exists + (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists goto app_global_get_ex_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check value exists + (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists goto app_global_get_ex_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u @@ -179,11 +179,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@48: // ternary_merge_L46 let ternary_result%48#2: uint64 = φ(ternary_result%48#0 <- block@46, ternary_result%48#1 <- block@47) let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check value exists + (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists goto app_global_get_ex_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check value exists + (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists goto app_global_get_ex_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir index 175b28cb6d..37ff0b3cde 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir @@ -21,11 +21,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@6 block@6: // bool_merge_L10 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists goto app_global_get_ex_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists goto app_global_get_ex_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u @@ -49,11 +49,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@14 block@14: // bool_merge_L16 let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists goto app_global_get_ex_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists goto app_global_get_ex_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u @@ -77,11 +77,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@22 block@22: // bool_merge_L22 let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists goto app_global_get_ex_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check value exists + (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists goto app_global_get_ex_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u @@ -105,11 +105,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@30 block@30: // bool_merge_L28 let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists goto app_global_get_ex_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check value exists + (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists goto app_global_get_ex_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u @@ -123,11 +123,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists goto app_global_get_ex_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check value exists + (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists goto app_global_get_ex_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u @@ -148,11 +148,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@41 block@41: // ternary_merge_L40 let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check value exists + (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists goto app_global_get_ex_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check value exists + (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists goto app_global_get_ex_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u @@ -173,11 +173,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@48 block@48: // ternary_merge_L46 let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check value exists + (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists goto app_global_get_ex_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check value exists + (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists goto app_global_get_ex_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir index bc74cf64af..0df305b4ba 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir @@ -15,11 +15,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@6 block@6: // bool_merge_L10 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists goto app_global_get_ex_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists goto app_global_get_ex_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u @@ -37,11 +37,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@14 block@14: // bool_merge_L16 let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists goto app_global_get_ex_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists goto app_global_get_ex_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u @@ -59,11 +59,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@22 block@22: // bool_merge_L22 let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists goto app_global_get_ex_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check value exists + (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists goto app_global_get_ex_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u @@ -81,11 +81,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@30 block@30: // bool_merge_L28 let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists goto app_global_get_ex_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check value exists + (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists goto app_global_get_ex_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u @@ -99,11 +99,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists goto app_global_get_ex_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check value exists + (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists goto app_global_get_ex_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u @@ -124,11 +124,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@41 block@41: // ternary_merge_L40 let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check value exists + (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists goto app_global_get_ex_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check value exists + (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists goto app_global_get_ex_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u @@ -149,11 +149,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@48 block@48: // ternary_merge_L46 let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check value exists + (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists goto app_global_get_ex_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check value exists + (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists goto app_global_get_ex_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u diff --git a/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.approval.teal b/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.approval.teal index d56ad31680..984c0d0ffc 100644 --- a/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.approval.teal +++ b/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.approval.teal @@ -17,12 +17,12 @@ main_bool_merge@6: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@9 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@9 int 1 b main_bool_merge@10 @@ -43,12 +43,12 @@ main_bool_merge@14: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@17 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@17 int 1 b main_bool_merge@18 @@ -69,12 +69,12 @@ main_bool_merge@22: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@25 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@25 int 1 b main_bool_merge@26 @@ -95,12 +95,12 @@ main_bool_merge@30: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@33 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@33 int 1 b main_bool_merge@34 @@ -119,12 +119,12 @@ main_bool_merge@34: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@37 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@37 int 1 b main_bool_merge@38 @@ -151,12 +151,12 @@ main_ternary_merge@41: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@44 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@44 int 1 b main_bool_merge@45 @@ -183,12 +183,12 @@ main_ternary_merge@48: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bnz main_bool_false@51 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@51 int 1 b main_bool_merge@52 diff --git a/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir b/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir index 8401ca35f2..b568cfd4c9 100644 --- a/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir +++ b/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir @@ -15,11 +15,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@6 block@6: // bool_merge_L10 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists goto app_global_get_ex_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists goto app_global_get_ex_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u @@ -36,11 +36,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@14 block@14: // bool_merge_L16 let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists goto app_global_get_ex_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists goto app_global_get_ex_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u @@ -57,11 +57,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@22 block@22: // bool_merge_L22 let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists goto app_global_get_ex_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check value exists + (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists goto app_global_get_ex_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u @@ -78,11 +78,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@30 block@30: // bool_merge_L28 let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists goto app_global_get_ex_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check value exists + (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists goto app_global_get_ex_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u @@ -95,11 +95,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists goto app_global_get_ex_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check value exists + (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists goto app_global_get_ex_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u @@ -119,11 +119,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@41 block@41: // ternary_merge_L40 let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check value exists + (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists goto app_global_get_ex_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check value exists + (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists goto app_global_get_ex_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u @@ -143,11 +143,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@48 block@48: // ternary_merge_L46 let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check value exists + (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists goto app_global_get_ex_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check value exists + (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists goto app_global_get_ex_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u diff --git a/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.approval.teal b/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.approval.teal index 2f0198d522..bf451477e5 100644 --- a/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.approval.teal +++ b/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.approval.teal @@ -27,12 +27,12 @@ main_bool_merge@6: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@9 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@9 int 1 b main_bool_merge@10 @@ -67,12 +67,12 @@ main_bool_merge@14: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@17 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@17 int 1 b main_bool_merge@18 @@ -105,12 +105,12 @@ main_bool_merge@22: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@25 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@25 int 1 b main_bool_merge@26 @@ -143,12 +143,12 @@ main_bool_merge@30: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@33 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@33 int 1 b main_bool_merge@34 @@ -176,12 +176,12 @@ main_bool_merge@34: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@37 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@37 int 1 b main_bool_merge@38 @@ -220,12 +220,12 @@ main_ternary_merge@41: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bz main_bool_false@44 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bnz main_bool_false@44 int 1 b main_bool_merge@45 @@ -264,12 +264,12 @@ main_ternary_merge@48: int 0 byte "did_execute_a" app_global_get_ex - assert // check value exists + assert // check did_execute_a exists bnz main_bool_false@51 int 0 byte "did_execute_b" app_global_get_ex - assert // check value exists + assert // check did_execute_b exists bz main_bool_false@51 int 1 b main_bool_merge@52 diff --git a/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir b/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir index 65441ccab9..c5520d533b 100644 --- a/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir +++ b/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir @@ -19,11 +19,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@6 block@6: // bool_merge_L10 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists goto app_global_get_ex_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check value exists + (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists goto app_global_get_ex_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u @@ -44,11 +44,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@14 block@14: // bool_merge_L16 let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check value exists + (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists goto app_global_get_ex_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check value exists + (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists goto app_global_get_ex_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u @@ -69,11 +69,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@22 block@22: // bool_merge_L22 let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check value exists + (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists goto app_global_get_ex_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check value exists + (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists goto app_global_get_ex_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u @@ -94,11 +94,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@30 block@30: // bool_merge_L28 let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check value exists + (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists goto app_global_get_ex_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check value exists + (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists goto app_global_get_ex_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u @@ -111,11 +111,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check value exists + (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists goto app_global_get_ex_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check value exists + (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists goto app_global_get_ex_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u @@ -135,11 +135,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@41 block@41: // ternary_merge_L40 let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check value exists + (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists goto app_global_get_ex_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check value exists + (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists goto app_global_get_ex_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u @@ -159,11 +159,11 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@48 block@48: // ternary_merge_L46 let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check value exists + (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists goto app_global_get_ex_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check value exists + (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists goto app_global_get_ex_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u diff --git a/test_cases/everything/out/MyContract.approval.mir b/test_cases/everything/out/MyContract.approval.mir index 919655f306..5e808e5c70 100644 --- a/test_cases/everything/out/MyContract.approval.mir +++ b/test_cases/everything/out/MyContract.approval.mir @@ -226,7 +226,7 @@ register_if_body@2: // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.counter everything/contract.py:53 // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.counter everything/contract.py:53 // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.counter everything/contract.py:53 - assert // check value exists // (𝕡) name#0 | app_global_get_ex_value%4#0 self.counter everything/contract.py:53 + assert // check counter exists // (𝕡) name#0 | app_global_get_ex_value%4#0 self.counter everything/contract.py:53 callsub multiplicative_identity // (𝕡) name#0 | app_global_get_ex_value%4#0,{multiplicative_identity} multiplicative_identity() everything/contract.py:53 // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%4#0,tmp%6#0 multiplicative_identity() everything/contract.py:53 // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) (𝕡) name#0 | tmp%6#0,app_global_get_ex_value%4#0 self.counter += multiplicative_identity() everything/contract.py:53 @@ -390,7 +390,7 @@ _remove_sender_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.counter everything/contract.py:83 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 - assert // check value exists // app_global_get_ex_value%0#0 self.counter everything/contract.py:83 + assert // check counter exists // app_global_get_ex_value%0#0 self.counter everything/contract.py:83 callsub positive_one // app_global_get_ex_value%0#0,{positive_one} positive_one() everything/contract.py:83 // virtual: store tmp%2#0 to l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 positive_one() everything/contract.py:83 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%0#0 self.counter -= positive_one() everything/contract.py:83 diff --git a/test_cases/everything/out/MyContract.approval.teal b/test_cases/everything/out/MyContract.approval.teal index 3db5ad5c9e..a10c131340 100644 --- a/test_cases/everything/out/MyContract.approval.teal +++ b/test_cases/everything/out/MyContract.approval.teal @@ -195,7 +195,7 @@ register: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub multiplicative_identity + byte "counter" @@ -336,7 +336,7 @@ _remove_sender: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub positive_one - byte "counter" diff --git a/test_cases/everything/out/MyContract.arc32.json b/test_cases/everything/out/MyContract.arc32.json index bd66610a5c..295c0535f4 100644 --- a/test_cases/everything/out/MyContract.arc32.json +++ b/test_cases/everything/out/MyContract.arc32.json @@ -28,8 +28,8 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIG1ldGhvZCAicmVnaXN0ZXIoc3RyaW5nKXZvaWQiCiAgICBtZXRob2QgInNheV9oZWxsbygpc3RyaW5nIgogICAgbWV0aG9kICJjYWxjdWxhdGUodWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBtZXRob2QgImNsb3NlX291dCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlX3JvdXRlQDMgbWFpbl9yZWdpc3Rlcl9yb3V0ZUA0IG1haW5fc2F5X2hlbGxvX3JvdXRlQDUgbWFpbl9jYWxjdWxhdGVfcm91dGVANiBtYWluX2Nsb3NlX291dF9yb3V0ZUA3CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0MQogICAgLy8gQGFiaW1ldGhvZChjcmVhdGU9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJfcm91dGVANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGludCAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIGludCAzCiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG9uZSBvZiBOb09wLCBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGNhbGxzdWIgcmVnaXN0ZXIKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fc2F5X2hlbGxvX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9jYWxjdWxhdGVfcm91dGVANjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgY2FsY3VsYXRlCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX291dF9yb3V0ZUA3OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiQ2xvc2VPdXQiXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludCBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgQ2xvc2VPdXQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlX291dAogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNyZWF0ZSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPVRydWUpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnJlbWVtYmVyX2NyZWF0b3IoKQogICAgY2FsbHN1YiByZW1lbWJlcl9jcmVhdG9yCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzZWxmLmNvdW50ZXIgPSBVSW50NjQoWkVSTykKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9jaGVja19iYW5fbGlzdCgpIC0+IHZvaWQ6Cl9jaGVja19iYW5fbGlzdDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jhbl9saXN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBvcC5UeG4uc2VuZGVyICE9IGdldF9iYW5uZWQoKSwgIllvdSBhcmUgYmFubmVkLCBnb29kYnllIgogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRfYmFubmVkCiAgICAhPQogICAgYXNzZXJ0IC8vIFlvdSBhcmUgYmFubmVkLCBnb29kYnllCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuZ2V0X2Jhbm5lZCgpIC0+IGJ5dGVzOgpnZXRfYmFubmVkOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyMy0yNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmFubmVkKCkgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNQogICAgLy8gYWRkciA9IEFjY291bnQoQkFOTkVEKQogICAgYWRkciBWQ01KS1dPWTVQNVA3U0tNWkZGT0NFUk9QSkNaT1RJSk1OSVlOVUNLSDdMUk80NUpNSlA2VVlCSUpBCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyByZXR1cm4gYWRkcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlCYXNlLnJlbWVtYmVyX2NyZWF0b3IoKSAtPiB2b2lkOgpyZW1lbWJlcl9jcmVhdG9yOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjctOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiByZW1lbWJlcl9jcmVhdG9yKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weTo5CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBieXRlICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnJlZ2lzdGVyKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDctNDgKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIC8vIGRlZiByZWdpc3RlcihzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBpZiBvcC5UeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk9wdEluOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50IE9wdEluCiAgICA9PQogICAgYnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBzZW5kZXJfbmFtZSwgc2VuZGVyX25hbWVfZXhpc3RlZCA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnQgMAogICAgaW50IDAKICAgIGJ5dGUgIm5hbWUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTIKICAgIC8vIGlmIG5vdCBzZW5kZXJfbmFtZV9leGlzdGVkOgogICAgYm56IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5jb3VudGVyICs9IG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgICMgaGFzIGZ1bGwgRnVuY0RlZgogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgY2FsbHN1YiBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eQogICAgKwogICAgYnl0ZSAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBzZWxmLm5hbWVbMF0gPSBuYW1lCiAgICBpbnQgMAogICAgYnl0ZSAibmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UubXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiB1aW50NjQ6Cm11bHRpcGxpY2F0aXZlX2lkZW50aXR5OgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MjAKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludCAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5zYXlfaGVsbG8oKSAtPiBieXRlczoKc2F5X2hlbGxvOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIHNheV9oZWxsbyhzZWxmKSAtPiBTdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBuYW1lLCBleGlzdHMgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50IDAKICAgIGludCAwCiAgICBieXRlICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MAogICAgLy8gaWYgbm90IGV4aXN0czoKICAgIGJueiBzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gU3RyaW5nKCJIb3dkeSBzdHJhbmdlciEiKQogICAgYnl0ZSAiXHgwMFx4MGZIb3dkeSBzdHJhbmdlciEiCiAgICBzd2FwCiAgICByZXRzdWIKCnNheV9oZWxsb19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZSArICIhIgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIiEiCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jYWxjdWxhdGUoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKY2FsY3VsYXRlOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NC02NQogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIGNhbGN1bGF0ZShzZWxmLCBhOiBhcmM0X1VJbnQ2NCwgYjogYXJjNF9VSW50NjQpIC0+IGFyYzRfVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBjID0gc3VwZXIoKS5jYWxjdWxhdGUoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIE15TWlkZGxlQmFzZS5jYWxjdWxhdGUKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjcKICAgIC8vIHJldHVybiBhcmM0X1VJbnQ2NChjLmRlY29kZSgpICogYi5kZWNvZGUoKSkKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgKgogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpNeU1pZGRsZUJhc2UuY2FsY3VsYXRlOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjEzLTE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNhbGN1bGF0ZShzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhLmRlY29kZSgpICsgYi5kZWNvZGUoKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICArCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbG9zZV9vdXQoKSAtPiB2b2lkOgpjbG9zZV9vdXQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5LTcwCiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgLy8gZGVmIGNsb3NlX291dChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBzZWxmLl9yZW1vdmVfc2VuZGVyKCkKICAgIGNhbGxzdWIgX3JlbW92ZV9zZW5kZXIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgY2FsbHN1YiBwb3NpdGl2ZV9vbmUKICAgIC0KICAgIGJ5dGUgImNvdW50ZXIiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LnBvc2l0aXZlX29uZSgpIC0+IHVpbnQ2NDoKcG9zaXRpdmVfb25lOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4Ni04NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwb3NpdGl2ZV9vbmUoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODgKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludCAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozOAogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIHJldHN1Ygo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3NAogICAgLy8gc2VsZi5fcmVtb3ZlX3NlbmRlcigpCiAgICBjYWxsc3ViIF9yZW1vdmVfc2VuZGVyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgY2FsbHN1YiBwb3NpdGl2ZV9vbmUKICAgIC0KICAgIGJ5dGUgImNvdW50ZXIiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LnBvc2l0aXZlX29uZSgpIC0+IHVpbnQ2NDoKcG9zaXRpdmVfb25lOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4Ni04NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwb3NpdGl2ZV9vbmUoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODgKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludCAxCiAgICByZXRzdWIK" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIG1ldGhvZCAicmVnaXN0ZXIoc3RyaW5nKXZvaWQiCiAgICBtZXRob2QgInNheV9oZWxsbygpc3RyaW5nIgogICAgbWV0aG9kICJjYWxjdWxhdGUodWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBtZXRob2QgImNsb3NlX291dCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlX3JvdXRlQDMgbWFpbl9yZWdpc3Rlcl9yb3V0ZUA0IG1haW5fc2F5X2hlbGxvX3JvdXRlQDUgbWFpbl9jYWxjdWxhdGVfcm91dGVANiBtYWluX2Nsb3NlX291dF9yb3V0ZUA3CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0MQogICAgLy8gQGFiaW1ldGhvZChjcmVhdGU9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJfcm91dGVANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGludCAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIGludCAzCiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG9uZSBvZiBOb09wLCBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGNhbGxzdWIgcmVnaXN0ZXIKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fc2F5X2hlbGxvX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9jYWxjdWxhdGVfcm91dGVANjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgY2FsY3VsYXRlCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX291dF9yb3V0ZUA3OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiQ2xvc2VPdXQiXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludCBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgQ2xvc2VPdXQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlX291dAogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNyZWF0ZSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPVRydWUpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnJlbWVtYmVyX2NyZWF0b3IoKQogICAgY2FsbHN1YiByZW1lbWJlcl9jcmVhdG9yCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzZWxmLmNvdW50ZXIgPSBVSW50NjQoWkVSTykKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9jaGVja19iYW5fbGlzdCgpIC0+IHZvaWQ6Cl9jaGVja19iYW5fbGlzdDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jhbl9saXN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBvcC5UeG4uc2VuZGVyICE9IGdldF9iYW5uZWQoKSwgIllvdSBhcmUgYmFubmVkLCBnb29kYnllIgogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRfYmFubmVkCiAgICAhPQogICAgYXNzZXJ0IC8vIFlvdSBhcmUgYmFubmVkLCBnb29kYnllCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuZ2V0X2Jhbm5lZCgpIC0+IGJ5dGVzOgpnZXRfYmFubmVkOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyMy0yNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmFubmVkKCkgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNQogICAgLy8gYWRkciA9IEFjY291bnQoQkFOTkVEKQogICAgYWRkciBWQ01KS1dPWTVQNVA3U0tNWkZGT0NFUk9QSkNaT1RJSk1OSVlOVUNLSDdMUk80NUpNSlA2VVlCSUpBCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyByZXR1cm4gYWRkcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlCYXNlLnJlbWVtYmVyX2NyZWF0b3IoKSAtPiB2b2lkOgpyZW1lbWJlcl9jcmVhdG9yOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjctOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiByZW1lbWJlcl9jcmVhdG9yKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weTo5CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBieXRlICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnJlZ2lzdGVyKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDctNDgKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIC8vIGRlZiByZWdpc3RlcihzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBpZiBvcC5UeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk9wdEluOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50IE9wdEluCiAgICA9PQogICAgYnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBzZW5kZXJfbmFtZSwgc2VuZGVyX25hbWVfZXhpc3RlZCA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnQgMAogICAgaW50IDAKICAgIGJ5dGUgIm5hbWUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTIKICAgIC8vIGlmIG5vdCBzZW5kZXJfbmFtZV9leGlzdGVkOgogICAgYm56IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5jb3VudGVyICs9IG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgICMgaGFzIGZ1bGwgRnVuY0RlZgogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5CiAgICArCiAgICBieXRlICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYubmFtZVswXSA9IG5hbWUKICAgIGludCAwCiAgICBieXRlICJuYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5tdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpIC0+IHVpbnQ2NDoKbXVsdGlwbGljYXRpdmVfaWRlbnRpdHk6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTgtMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToyMAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50IDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnNheV9oZWxsbygpIC0+IGJ5dGVzOgpzYXlfaGVsbG86CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgc2F5X2hlbGxvKHNlbGYpIC0+IFN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTkKICAgIC8vIG5hbWUsIGV4aXN0cyA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnQgMAogICAgaW50IDAKICAgIGJ5dGUgIm5hbWUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBpZiBub3QgZXhpc3RzOgogICAgYm56IHNheV9oZWxsb19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjEKICAgIC8vIHJldHVybiBTdHJpbmcoIkhvd2R5IHN0cmFuZ2VyISIpCiAgICBieXRlICJceDAwXHgwZkhvd2R5IHN0cmFuZ2VyISIKICAgIHN3YXAKICAgIHJldHN1YgoKc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lICsgIiEiCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgY29uY2F0CiAgICBleHRyYWN0IDIgMAogICAgYnl0ZSAiISIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpjYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0LTY1CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzRfVUludDY0LCBiOiBhcmM0X1VJbnQ2NCkgLT4gYXJjNF9VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGMgPSBzdXBlcigpLmNhbGN1bGF0ZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NwogICAgLy8gcmV0dXJuIGFyYzRfVUludDY0KGMuZGVjb2RlKCkgKiBiLmRlY29kZSgpKQogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAqCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6Ck15TWlkZGxlQmFzZS5jYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTMtMTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzQuVUludDY0LCBiOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToxNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGEuZGVjb2RlKCkgKyBiLmRlY29kZSgpKQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICsKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNsb3NlX291dCgpIC0+IHZvaWQ6CmNsb3NlX291dDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICAvLyBkZWYgY2xvc2Vfb3V0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX3JlbW92ZV9zZW5kZXIoKSAtPiB2b2lkOgpfcmVtb3ZlX3NlbmRlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3JlbW92ZV9zZW5kZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5jb3VudGVyIC09IHBvc2l0aXZlX29uZSgpCiAgICBpbnQgMAogICAgYnl0ZSAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgY291bnRlciBleGlzdHMKICAgIGNhbGxzdWIgcG9zaXRpdmVfb25lCiAgICAtCiAgICBieXRlICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5wb3NpdGl2ZV9vbmUoKSAtPiB1aW50NjQ6CnBvc2l0aXZlX29uZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODYtODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcG9zaXRpdmVfb25lKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gVUludDY0KDEpCiAgICBpbnQgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3NAogICAgLy8gc2VsZi5fcmVtb3ZlX3NlbmRlcigpCiAgICBjYWxsc3ViIF9yZW1vdmVfc2VuZGVyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIHBvc2l0aXZlX29uZQogICAgLQogICAgYnl0ZSAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QucG9zaXRpdmVfb25lKCkgLT4gdWludDY0Ogpwb3NpdGl2ZV9vbmU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBvc2l0aXZlX29uZSgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50IDEKICAgIHJldHN1Ygo=" }, "state": { "global": { diff --git a/test_cases/everything/out/MyContract.clear.mir b/test_cases/everything/out/MyContract.clear.mir index 9599c29c34..647db2efdf 100644 --- a/test_cases/everything/out/MyContract.clear.mir +++ b/test_cases/everything/out/MyContract.clear.mir @@ -1,43 +1,43 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.everything.contract.Everything.clear_state_program() -> uint64: main_block@0: - callsub _remove_sender // self._remove_sender() everything/contract.py:74 - int 1 // 1 True everything/contract.py:75 - return // return True everything/contract.py:75 + callsub _remove_sender // self._remove_sender() everything/contract.py:74 + int 1 // 1 True everything/contract.py:75 + return // return True everything/contract.py:75 // test_cases.everything.contract.Everything._remove_sender() -> void: _remove_sender: - proto 0 0 // @subroutine\ndef _remove_sender(self) -> None: everything/contract.py:81-82 + proto 0 0 // @subroutine\ndef _remove_sender(self) -> None: everything/contract.py:81-82 _remove_sender_block@0: - int 0 // 0 self.counter everything/contract.py:83 - byte "counter" // 0,"counter" self.counter everything/contract.py:83 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:83 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.counter everything/contract.py:83 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 - assert // check value exists // app_global_get_ex_value%0#0 self.counter everything/contract.py:83 - callsub positive_one // app_global_get_ex_value%0#0,{positive_one} positive_one() everything/contract.py:83 - // virtual: store tmp%2#0 to l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 positive_one() everything/contract.py:83 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%0#0 self.counter -= positive_one() everything/contract.py:83 - // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 self.counter -= positive_one() everything/contract.py:83 - - // {-} self.counter -= positive_one() everything/contract.py:83 - // virtual: store new_state_value%3#0 to l-stack (no copy) new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 - byte "counter" // new_state_value%3#0,"counter" self.counter everything/contract.py:83 - swap // load new_state_value%3#0 from l-stack (no copy) "counter",new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 - app_global_put // self.counter -= positive_one() everything/contract.py:83 - retsub // + int 0 // 0 self.counter everything/contract.py:83 + byte "counter" // 0,"counter" self.counter everything/contract.py:83 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:83 + // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.counter everything/contract.py:83 + // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 + // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 + assert // check counter exists // app_global_get_ex_value%0#0 self.counter everything/contract.py:83 + callsub positive_one // app_global_get_ex_value%0#0,{positive_one} positive_one() everything/contract.py:83 + // virtual: store tmp%2#0 to l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 positive_one() everything/contract.py:83 + // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%0#0 self.counter -= positive_one() everything/contract.py:83 + // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 self.counter -= positive_one() everything/contract.py:83 + - // {-} self.counter -= positive_one() everything/contract.py:83 + // virtual: store new_state_value%3#0 to l-stack (no copy) new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 + byte "counter" // new_state_value%3#0,"counter" self.counter everything/contract.py:83 + swap // load new_state_value%3#0 from l-stack (no copy) "counter",new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 + app_global_put // self.counter -= positive_one() everything/contract.py:83 + retsub // // test_cases.everything.contract.positive_one() -> uint64: positive_one: - proto 0 1 // @subroutine\ndef positive_one() -> UInt64: everything/contract.py:86-87 + proto 0 1 // @subroutine\ndef positive_one() -> UInt64: everything/contract.py:86-87 positive_one_block@0: - int 1 // 1 1 everything/contract.py:88 - retsub // 1 return UInt64(1) everything/contract.py:88 + int 1 // 1 1 everything/contract.py:88 + retsub // 1 return UInt64(1) everything/contract.py:88 diff --git a/test_cases/everything/out/MyContract.clear.teal b/test_cases/everything/out/MyContract.clear.teal index 2729415bee..9416b55def 100644 --- a/test_cases/everything/out/MyContract.clear.teal +++ b/test_cases/everything/out/MyContract.clear.teal @@ -21,7 +21,7 @@ _remove_sender: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub positive_one - byte "counter" diff --git a/test_cases/everything/out/MyContract.destructured.ir b/test_cases/everything/out/MyContract.destructured.ir index 0df3c50534..6745414543 100644 --- a/test_cases/everything/out/MyContract.destructured.ir +++ b/test_cases/everything/out/MyContract.destructured.ir @@ -96,7 +96,7 @@ contract test_cases.everything.contract.Everything: goto sender_name_existed#0 ? block@4 : block@2 block@2: // if_body_L52 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) @@ -156,7 +156,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) @@ -179,7 +179,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) diff --git a/test_cases/everything/out/MyContract.ssa.ir b/test_cases/everything/out/MyContract.ssa.ir index caf881e261..77a54b3c26 100644 --- a/test_cases/everything/out/MyContract.ssa.ir +++ b/test_cases/everything/out/MyContract.ssa.ir @@ -103,7 +103,7 @@ contract test_cases.everything.contract.Everything: goto sender_name_existed#0 ? block@3 : block@2 block@2: // if_body_L52 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) @@ -169,7 +169,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) @@ -192,7 +192,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir index 0df3c50534..6745414543 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir @@ -96,7 +96,7 @@ contract test_cases.everything.contract.Everything: goto sender_name_existed#0 ? block@4 : block@2 block@2: // if_body_L52 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) @@ -156,7 +156,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) @@ -179,7 +179,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) diff --git a/test_cases/everything/out_O2/MyContract.approval.teal b/test_cases/everything/out_O2/MyContract.approval.teal index 7ce25767d1..985813646d 100644 --- a/test_cases/everything/out_O2/MyContract.approval.teal +++ b/test_cases/everything/out_O2/MyContract.approval.teal @@ -136,7 +136,7 @@ register: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub multiplicative_identity + byte "counter" @@ -235,7 +235,7 @@ _remove_sender: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub positive_one - byte "counter" diff --git a/test_cases/everything/out_O2/MyContract.clear.teal b/test_cases/everything/out_O2/MyContract.clear.teal index 863524b9e3..4a2b885213 100644 --- a/test_cases/everything/out_O2/MyContract.clear.teal +++ b/test_cases/everything/out_O2/MyContract.clear.teal @@ -12,7 +12,7 @@ _remove_sender: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub positive_one - byte "counter" diff --git a/test_cases/everything/out_O2/MyContract.destructured.ir b/test_cases/everything/out_O2/MyContract.destructured.ir index 0df3c50534..6745414543 100644 --- a/test_cases/everything/out_O2/MyContract.destructured.ir +++ b/test_cases/everything/out_O2/MyContract.destructured.ir @@ -96,7 +96,7 @@ contract test_cases.everything.contract.Everything: goto sender_name_existed#0 ? block@4 : block@2 block@2: // if_body_L52 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) @@ -156,7 +156,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) @@ -179,7 +179,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) diff --git a/test_cases/everything/out_unoptimized/MyContract.approval.teal b/test_cases/everything/out_unoptimized/MyContract.approval.teal index 709fa1c566..13ca86fa38 100644 --- a/test_cases/everything/out_unoptimized/MyContract.approval.teal +++ b/test_cases/everything/out_unoptimized/MyContract.approval.teal @@ -207,7 +207,7 @@ register: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub multiplicative_identity + byte "counter" @@ -351,7 +351,7 @@ _remove_sender: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub positive_one - byte "counter" diff --git a/test_cases/everything/out_unoptimized/MyContract.clear.teal b/test_cases/everything/out_unoptimized/MyContract.clear.teal index 2729415bee..9416b55def 100644 --- a/test_cases/everything/out_unoptimized/MyContract.clear.teal +++ b/test_cases/everything/out_unoptimized/MyContract.clear.teal @@ -21,7 +21,7 @@ _remove_sender: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub positive_one - byte "counter" diff --git a/test_cases/everything/out_unoptimized/MyContract.destructured.ir b/test_cases/everything/out_unoptimized/MyContract.destructured.ir index 3a50cd1e36..30a7830e47 100644 --- a/test_cases/everything/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/everything/out_unoptimized/MyContract.destructured.ir @@ -102,7 +102,7 @@ contract test_cases.everything.contract.Everything: goto sender_name_existed#0 ? block@3 : block@2 block@2: // if_body_L52 let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check value exists + (assert app_global_get_ex_did_exist%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) @@ -168,7 +168,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) @@ -191,7 +191,7 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) diff --git a/test_cases/inner_transactions/out/Greeter.approval.mir b/test_cases/inner_transactions/out/Greeter.approval.mir index 37ef12b495..a89a54d4f7 100644 --- a/test_cases/inner_transactions/out/Greeter.approval.mir +++ b/test_cases/inner_transactions/out/Greeter.approval.mir @@ -105,7 +105,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:12 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.hello_app inner_transactions/c2c.py:12 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.hello_app inner_transactions/c2c.py:12 - assert // check value exists // app_global_get_ex_value%0#0 self.hello_app inner_transactions/c2c.py:12 + assert // check hello_app exists // app_global_get_ex_value%0#0 self.hello_app inner_transactions/c2c.py:12 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) app_global_get_ex_value%0#0 not self.hello_app inner_transactions/c2c.py:12 ! // {!} not self.hello_app inner_transactions/c2c.py:12 // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 not self.hello_app inner_transactions/c2c.py:12 @@ -132,7 +132,7 @@ bootstrap_block@0: // virtual: store app_global_get_ex_did_exist%6#0 to l-stack (no copy) app_global_get_ex_did_exist%6#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:22 // virtual: store app_global_get_ex_value%5#0 to l-stack (no copy) app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 self.hello_app inner_transactions/c2c.py:22 // virtual: load app_global_get_ex_did_exist%6#0 from l-stack (no copy) app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 self.hello_app inner_transactions/c2c.py:22 - assert // check value exists // app_global_get_ex_value%5#0 self.hello_app inner_transactions/c2c.py:22 + assert // check hello_app exists // app_global_get_ex_value%5#0 self.hello_app inner_transactions/c2c.py:22 // virtual: load app_global_get_ex_value%5#0 from l-stack (no copy) app_global_get_ex_value%5#0 return self.hello_app.application_id inner_transactions/c2c.py:22 retsub // app_global_get_ex_value%5#0 return self.hello_app.application_id inner_transactions/c2c.py:22 @@ -149,7 +149,7 @@ log_greetings_block@0: // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:27 // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.hello_app inner_transactions/c2c.py:27 // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.hello_app inner_transactions/c2c.py:27 - assert // check value exists // (𝕡) name#0 | app_global_get_ex_value%1#0 self.hello_app inner_transactions/c2c.py:27 + assert // check hello_app exists // (𝕡) name#0 | app_global_get_ex_value%1#0 self.hello_app inner_transactions/c2c.py:27 int appl // (𝕡) name#0 | app_global_get_ex_value%1#0,appl itxn.ApplicationCall inner_transactions/c2c.py:26 itxn_field TypeEnum // (𝕡) name#0 | app_global_get_ex_value%1#0 // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%1#0 diff --git a/test_cases/inner_transactions/out/Greeter.approval.teal b/test_cases/inner_transactions/out/Greeter.approval.teal index 41dfaf70c2..3d53c1c635 100644 --- a/test_cases/inner_transactions/out/Greeter.approval.teal +++ b/test_cases/inner_transactions/out/Greeter.approval.teal @@ -74,7 +74,7 @@ bootstrap: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists ! assert // already bootstrapped // inner_transactions/c2c.py:14-19 @@ -136,7 +136,7 @@ bootstrap: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists retsub @@ -157,7 +157,7 @@ log_greetings: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists // inner_transactions/c2c.py:26 // hello_call = itxn.ApplicationCall( int appl diff --git a/test_cases/inner_transactions/out/Greeter.arc32.json b/test_cases/inner_transactions/out/Greeter.arc32.json index e4b852f0d6..0fb02309d5 100644 --- a/test_cases/inner_transactions/out/Greeter.arc32.json +++ b/test_cases/inner_transactions/out/Greeter.arc32.json @@ -12,7 +12,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5hcHByb3ZhbF9wcm9ncmFtOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjYKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A4CiAgICBtZXRob2QgImJvb3RzdHJhcCgpdWludDY0IgogICAgbWV0aG9kICJsb2dfZ3JlZXRpbmdzKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9ib290c3RyYXBfcm91dGVANCBtYWluX2xvZ19ncmVldGluZ3Nfcm91dGVANQogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl9ib290c3RyYXBfcm91dGVANDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9sb2dfZ3JlZXRpbmdzX3JvdXRlQDU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBsb2dfZ3JlZXRpbmdzCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A4OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuYm9vdHN0cmFwKCkgLT4gdWludDY0Ogpib290c3RyYXA6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEwLTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGJvb3RzdHJhcChzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5oZWxsb19hcHAsICJhbHJlYWR5IGJvb3RzdHJhcHBlZCIKICAgIGludCAwCiAgICBieXRlICJoZWxsb19hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHZhbHVlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjE0LTE5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUJ5dGVzLmZyb21faGV4KEhFTExPX1dPUkxEX0FQUFJPVkFMX0hFWCksCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1IRUxMT19XT1JMRF9DTEVBUiwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnQgYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNwogICAgLy8gZmVlPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICBieXRlIDB4MGE4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTUKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIGJ5dGUgMHgwYTIwMDEwMTMxMWI0MTAwMjY4MDA0MDJiZWNlMTEzNjFhMDA4ZTAxMDAwMTAwMzExOTE0NDQzMTE4NDQzNjFhMDE4ODAwMTU4MDA0MTUxZjdjNzU0YzUwYjAyMjQzMzExOTE0NDQzMTE4MTQ0NDIyNDM4YTAxMDE4YmZmNTcwMjAwODAwNzQ4NjU2YzZjNmYyYzIwNGM1MDQ5MTUxNjU3MDYwMDRjNTA4OQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEzCiAgICAvLyBzZWxmLmhlbGxvX2FwcCA9ICgKICAgIGJ5dGUgImhlbGxvX2FwcCIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQtMTkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEzLTIxCiAgICAvLyBzZWxmLmhlbGxvX2FwcCA9ICgKICAgIC8vICAgICBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gICAgICAgICBmZWU9MCwKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXBwCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyMgogICAgLy8gcmV0dXJuIHNlbGYuaGVsbG9fYXBwLmFwcGxpY2F0aW9uX2lkCiAgICBpbnQgMAogICAgYnl0ZSAiaGVsbG9fYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmMyYy5HcmVldGVyLmxvZ19ncmVldGluZ3MobmFtZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19ncmVldGluZ3M6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI0LTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGxvZ19ncmVldGluZ3Moc2VsZiwgbmFtZTogYXJjNC5TdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjYtMjkKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9c2VsZi5oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImhlbGxvKHN0cmluZylzdHJpbmciKSwgbmFtZSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI3CiAgICAvLyBhcHBfaWQ9c2VsZi5oZWxsb19hcHAsCiAgICBpbnQgMAogICAgYnl0ZSAiaGVsbG9fYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB2YWx1ZSBleGlzdHMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjYKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjgKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJoZWxsbyhzdHJpbmcpc3RyaW5nIiksIG5hbWUpLAogICAgbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjYtMjkKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9c2VsZi5oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImhlbGxvKHN0cmluZylzdHJpbmciKSwgbmFtZSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjMwCiAgICAvLyBncmVldGluZyA9IGFyYzQuU3RyaW5nLmZyb21fbG9nKGhlbGxvX2NhbGwubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjMxCiAgICAvLyBsb2coYiJIZWxsb1dvcmxkIHJldHVybmVkOiAiLCBncmVldGluZy5kZWNvZGUoKSkKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlICJIZWxsb1dvcmxkIHJldHVybmVkOiAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6OAogICAgLy8gc2VsZi5oZWxsb19hcHAgPSBBcHBsaWNhdGlvbigwKQogICAgYnl0ZSAiaGVsbG9fYXBwIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5hcHByb3ZhbF9wcm9ncmFtOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjYKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A4CiAgICBtZXRob2QgImJvb3RzdHJhcCgpdWludDY0IgogICAgbWV0aG9kICJsb2dfZ3JlZXRpbmdzKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9ib290c3RyYXBfcm91dGVANCBtYWluX2xvZ19ncmVldGluZ3Nfcm91dGVANQogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl9ib290c3RyYXBfcm91dGVANDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9sb2dfZ3JlZXRpbmdzX3JvdXRlQDU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBsb2dfZ3JlZXRpbmdzCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A4OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuYm9vdHN0cmFwKCkgLT4gdWludDY0Ogpib290c3RyYXA6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEwLTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGJvb3RzdHJhcChzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5oZWxsb19hcHAsICJhbHJlYWR5IGJvb3RzdHJhcHBlZCIKICAgIGludCAwCiAgICBieXRlICJoZWxsb19hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGhlbGxvX2FwcCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50IGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTcKICAgIC8vIGZlZT0wLAogICAgaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjE2CiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgYnl0ZSAweDBhODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjE1CiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUJ5dGVzLmZyb21faGV4KEhFTExPX1dPUkxEX0FQUFJPVkFMX0hFWCksCiAgICBieXRlIDB4MGEyMDAxMDEzMTFiNDEwMDI2ODAwNDAyYmVjZTExMzYxYTAwOGUwMTAwMDEwMDMxMTkxNDQ0MzExODQ0MzYxYTAxODgwMDE1ODAwNDE1MWY3Yzc1NGM1MGIwMjI0MzMxMTkxNDQ0MzExODE0NDQyMjQzOGEwMTAxOGJmZjU3MDIwMDgwMDc0ODY1NmM2YzZmMmMyMDRjNTA0OTE1MTY1NzA2MDA0YzUwODkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQtMTkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMwogICAgLy8gc2VsZi5oZWxsb19hcHAgPSAoCiAgICBieXRlICJoZWxsb19hcHAiCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjE0LTE5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUJ5dGVzLmZyb21faGV4KEhFTExPX1dPUkxEX0FQUFJPVkFMX0hFWCksCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1IRUxMT19XT1JMRF9DTEVBUiwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMy0yMQogICAgLy8gc2VsZi5oZWxsb19hcHAgPSAoCiAgICAvLyAgICAgaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1IRUxMT19XT1JMRF9DTEVBUiwKICAgIC8vICAgICAgICAgZmVlPTAsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2FwcAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjIKICAgIC8vIHJldHVybiBzZWxmLmhlbGxvX2FwcC5hcHBsaWNhdGlvbl9pZAogICAgaW50IDAKICAgIGJ5dGUgImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgaGVsbG9fYXBwIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIubG9nX2dyZWV0aW5ncyhuYW1lOiBieXRlcykgLT4gdm9pZDoKbG9nX2dyZWV0aW5nczoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjQtMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgbG9nX2dyZWV0aW5ncyhzZWxmLCBuYW1lOiBhcmM0LlN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyNi0yOQogICAgLy8gaGVsbG9fY2FsbCA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1zZWxmLmhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiaGVsbG8oc3RyaW5nKXN0cmluZyIpLCBuYW1lKSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjcKICAgIC8vIGFwcF9pZD1zZWxmLmhlbGxvX2FwcCwKICAgIGludCAwCiAgICBieXRlICJoZWxsb19hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGhlbGxvX2FwcCBleGlzdHMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjYKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludCBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjgKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJoZWxsbyhzdHJpbmcpc3RyaW5nIiksIG5hbWUpLAogICAgbWV0aG9kICJoZWxsbyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjYtMjkKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9c2VsZi5oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImhlbGxvKHN0cmluZylzdHJpbmciKSwgbmFtZSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjMwCiAgICAvLyBncmVldGluZyA9IGFyYzQuU3RyaW5nLmZyb21fbG9nKGhlbGxvX2NhbGwubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjMxCiAgICAvLyBsb2coYiJIZWxsb1dvcmxkIHJldHVybmVkOiAiLCBncmVldGluZy5kZWNvZGUoKSkKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlICJIZWxsb1dvcmxkIHJldHVybmVkOiAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6OAogICAgLy8gc2VsZi5oZWxsb19hcHAgPSBBcHBsaWNhdGlvbigwKQogICAgYnl0ZSAiaGVsbG9fYXBwIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnQgMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/test_cases/inner_transactions/out/Greeter.destructured.ir b/test_cases/inner_transactions/out/Greeter.destructured.ir index b0cdda0534..d37471e26e 100644 --- a/test_cases/inner_transactions/out/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out/Greeter.destructured.ir @@ -45,7 +45,7 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check hello_app exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin @@ -57,14 +57,14 @@ contract test_cases.inner_transactions.c2c.Greeter: let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check hello_app exists return app_global_get_ex_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 itxn_begin let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check hello_app exists ((itxn_field TypeEnum) appl) ((itxn_field ApplicationID) app_global_get_ex_value%1#0) ((itxn_field ApplicationArgs) method "hello(string)string") diff --git a/test_cases/inner_transactions/out/Greeter.ssa.ir b/test_cases/inner_transactions/out/Greeter.ssa.ir index 877d65d07f..98b3f4b219 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.ir @@ -53,7 +53,7 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check hello_app exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin @@ -183,7 +183,7 @@ contract test_cases.inner_transactions.c2c.Greeter: let submit_result_0%3%%XferAsset#0: uint64 = (itxn XferAsset) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check hello_app exists return app_global_get_ex_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: @@ -195,7 +195,7 @@ contract test_cases.inner_transactions.c2c.Greeter: let inner_txn_params%0%%param_ApplicationArgs_idx_1#0: bytes = name#0 let inner_txn_params%0%%ApplicationArgs_length#0: uint64 = 2u let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check hello_app exists let inner_txn_params%0%%param_ApplicationID_idx_0#0: uint64 = app_global_get_ex_value%1#0 let inner_txn_params%0%%ApplicationID_length#0: uint64 = 1u let inner_txn_params%0%%ApprovalProgram_length#0: uint64 = 0u diff --git a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir index b0cdda0534..d37471e26e 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir @@ -45,7 +45,7 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check hello_app exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin @@ -57,14 +57,14 @@ contract test_cases.inner_transactions.c2c.Greeter: let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check hello_app exists return app_global_get_ex_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 itxn_begin let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check hello_app exists ((itxn_field TypeEnum) appl) ((itxn_field ApplicationID) app_global_get_ex_value%1#0) ((itxn_field ApplicationArgs) method "hello(string)string") diff --git a/test_cases/inner_transactions/out/MyContract.approval.mir b/test_cases/inner_transactions/out/MyContract.approval.mir index 971d9ed130..5b8491d55e 100644 --- a/test_cases/inner_transactions/out/MyContract.approval.mir +++ b/test_cases/inner_transactions/out/MyContract.approval.mir @@ -68,7 +68,7 @@ test1_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.name inner_transactions/contract.py:47 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.name inner_transactions/contract.py:47 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.name inner_transactions/contract.py:47 - assert // check value exists // app_global_get_ex_value%0#0 self.name inner_transactions/contract.py:47 + assert // check name exists // app_global_get_ex_value%0#0 self.name inner_transactions/contract.py:47 global CurrentApplicationAddress // app_global_get_ex_value%0#0,{global} op.Global.current_application_address inner_transactions/contract.py:50 // virtual: store asset_params%%param_ConfigAssetManager_idx_0#0 to l-stack (no copy) app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0 op.Global.current_application_address inner_transactions/contract.py:50 global CurrentApplicationAddress // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,{global} op.Global.current_application_address inner_transactions/contract.py:51 @@ -104,7 +104,7 @@ test1_block@0: // virtual: store app_global_get_ex_did_exist%3#0 to l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_did_exist%3#0,{app_global_get_ex}.0 self.name inner_transactions/contract.py:58 // virtual: store app_global_get_ex_value%2#0 to l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.name inner_transactions/contract.py:58 // virtual: load app_global_get_ex_did_exist%3#0 from l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.name inner_transactions/contract.py:58 - assert // check value exists // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 self.name inner_transactions/contract.py:58 + assert // check name exists // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 self.name inner_transactions/contract.py:58 itxn_begin // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 asset_params.submit() inner_transactions/contract.py:61 byte "unit" // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,"unit" b"unit" inner_transactions/contract.py:48 itxn_field ConfigAssetUnitName // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 diff --git a/test_cases/inner_transactions/out/MyContract.approval.teal b/test_cases/inner_transactions/out/MyContract.approval.teal index ad2ae333fa..27118e9c41 100644 --- a/test_cases/inner_transactions/out/MyContract.approval.teal +++ b/test_cases/inner_transactions/out/MyContract.approval.teal @@ -87,7 +87,7 @@ test1: int 0 byte "name" app_global_get_ex - assert // check value exists + assert // check name exists // inner_transactions/contract.py:50 // manager=op.Global.current_application_address, global CurrentApplicationAddress @@ -140,7 +140,7 @@ test1: int 0 byte "name" app_global_get_ex - assert // check value exists + assert // check name exists // inner_transactions/contract.py:61 // asset2_txn = asset_params.submit() itxn_begin diff --git a/test_cases/inner_transactions/out/MyContract.destructured.ir b/test_cases/inner_transactions/out/MyContract.destructured.ir index 58a0e98a40..d48baa8d63 100644 --- a/test_cases/inner_transactions/out/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out/MyContract.destructured.ir @@ -32,7 +32,7 @@ contract test_cases.inner_transactions.contract.MyContract: block@0: // L42 (app_global_put "name" "AST1") let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.contract.MyContract: let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) diff --git a/test_cases/inner_transactions/out/MyContract.ssa.ir b/test_cases/inner_transactions/out/MyContract.ssa.ir index c93c4daded..776c66f557 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.ir @@ -45,7 +45,7 @@ contract test_cases.inner_transactions.contract.MyContract: let asset_params%%AssetAmount_length#0: uint64 = 0u let asset_params%%AssetCloseTo_length#0: uint64 = 0u let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check name exists let asset_params%%param_ConfigAssetName_idx_0#0: bytes = app_global_get_ex_value%0#0 let asset_params%%ConfigAssetName_length#0: uint64 = 1u let asset_params%%AssetReceiver_length#0: uint64 = 0u @@ -172,7 +172,7 @@ contract test_cases.inner_transactions.contract.MyContract: let asset1_txn%%VoteLast#0: uint64 = (itxn VoteLast) let asset1_txn%%XferAsset#0: uint64 = (itxn XferAsset) let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check name exists let asset_params%%param_ConfigAssetName_idx_0#1: bytes = app_global_get_ex_value%2#0 let asset_params%%ConfigAssetName_length#1: uint64 = 1u itxn_begin diff --git a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir index 033eca633d..1d1beb5fb2 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir @@ -32,7 +32,7 @@ contract test_cases.inner_transactions.contract.MyContract: block@0: // L42 (app_global_put "name" "AST1") let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.contract.MyContract: let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) diff --git a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir index 651528424e..44aca6d788 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir @@ -32,7 +32,7 @@ contract test_cases.inner_transactions.contract.MyContract: block@0: // L42 (app_global_put "name" "AST1") let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.contract.MyContract: let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) diff --git a/test_cases/inner_transactions/out_O2/Greeter.approval.teal b/test_cases/inner_transactions/out_O2/Greeter.approval.teal index 39dc502d89..632cac3e35 100644 --- a/test_cases/inner_transactions/out_O2/Greeter.approval.teal +++ b/test_cases/inner_transactions/out_O2/Greeter.approval.teal @@ -57,7 +57,7 @@ bootstrap: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists ! assert // already bootstrapped itxn_begin @@ -76,7 +76,7 @@ bootstrap: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists retsub @@ -87,7 +87,7 @@ log_greetings: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists int appl itxn_field TypeEnum itxn_field ApplicationID diff --git a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir index b0cdda0534..d37471e26e 100644 --- a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir @@ -45,7 +45,7 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check hello_app exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin @@ -57,14 +57,14 @@ contract test_cases.inner_transactions.c2c.Greeter: let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check hello_app exists return app_global_get_ex_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 itxn_begin let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check hello_app exists ((itxn_field TypeEnum) appl) ((itxn_field ApplicationID) app_global_get_ex_value%1#0) ((itxn_field ApplicationArgs) method "hello(string)string") diff --git a/test_cases/inner_transactions/out_O2/MyContract.approval.teal b/test_cases/inner_transactions/out_O2/MyContract.approval.teal index 0ed5e984da..dd5d02b584 100644 --- a/test_cases/inner_transactions/out_O2/MyContract.approval.teal +++ b/test_cases/inner_transactions/out_O2/MyContract.approval.teal @@ -46,7 +46,7 @@ test1: int 0 byte "name" app_global_get_ex - assert // check value exists + assert // check name exists global CurrentApplicationAddress global CurrentApplicationAddress byte "name" @@ -77,7 +77,7 @@ test1: int 0 byte "name" app_global_get_ex - assert // check value exists + assert // check name exists itxn_begin byte "unit" itxn_field ConfigAssetUnitName diff --git a/test_cases/inner_transactions/out_O2/MyContract.destructured.ir b/test_cases/inner_transactions/out_O2/MyContract.destructured.ir index 58a0e98a40..d48baa8d63 100644 --- a/test_cases/inner_transactions/out_O2/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out_O2/MyContract.destructured.ir @@ -32,7 +32,7 @@ contract test_cases.inner_transactions.contract.MyContract: block@0: // L42 (app_global_put "name" "AST1") let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -49,7 +49,7 @@ contract test_cases.inner_transactions.contract.MyContract: let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) diff --git a/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal b/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal index 80a4ac0056..bd12fc851f 100644 --- a/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal +++ b/test_cases/inner_transactions/out_unoptimized/Greeter.approval.teal @@ -96,7 +96,7 @@ bootstrap: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists ! assert // already bootstrapped // inner_transactions/c2c.py:14-19 @@ -152,7 +152,7 @@ bootstrap: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists retsub @@ -180,7 +180,7 @@ log_greetings: int 0 byte "hello_app" app_global_get_ex - assert // check value exists + assert // check hello_app exists // inner_transactions/c2c.py:26 // hello_call = itxn.ApplicationCall( int appl diff --git a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir index efc7726c64..6ac6676daf 100644 --- a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir @@ -53,7 +53,7 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check hello_app exists let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin @@ -71,7 +71,7 @@ contract test_cases.inner_transactions.c2c.Greeter: let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check value exists + (assert app_global_get_ex_did_exist%6#0) // check hello_app exists return app_global_get_ex_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: @@ -80,7 +80,7 @@ contract test_cases.inner_transactions.c2c.Greeter: let inner_txn_params%0%%param_ApplicationArgs_idx_0#0: bytes = method "hello(string)string" let inner_txn_params%0%%param_ApplicationArgs_idx_1#0: bytes = name#0 let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check value exists + (assert app_global_get_ex_did_exist%2#0) // check hello_app exists let inner_txn_params%0%%param_ApplicationID_idx_0#0: uint64 = app_global_get_ex_value%1#0 let inner_txn_params%0%%param_TypeEnum_idx_0#0: uint64 = appl ((itxn_field TypeEnum) inner_txn_params%0%%param_TypeEnum_idx_0#0) diff --git a/test_cases/inner_transactions/out_unoptimized/MyContract.approval.teal b/test_cases/inner_transactions/out_unoptimized/MyContract.approval.teal index 8e859f99de..7b7ee75079 100644 --- a/test_cases/inner_transactions/out_unoptimized/MyContract.approval.teal +++ b/test_cases/inner_transactions/out_unoptimized/MyContract.approval.teal @@ -94,7 +94,7 @@ test1: int 0 byte "name" app_global_get_ex - assert // check value exists + assert // check name exists // inner_transactions/contract.py:49 // decimals=3, int 3 @@ -155,7 +155,7 @@ test1: int 0 byte "name" app_global_get_ex - assert // check value exists + assert // check name exists // inner_transactions/contract.py:61 // asset2_txn = asset_params.submit() itxn_begin diff --git a/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir b/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir index dda2eb7e85..e5b5fa7a44 100644 --- a/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir @@ -36,7 +36,7 @@ contract test_cases.inner_transactions.contract.MyContract: block@0: // L42 (app_global_put "name" "AST1") let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check name exists let asset_params%%param_ConfigAssetName_idx_0#0: bytes = app_global_get_ex_value%0#0 let asset_params%%param_ConfigAssetDecimals_idx_0#0: uint64 = 3u let asset_params%%param_Fee_idx_0#0: uint64 = 0u @@ -61,7 +61,7 @@ contract test_cases.inner_transactions.contract.MyContract: let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check name exists let asset_params%%param_ConfigAssetName_idx_0#0: bytes = app_global_get_ex_value%2#0 itxn_begin ((itxn_field ConfigAssetUnitName) asset_params%%param_ConfigAssetUnitName_idx_0#0) diff --git a/test_cases/match/out/MyContract.approval.mir b/test_cases/match/out/MyContract.approval.mir index bb704a2035..e2906219b3 100644 --- a/test_cases/match/out/MyContract.approval.mir +++ b/test_cases/match/out/MyContract.approval.mir @@ -148,14 +148,14 @@ match_attributes_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) n#0,app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.case_one match/contract.py:64 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.case_one match/contract.py:64 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.case_one match/contract.py:64 - assert // check value exists // n#0,app_global_get_ex_value%0#0 self.case_one match/contract.py:64 + assert // check case_one exists // n#0,app_global_get_ex_value%0#0 self.case_one match/contract.py:64 int 0 // n#0,app_global_get_ex_value%0#0,0 self.case_two match/contract.py:67 byte "case_two" // n#0,app_global_get_ex_value%0#0,0,"case_two" self.case_two match/contract.py:67 app_global_get_ex // n#0,app_global_get_ex_value%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.case_two match/contract.py:67 // virtual: store app_global_get_ex_did_exist%3#0 to l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_did_exist%3#0,{app_global_get_ex}.0 self.case_two match/contract.py:67 // virtual: store app_global_get_ex_value%2#0 to l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.case_two match/contract.py:67 // virtual: load app_global_get_ex_did_exist%3#0 from l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.case_two match/contract.py:67 - assert // check value exists // n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0 self.case_two match/contract.py:67 + assert // check case_two exists // n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0 self.case_two match/contract.py:67 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) n#0,app_global_get_ex_value%2#0,app_global_get_ex_value%0#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 // virtual: load app_global_get_ex_value%2#0 from l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 uncover 2 // load n#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_value%2#0,n#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 diff --git a/test_cases/match/out/MyContract.approval.teal b/test_cases/match/out/MyContract.approval.teal index 1410a65e84..d982cd5f82 100644 --- a/test_cases/match/out/MyContract.approval.teal +++ b/test_cases/match/out/MyContract.approval.teal @@ -241,13 +241,13 @@ match_attributes: int 0 byte "case_one" app_global_get_ex - assert // check value exists + assert // check case_one exists // match/contract.py:67 // case self.case_two: int 0 byte "case_two" app_global_get_ex - assert // check value exists + assert // check case_two exists // match/contract.py:63-72 // match n: // case self.case_one: diff --git a/test_cases/match/out/MyContract.destructured.ir b/test_cases/match/out/MyContract.destructured.ir index 628937a7c7..39d2c488cb 100644 --- a/test_cases/match/out/MyContract.destructured.ir +++ b/test_cases/match/out/MyContract.destructured.ir @@ -70,9 +70,9 @@ contract test_cases.match.contract.MyContract: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check case_one exists let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check case_two exists switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 (log "Hello one") diff --git a/test_cases/match/out/MyContract.ssa.ir b/test_cases/match/out/MyContract.ssa.ir index c15f822ca7..018230b911 100644 --- a/test_cases/match/out/MyContract.ssa.ir +++ b/test_cases/match/out/MyContract.ssa.ir @@ -86,9 +86,9 @@ contract test_cases.match.contract.MyContract: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check case_one exists let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check case_two exists switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 let hello#0: bytes = "Hello one" diff --git a/test_cases/match/out/MyContract.ssa.opt_pass_1.ir b/test_cases/match/out/MyContract.ssa.opt_pass_1.ir index 628937a7c7..39d2c488cb 100644 --- a/test_cases/match/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/match/out/MyContract.ssa.opt_pass_1.ir @@ -70,9 +70,9 @@ contract test_cases.match.contract.MyContract: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check case_one exists let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check case_two exists switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 (log "Hello one") diff --git a/test_cases/match/out_O2/MyContract.approval.teal b/test_cases/match/out_O2/MyContract.approval.teal index 25012973d8..ce31730fd4 100644 --- a/test_cases/match/out_O2/MyContract.approval.teal +++ b/test_cases/match/out_O2/MyContract.approval.teal @@ -116,11 +116,11 @@ match_attributes: int 0 byte "case_one" app_global_get_ex - assert // check value exists + assert // check case_one exists int 0 byte "case_two" app_global_get_ex - assert // check value exists + assert // check case_two exists uncover 2 match match_attributes_switch_case_0@1 match_attributes_switch_case_1@2 b match_attributes_switch_case_default@3 diff --git a/test_cases/match/out_O2/MyContract.destructured.ir b/test_cases/match/out_O2/MyContract.destructured.ir index 628937a7c7..39d2c488cb 100644 --- a/test_cases/match/out_O2/MyContract.destructured.ir +++ b/test_cases/match/out_O2/MyContract.destructured.ir @@ -70,9 +70,9 @@ contract test_cases.match.contract.MyContract: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check case_one exists let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check case_two exists switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 (log "Hello one") diff --git a/test_cases/match/out_unoptimized/MyContract.approval.teal b/test_cases/match/out_unoptimized/MyContract.approval.teal index bbd4a712b0..0c7f694e6e 100644 --- a/test_cases/match/out_unoptimized/MyContract.approval.teal +++ b/test_cases/match/out_unoptimized/MyContract.approval.teal @@ -256,13 +256,13 @@ match_attributes: int 0 byte "case_one" app_global_get_ex - assert // check value exists + assert // check case_one exists // match/contract.py:67 // case self.case_two: int 0 byte "case_two" app_global_get_ex - assert // check value exists + assert // check case_two exists // match/contract.py:63-72 // match n: // case self.case_one: diff --git a/test_cases/match/out_unoptimized/MyContract.destructured.ir b/test_cases/match/out_unoptimized/MyContract.destructured.ir index 2f41c2ae1b..c122ee7847 100644 --- a/test_cases/match/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/match/out_unoptimized/MyContract.destructured.ir @@ -86,9 +86,9 @@ contract test_cases.match.contract.MyContract: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check case_one exists let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check value exists + (assert app_global_get_ex_did_exist%3#0) // check case_two exists switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 let hello#0: bytes = "Hello one" diff --git a/test_cases/simplish/out/Simplish.approval.mir b/test_cases/simplish/out/Simplish.approval.mir index 525ac4dccc..2c4cfb46d4 100644 --- a/test_cases/simplish/out/Simplish.approval.mir +++ b/test_cases/simplish/out/Simplish.approval.mir @@ -66,7 +66,7 @@ main_if_body@6: // virtual: store app_global_get_ex_did_exist%8#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_did_exist%8#0,{app_global_get_ex}.0 self.counter simplish/contract.py:40 // virtual: store app_global_get_ex_value%7#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0,app_global_get_ex_did_exist%8#0 self.counter simplish/contract.py:40 // virtual: load app_global_get_ex_did_exist%8#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0,app_global_get_ex_did_exist%8#0 self.counter simplish/contract.py:40 - assert // check value exists // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0 self.counter simplish/contract.py:40 + assert // check counter exists // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0 self.counter simplish/contract.py:40 // virtual: load app_global_get_ex_value%7#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0 itoa(self.counter) simplish/contract.py:40 callsub itoa // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {itoa} itoa(self.counter) simplish/contract.py:40 // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%9#0 itoa(self.counter) simplish/contract.py:40 @@ -461,7 +461,7 @@ CallCounter.increment_counter_block@0: // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.counter simplish/base_class.py:13 // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter simplish/base_class.py:13 // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter simplish/base_class.py:13 - assert // check value exists // app_global_get_ex_value%0#0 self.counter simplish/base_class.py:13 + assert // check counter exists // app_global_get_ex_value%0#0 self.counter simplish/base_class.py:13 // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) app_global_get_ex_value%0#0 self.counter += 1 simplish/base_class.py:13 int 1 // app_global_get_ex_value%0#0,1 1 simplish/base_class.py:13 + // {+} self.counter += 1 simplish/base_class.py:13 diff --git a/test_cases/simplish/out/Simplish.approval.teal b/test_cases/simplish/out/Simplish.approval.teal index b180514d78..795cc9f3b4 100644 --- a/test_cases/simplish/out/Simplish.approval.teal +++ b/test_cases/simplish/out/Simplish.approval.teal @@ -67,7 +67,7 @@ main_after_if_else@4: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub itoa byte "I was used " swap @@ -502,7 +502,7 @@ CallCounter.increment_counter: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists int 1 + byte "counter" diff --git a/test_cases/simplish/out/Simplish.destructured.ir b/test_cases/simplish/out/Simplish.destructured.ir index be3e3a6c8c..9c72e8d43e 100644 --- a/test_cases/simplish/out/Simplish.destructured.ir +++ b/test_cases/simplish/out/Simplish.destructured.ir @@ -23,7 +23,7 @@ contract test_cases.simplish.contract.Simplish: goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check value exists + (assert app_global_get_ex_did_exist%8#0) // check counter exists let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") @@ -173,7 +173,7 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out/Simplish.ssa.ir b/test_cases/simplish/out/Simplish.ssa.ir index 0349ba2110..84316e8031 100644 --- a/test_cases/simplish/out/Simplish.ssa.ir +++ b/test_cases/simplish/out/Simplish.ssa.ir @@ -25,7 +25,7 @@ contract test_cases.simplish.contract.Simplish: goto tmp%6#0 ? block@6 : block@7 block@6: // if_body_L39 let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check value exists + (assert app_global_get_ex_did_exist%8#0) // check counter exists let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") @@ -199,7 +199,7 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir b/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir index 9860560261..52000ffb6f 100644 --- a/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir +++ b/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir @@ -24,7 +24,7 @@ contract test_cases.simplish.contract.Simplish: goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check value exists + (assert app_global_get_ex_did_exist%8#0) // check counter exists let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") @@ -190,7 +190,7 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir b/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir index 92f66a42ad..bcafba71a1 100644 --- a/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir +++ b/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir @@ -23,7 +23,7 @@ contract test_cases.simplish.contract.Simplish: goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check value exists + (assert app_global_get_ex_did_exist%8#0) // check counter exists let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") @@ -188,7 +188,7 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out_O2/Simplish.approval.teal b/test_cases/simplish/out_O2/Simplish.approval.teal index 9985134747..ee0114804c 100644 --- a/test_cases/simplish/out_O2/Simplish.approval.teal +++ b/test_cases/simplish/out_O2/Simplish.approval.teal @@ -38,7 +38,7 @@ main_after_if_else@4: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub itoa byte "I was used " swap @@ -287,7 +287,7 @@ CallCounter.increment_counter: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists int 1 + byte "counter" diff --git a/test_cases/simplish/out_O2/Simplish.destructured.ir b/test_cases/simplish/out_O2/Simplish.destructured.ir index 485885028a..2c5047fd53 100644 --- a/test_cases/simplish/out_O2/Simplish.destructured.ir +++ b/test_cases/simplish/out_O2/Simplish.destructured.ir @@ -23,7 +23,7 @@ contract test_cases.simplish.contract.Simplish: goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check value exists + (assert app_global_get_ex_did_exist%8#0) // check counter exists let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") @@ -171,7 +171,7 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out_unoptimized/Simplish.approval.teal b/test_cases/simplish/out_unoptimized/Simplish.approval.teal index 812ce4fe34..5317819bf8 100644 --- a/test_cases/simplish/out_unoptimized/Simplish.approval.teal +++ b/test_cases/simplish/out_unoptimized/Simplish.approval.teal @@ -69,7 +69,7 @@ main_after_if_else@4: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists callsub itoa byte "I was used " swap @@ -509,7 +509,7 @@ CallCounter.increment_counter: int 0 byte "counter" app_global_get_ex - assert // check value exists + assert // check counter exists int 1 + byte "counter" diff --git a/test_cases/simplish/out_unoptimized/Simplish.destructured.ir b/test_cases/simplish/out_unoptimized/Simplish.destructured.ir index a9fb38d2bb..443583a93d 100644 --- a/test_cases/simplish/out_unoptimized/Simplish.destructured.ir +++ b/test_cases/simplish/out_unoptimized/Simplish.destructured.ir @@ -25,7 +25,7 @@ contract test_cases.simplish.contract.Simplish: goto tmp%6#0 ? block@6 : block@7 block@6: // if_body_L39 let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check value exists + (assert app_global_get_ex_did_exist%8#0) // check counter exists let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") @@ -188,7 +188,7 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check value exists + (assert app_global_get_ex_did_exist%1#0) // check counter exists let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return From 2fdca1ca67f73f702f8f4284190e48062dd6c729 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 19:18:22 +0800 Subject: [PATCH 22/40] wip --- src/puya/ir/builder/state.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/puya/ir/builder/state.py b/src/puya/ir/builder/state.py index e63b447e54..8908932a89 100644 --- a/src/puya/ir/builder/state.py +++ b/src/puya/ir/builder/state.py @@ -164,6 +164,8 @@ def visit_state_get(context: IRFunctionBuildContext, expr: awst_nodes.StateGet) source_location=subject.source_location, encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), ) + default = context.visitor.visit_and_materialise_single(expr.default) + args: list[Value] = [current_app_offset, key] if isinstance(subject, awst_nodes.AppStateExpression): op = AVMOp.app_global_get_ex @@ -171,7 +173,6 @@ def visit_state_get(context: IRFunctionBuildContext, expr: awst_nodes.StateGet) op = AVMOp.app_local_get_ex account = context.visitor.visit_and_materialise_single(subject.account) args.insert(0, account) - default = context.visitor.visit_and_materialise_single(expr.default) maybe_value, exists = context.visitor.materialise_value_provider( Intrinsic( op=op, From a0232217b1abdef13623028473b32cc8648afcba Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 19:32:08 +0800 Subject: [PATCH 23/40] skip empty init functions --- .../out/LocalStateContract.approval.mir | 439 ++++++++--------- .../out/LocalStateContract.approval.teal | 67 +-- .../out/LocalStateContract.destructured.ir | 144 +++--- .../local_state/out/LocalStateContract.ssa.ir | 160 +++--- .../out/LocalStateContract.ssa.opt_pass_1.ir | 148 +++--- .../out/LocalStateContract.ssa.opt_pass_2.ir | 144 +++--- .../out/LocalStateWithOffsets.approval.mir | 437 ++++++++--------- .../out/LocalStateWithOffsets.approval.teal | 67 +-- .../out/LocalStateWithOffsets.destructured.ir | 138 +++--- .../out/LocalStateWithOffsets.ssa.ir | 152 +++--- .../LocalStateWithOffsets.ssa.opt_pass_1.ir | 140 +++--- .../LocalStateWithOffsets.ssa.opt_pass_2.ir | 138 +++--- .../out_O2/LocalStateContract.approval.teal | 57 +-- .../out_O2/LocalStateContract.destructured.ir | 132 +++-- .../LocalStateWithOffsets.approval.teal | 57 +-- .../LocalStateWithOffsets.destructured.ir | 126 +++-- .../LocalStateContract.approval.teal | 73 ++- .../LocalStateContract.destructured.ir | 160 +++--- .../LocalStateWithOffsets.approval.teal | 73 ++- .../LocalStateWithOffsets.destructured.ir | 152 +++--- examples/local_state/puya.log | 462 +++++++----------- examples/sizes.txt | 6 +- src/puya/ir/main.py | 2 + .../everything/out/MyContract.approval.mir | 141 +++--- .../everything/out/MyContract.approval.teal | 25 +- .../everything/out/MyContract.arc32.json | 2 +- .../everything/out/MyContract.destructured.ir | 98 ++-- test_cases/everything/out/MyContract.ssa.ir | 104 ++-- .../out/MyContract.ssa.opt_pass_1.ir | 98 ++-- .../out_O2/MyContract.approval.teal | 23 +- .../out_O2/MyContract.destructured.ir | 98 ++-- .../out_unoptimized/MyContract.approval.teal | 29 +- .../MyContract.destructured.ir | 104 ++-- test_cases/everything/puya.log | 163 +++--- 34 files changed, 1948 insertions(+), 2411 deletions(-) diff --git a/examples/local_state/out/LocalStateContract.approval.mir b/examples/local_state/out/LocalStateContract.approval.mir index 45873de663..a2c5f010d5 100644 --- a/examples/local_state/out/LocalStateContract.approval.mir +++ b/examples/local_state/out/LocalStateContract.approval.mir @@ -1,289 +1,270 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: main: - int 0 // allocate 1 to stack (𝕗) method#0 | + int 0 // allocate 1 to stack (𝕗) method#0 | main_block@0: - txn ApplicationID // (𝕗) method#0 | {txn} - // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) method#0 | app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) method#0 | app_id%0#0 - bnz main_entrypoint@2 // (𝕗) method#0 | - // Implicit fall through to main_on_create@1 // (𝕗) method#0 | - -main_on_create@1: - callsub __init__ // (𝕗) method#0 | - // Implicit fall through to main_entrypoint@2 // (𝕗) method#0 | - -main_entrypoint@2: - txn ApplicationID // (𝕗) method#0 | {txn} Txn.application_id local_state/local_state_contract.py:18 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) method#0 | tmp%1#0 Txn.application_id local_state/local_state_contract.py:18 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) method#0 | tmp%1#0 if Txn.application_id == 0: local_state/local_state_contract.py:18 - bnz main_after_if_else@4 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 - // Implicit fall through to main_if_body@3 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 + txn ApplicationID // (𝕗) method#0 | {txn} Txn.application_id local_state/local_state_contract.py:18 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕗) method#0 | tmp%0#0 Txn.application_id local_state/local_state_contract.py:18 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕗) method#0 | tmp%0#0 if Txn.application_id == 0: local_state/local_state_contract.py:18 + bnz main_after_if_else@2 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 + // Implicit fall through to main_if_body@1 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 + +main_if_body@1: + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:19 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:19 + +main_after_if_else@2: + txn OnCompletion // (𝕗) method#0 | {txn} Txn.on_completion local_state/local_state_contract.py:20 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) method#0 | tmp%2#0 Txn.on_completion local_state/local_state_contract.py:20 + dup // load tmp%2#0 from l-stack (copy) (𝕗) method#0 | tmp%2#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + ! // (𝕗) method#0 | tmp%2#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + swap // store contains%3#0 to l-stack (no copy) (𝕗) method#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) method#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + int OptIn // (𝕗) method#0 | contains%3#0,tmp%2#0,OptIn OnCompleteAction.OptIn local_state/local_state_contract.py:20 + == // (𝕗) method#0 | contains%3#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: store is_equal%4#0 to l-stack (no copy) (𝕗) method#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load contains%3#0 from l-stack (no copy) (𝕗) method#0 | is_equal%4#0,contains%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) method#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + || // (𝕗) method#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) method#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) method#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + bnz main_after_if_else@4 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // Implicit fall through to main_if_body@3 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 main_if_body@3: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:19 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:19 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:21 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:21 main_after_if_else@4: - txn OnCompletion // (𝕗) method#0 | {txn} Txn.on_completion local_state/local_state_contract.py:20 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) method#0 | tmp%3#0 Txn.on_completion local_state/local_state_contract.py:20 - dup // load tmp%3#0 from l-stack (copy) (𝕗) method#0 | tmp%3#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - ! // (𝕗) method#0 | tmp%3#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - swap // store contains%4#0 to l-stack (no copy) (𝕗) method#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) method#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - int OptIn // (𝕗) method#0 | contains%4#0,tmp%3#0,OptIn OnCompleteAction.OptIn local_state/local_state_contract.py:20 - == // (𝕗) method#0 | contains%4#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: store is_equal%5#0 to l-stack (no copy) (𝕗) method#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load contains%4#0 from l-stack (no copy) (𝕗) method#0 | is_equal%5#0,contains%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load is_equal%5#0 from l-stack (no copy) (𝕗) method#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - || // (𝕗) method#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - bnz main_after_if_else@6 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // Implicit fall through to main_if_body@5 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:22 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.num_app_args local_state/local_state_contract.py:22 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0 | tmp%6#0 if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + bnz main_after_if_else@6 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + // Implicit fall through to main_if_body@5 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 main_if_body@5: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:21 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:21 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:23 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:23 main_after_if_else@6: - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:22 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0 | tmp%7#0 Txn.num_app_args local_state/local_state_contract.py:22 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0 | tmp%7#0 if Txn.num_app_args == 0: local_state/local_state_contract.py:22 - bnz main_after_if_else@8 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 - // Implicit fall through to main_if_body@7 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + txna ApplicationArgs 0 // (𝕗) method#0 | {txna} Txn.application_args(0) local_state/local_state_contract.py:25 + bury 1 // store method#0 to f-stack (𝕗) method#0 | method = Txn.application_args(0) local_state/local_state_contract.py:25 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:26 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0 | tmp%8#0 Txn.num_app_args local_state/local_state_contract.py:26 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0 | tmp%8#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 + int 1 // (𝕗) method#0 | tmp%8#0,1 1 local_state/local_state_contract.py:26 + == // (𝕗) method#0 | {==} Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0 | tmp%9#0 if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + bz main_else_body@17 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // Implicit fall through to main_if_body@7 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 main_if_body@7: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:23 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:23 - -main_after_if_else@8: - txna ApplicationArgs 0 // (𝕗) method#0 | {txna} Txn.application_args(0) local_state/local_state_contract.py:25 - bury 1 // store method#0 to f-stack (𝕗) method#0 | method = Txn.application_args(0) local_state/local_state_contract.py:25 - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:26 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args local_state/local_state_contract.py:26 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 - int 1 // (𝕗) method#0 | tmp%9#0,1 1 local_state/local_state_contract.py:26 - == // (𝕗) method#0 | {==} Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0 | tmp%10#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0 | tmp%10#0 if Txn.num_app_args == 1: local_state/local_state_contract.py:26 - bz main_else_body@19 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // Implicit fall through to main_if_body@9 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 - -main_if_body@9: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - byte "get_guaranteed_data" // (𝕗) method#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_contract.py:27 - == // (𝕗) method#0 | {==} method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0 | tmp%11#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0 | tmp%11#0 if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - bz main_else_body@11 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // Implicit fall through to main_if_body@10 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + byte "get_guaranteed_data" // (𝕗) method#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_contract.py:27 + == // (𝕗) method#0 | {==} method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0 | tmp%10#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0 | tmp%10#0 if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + bz main_else_body@9 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // Implicit fall through to main_if_body@8 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + +main_if_body@8: + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:28 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0 | tmp%11#0 Txn.sender local_state/local_state_contract.py:28 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0 | tmp%11#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + callsub get_guaranteed_data // (𝕗) method#0 | {get_guaranteed_data} self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0 | tmp%12#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0 | tmp%12#0 log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 + log // (𝕗) method#0 | log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 + b main_after_if_else@16 // (𝕗) method#0 | + +main_else_body@9: + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 + byte "get_data_or_assert" // (𝕗) method#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_contract.py:29 + == // (𝕗) method#0 | {==} method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0 | tmp%13#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0 | tmp%13#0 elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + bz main_else_body@11 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // Implicit fall through to main_if_body@10 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 main_if_body@10: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:28 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0 | tmp%12#0 Txn.sender local_state/local_state_contract.py:28 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0 | tmp%12#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - callsub get_guaranteed_data // (𝕗) method#0 | {get_guaranteed_data} self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0 | tmp%13#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0 | tmp%13#0 log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 - log // (𝕗) method#0 | log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 - b main_after_if_else@18 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:30 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0 | tmp%14#0 Txn.sender local_state/local_state_contract.py:30 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0 | tmp%14#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + callsub get_data_or_assert // (𝕗) method#0 | {get_data_or_assert} self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0 | tmp%15#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0 | tmp%15#0 log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 + log // (𝕗) method#0 | log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 + b main_after_if_else@16 // (𝕗) method#0 | main_else_body@11: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 - byte "get_data_or_assert" // (𝕗) method#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_contract.py:29 - == // (𝕗) method#0 | {==} method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0 | tmp%14#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0 | tmp%14#0 elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 - bz main_else_body@13 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // Implicit fall through to main_if_body@12 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"delete_data": local_state/local_state_contract.py:31 + byte "delete_data" // (𝕗) method#0 | method#0,"delete_data" b"delete_data" local_state/local_state_contract.py:31 + == // (𝕗) method#0 | {==} method == b"delete_data": local_state/local_state_contract.py:31 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0 | tmp%16#0 method == b"delete_data": local_state/local_state_contract.py:31 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0 | tmp%16#0 elif method == b"delete_data": local_state/local_state_contract.py:31 + bz main_else_body@13 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 + // Implicit fall through to main_if_body@12 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 main_if_body@12: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:30 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0 | tmp%15#0 Txn.sender local_state/local_state_contract.py:30 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0 | tmp%15#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - callsub get_data_or_assert // (𝕗) method#0 | {get_data_or_assert} self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0 | tmp%16#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0 | tmp%16#0 log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 - log // (𝕗) method#0 | log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 - b main_after_if_else@18 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:32 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0 | tmp%17#0 Txn.sender local_state/local_state_contract.py:32 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0 | tmp%17#0 self.delete_data(Txn.sender) local_state/local_state_contract.py:32 + callsub delete_data // (𝕗) method#0 | self.delete_data(Txn.sender) local_state/local_state_contract.py:32 + byte "Deleted" // (𝕗) method#0 | "Deleted" b"Deleted" local_state/local_state_contract.py:33 + log // (𝕗) method#0 | log(b"Deleted") local_state/local_state_contract.py:33 + b main_after_if_else@16 // (𝕗) method#0 | main_else_body@13: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"delete_data": local_state/local_state_contract.py:31 - byte "delete_data" // (𝕗) method#0 | method#0,"delete_data" b"delete_data" local_state/local_state_contract.py:31 - == // (𝕗) method#0 | {==} method == b"delete_data": local_state/local_state_contract.py:31 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0 | tmp%17#0 method == b"delete_data": local_state/local_state_contract.py:31 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0 | tmp%17#0 elif method == b"delete_data": local_state/local_state_contract.py:31 - bz main_else_body@15 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 - // Implicit fall through to main_if_body@14 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 - -main_if_body@14: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:32 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.sender local_state/local_state_contract.py:32 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0 | tmp%18#0 self.delete_data(Txn.sender) local_state/local_state_contract.py:32 - callsub delete_data // (𝕗) method#0 | self.delete_data(Txn.sender) local_state/local_state_contract.py:32 - byte "Deleted" // (𝕗) method#0 | "Deleted" b"Deleted" local_state/local_state_contract.py:33 - log // (𝕗) method#0 | log(b"Deleted") local_state/local_state_contract.py:33 - b main_after_if_else@18 // (𝕗) method#0 | - -main_else_body@15: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:35 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:35 - -main_after_if_else@18: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:36 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:36 - -main_else_body@19: - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:37 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args local_state/local_state_contract.py:37 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 - int 2 // (𝕗) method#0 | tmp%19#0,2 2 local_state/local_state_contract.py:37 - == // (𝕗) method#0 | {==} Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0 | tmp%20#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0 | tmp%20#0 elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 - bz main_else_body@27 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // Implicit fall through to main_if_body@20 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 - -main_if_body@20: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"set_data": local_state/local_state_contract.py:38 - byte "set_data" // (𝕗) method#0 | method#0,"set_data" b"set_data" local_state/local_state_contract.py:38 - == // (𝕗) method#0 | {==} method == b"set_data": local_state/local_state_contract.py:38 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0 method == b"set_data": local_state/local_state_contract.py:38 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0 | tmp%21#0 if method == b"set_data": local_state/local_state_contract.py:38 - bz main_else_body@22 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 - // Implicit fall through to main_if_body@21 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:35 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:35 + +main_after_if_else@16: + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:36 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:36 + +main_else_body@17: + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:37 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.num_app_args local_state/local_state_contract.py:37 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 + int 2 // (𝕗) method#0 | tmp%18#0,2 2 local_state/local_state_contract.py:37 + == // (𝕗) method#0 | {==} Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0 | tmp%19#0 elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + bz main_else_body@25 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // Implicit fall through to main_if_body@18 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + +main_if_body@18: + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"set_data": local_state/local_state_contract.py:38 + byte "set_data" // (𝕗) method#0 | method#0,"set_data" b"set_data" local_state/local_state_contract.py:38 + == // (𝕗) method#0 | {==} method == b"set_data": local_state/local_state_contract.py:38 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0 | tmp%20#0 method == b"set_data": local_state/local_state_contract.py:38 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0 | tmp%20#0 if method == b"set_data": local_state/local_state_contract.py:38 + bz main_else_body@20 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 + // Implicit fall through to main_if_body@19 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 + +main_if_body@19: + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:39 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0 Txn.sender local_state/local_state_contract.py:39 + txna ApplicationArgs 1 // (𝕗) method#0 | tmp%21#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:39 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0,tmp%22#0 Txn.application_args(1) local_state/local_state_contract.py:39 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%21#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0 | tmp%21#0,tmp%22#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + callsub set_data // (𝕗) method#0 | self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + b main_after_if_else@24 // (𝕗) method#0 | + +main_else_body@20: + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 + byte "get_data_with_default" // (𝕗) method#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_contract.py:40 + == // (𝕗) method#0 | {==} method == b"get_data_with_default": local_state/local_state_contract.py:40 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0 | tmp%23#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0 | tmp%23#0 elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + bz main_else_body@22 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + // Implicit fall through to main_if_body@21 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 main_if_body@21: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:39 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0 | tmp%22#0 Txn.sender local_state/local_state_contract.py:39 - txna ApplicationArgs 1 // (𝕗) method#0 | tmp%22#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:39 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%23#0 Txn.application_args(1) local_state/local_state_contract.py:39 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0 | tmp%23#0,tmp%22#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%23#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - callsub set_data // (𝕗) method#0 | self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - b main_after_if_else@26 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:41 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0 Txn.sender local_state/local_state_contract.py:41 + txna ApplicationArgs 1 // (𝕗) method#0 | tmp%24#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:41 + // virtual: store tmp%25#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0,tmp%25#0 Txn.application_args(1) local_state/local_state_contract.py:41 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%24#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: load tmp%25#0 from l-stack (no copy) (𝕗) method#0 | tmp%24#0,tmp%25#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + callsub get_data_with_default // (𝕗) method#0 | {get_data_with_default} self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) method#0 | tmp%26#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: load tmp%26#0 from l-stack (no copy) (𝕗) method#0 | tmp%26#0 log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 + log // (𝕗) method#0 | log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 + b main_after_if_else@24 // (𝕗) method#0 | main_else_body@22: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 - byte "get_data_with_default" // (𝕗) method#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_contract.py:40 - == // (𝕗) method#0 | {==} method == b"get_data_with_default": local_state/local_state_contract.py:40 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) method#0 | tmp%24#0 elif method == b"get_data_with_default": local_state/local_state_contract.py:40 - bz main_else_body@24 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 - // Implicit fall through to main_if_body@23 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 - -main_if_body@23: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:41 - // virtual: store tmp%25#0 to l-stack (no copy) (𝕗) method#0 | tmp%25#0 Txn.sender local_state/local_state_contract.py:41 - txna ApplicationArgs 1 // (𝕗) method#0 | tmp%25#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:41 - // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%26#0 Txn.application_args(1) local_state/local_state_contract.py:41 - // virtual: load tmp%25#0 from l-stack (no copy) (𝕗) method#0 | tmp%26#0,tmp%25#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: load tmp%26#0 from l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%26#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - callsub get_data_with_default // (𝕗) method#0 | {get_data_with_default} self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: store tmp%27#0 to l-stack (no copy) (𝕗) method#0 | tmp%27#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕗) method#0 | tmp%27#0 log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 - log // (𝕗) method#0 | log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 - b main_after_if_else@26 // (𝕗) method#0 | - -main_else_body@24: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:43 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:43 - -main_after_if_else@26: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:44 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:44 - -main_else_body@27: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:46 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:46 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:43 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:43 + +main_after_if_else@24: + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:44 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:44 + +main_else_body@25: + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:46 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:46 // examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: get_guaranteed_data: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:51-52 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:51-52 get_guaranteed_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_contract.py:53 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_contract.py:53 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_contract.py:53 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 - assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 - retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_contract.py:53 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_contract.py:53 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_contract.py:53 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 + assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 + retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 // examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: get_data_or_assert: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:59-60 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:59-60 get_data_or_assert_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_contract.py:61 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_contract.py:62 - assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_contract.py:62 - // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_contract.py:63 - retsub // result#0 return result local_state/local_state_contract.py:63 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_contract.py:61 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_contract.py:62 + assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_contract.py:62 + // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_contract.py:63 + retsub // result#0 return result local_state/local_state_contract.py:63 // examples.local_state.local_state_contract.LocalStateContract.delete_data(for_account: bytes) -> void: delete_data: - proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: Account) -> None: local_state/local_state_contract.py:69-70 + proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: Account) -> None: local_state/local_state_contract.py:69-70 delete_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_contract.py:71 - byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:71 - app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_contract.py:71 - retsub // + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_contract.py:71 + byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:71 + app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_contract.py:71 + retsub // // examples.local_state.local_state_contract.LocalStateContract.set_data(for_account: bytes, value: bytes) -> void: set_data: - proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: Account, value: Bytes) -> None: local_state/local_state_contract.py:65-66 + proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: Account, value: Bytes) -> None: local_state/local_state_contract.py:65-66 set_data_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_contract.py:67 - byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:67 - frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_contract.py:67 - app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_contract.py:67 - retsub // + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_contract.py:67 + byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:67 + frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_contract.py:67 + app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_contract.py:67 + retsub // // examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: get_data_with_default: - proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: Account, default: Bytes) -> Bytes: local_state/local_state_contract.py:55-56 + proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: Account, default: Bytes) -> Bytes: local_state/local_state_contract.py:55-56 get_data_with_default_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_contract.py:57 - app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_contract.py:57 - swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 - retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 - - -// examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: -__init__: - proto 0 0 // def __init__(self) -> None: local_state/local_state_contract.py:14 - -__init___block@0: - retsub // + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_contract.py:57 + app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_contract.py:57 + swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 + retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 diff --git a/examples/local_state/out/LocalStateContract.approval.teal b/examples/local_state/out/LocalStateContract.approval.teal index 9e7dd484c3..687ede9dcd 100644 --- a/examples/local_state/out/LocalStateContract.approval.teal +++ b/examples/local_state/out/LocalStateContract.approval.teal @@ -2,21 +2,16 @@ examples.local_state.local_state_contract.LocalStateContract.approval_program: int 0 - txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ - -main_entrypoint@2: // local_state/local_state_contract.py:18 // if Txn.application_id == 0: txn ApplicationID - bnz main_after_if_else@4 + bnz main_after_if_else@2 // local_state/local_state_contract.py:19 // return True int 1 return -main_after_if_else@4: +main_after_if_else@2: // local_state/local_state_contract.py:20 // if Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): txn OnCompletion @@ -26,23 +21,23 @@ main_after_if_else@4: int OptIn == || - bnz main_after_if_else@6 + bnz main_after_if_else@4 // local_state/local_state_contract.py:21 // return False int 0 return -main_after_if_else@6: +main_after_if_else@4: // local_state/local_state_contract.py:22 // if Txn.num_app_args == 0: txn NumAppArgs - bnz main_after_if_else@8 + bnz main_after_if_else@6 // local_state/local_state_contract.py:23 // return False int 0 return -main_after_if_else@8: +main_after_if_else@6: // local_state/local_state_contract.py:25 // method = Txn.application_args(0) txna ApplicationArgs 0 @@ -52,41 +47,41 @@ main_after_if_else@8: txn NumAppArgs int 1 == - bz main_else_body@19 + bz main_else_body@17 // local_state/local_state_contract.py:27 // if method == b"get_guaranteed_data": dup byte "get_guaranteed_data" == - bz main_else_body@11 + bz main_else_body@9 // local_state/local_state_contract.py:28 // log(self.get_guaranteed_data(Txn.sender)) txn Sender callsub get_guaranteed_data log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@11: +main_else_body@9: // local_state/local_state_contract.py:29 // elif method == b"get_data_or_assert": dup byte "get_data_or_assert" == - bz main_else_body@13 + bz main_else_body@11 // local_state/local_state_contract.py:30 // log(self.get_data_or_assert(Txn.sender)) txn Sender callsub get_data_or_assert log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@13: +main_else_body@11: // local_state/local_state_contract.py:31 // elif method == b"delete_data": dup byte "delete_data" == - bz main_else_body@15 + bz main_else_body@13 // local_state/local_state_contract.py:32 // self.delete_data(Txn.sender) txn Sender @@ -95,68 +90,68 @@ main_else_body@13: // log(b"Deleted") byte "Deleted" log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@15: +main_else_body@13: // local_state/local_state_contract.py:35 // return False int 0 return -main_after_if_else@18: +main_after_if_else@16: // local_state/local_state_contract.py:36 // return True int 1 return -main_else_body@19: +main_else_body@17: // local_state/local_state_contract.py:37 // elif Txn.num_app_args == 2: txn NumAppArgs int 2 == - bz main_else_body@27 + bz main_else_body@25 // local_state/local_state_contract.py:38 // if method == b"set_data": dup byte "set_data" == - bz main_else_body@22 + bz main_else_body@20 // local_state/local_state_contract.py:39 // self.set_data(Txn.sender, Txn.application_args(1)) txn Sender txna ApplicationArgs 1 callsub set_data - b main_after_if_else@26 + b main_after_if_else@24 -main_else_body@22: +main_else_body@20: // local_state/local_state_contract.py:40 // elif method == b"get_data_with_default": dup byte "get_data_with_default" == - bz main_else_body@24 + bz main_else_body@22 // local_state/local_state_contract.py:41 // log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) txn Sender txna ApplicationArgs 1 callsub get_data_with_default log - b main_after_if_else@26 + b main_after_if_else@24 -main_else_body@24: +main_else_body@22: // local_state/local_state_contract.py:43 // return False int 0 return -main_after_if_else@26: +main_after_if_else@24: // local_state/local_state_contract.py:44 // return True int 1 return -main_else_body@27: +main_else_body@25: // local_state/local_state_contract.py:46 // return False int 0 @@ -246,11 +241,3 @@ get_data_with_default: uncover 2 select retsub - - -// examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: -__init__: - // local_state/local_state_contract.py:14 - // def __init__(self) -> None: - proto 0 0 - retsub diff --git a/examples/local_state/out/LocalStateContract.destructured.ir b/examples/local_state/out/LocalStateContract.destructured.ir index 70be5a321c..374b9f1523 100644 --- a/examples/local_state/out/LocalStateContract.destructured.ir +++ b/examples/local_state/out/LocalStateContract.destructured.ir @@ -2,88 +2,82 @@ contract examples.local_state.local_state_contract.LocalStateContract: program approval: subroutine examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: block@0: // L17 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L14 - examples.local_state.local_state_contract.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L14 - let tmp%1#0: uint64 = (txn ApplicationID) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L18 + let tmp%0#0: uint64 = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L18 return 1u - block@4: // after_if_else_L18 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L20 + block@2: // after_if_else_L18 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L20 return 0u - block@6: // after_if_else_L20 - let tmp%7#0: uint64 = (txn NumAppArgs) - goto tmp%7#0 ? block@8 : block@7 - block@7: // if_body_L22 + block@4: // after_if_else_L20 + let tmp%6#0: uint64 = (txn NumAppArgs) + goto tmp%6#0 ? block@6 : block@5 + block@5: // if_body_L22 return 0u - block@8: // after_if_else_L22 + block@6: // after_if_else_L22 let method#0: bytes = (txna ApplicationArgs 0) - let tmp%9#0: uint64 = (txn NumAppArgs) - let tmp%10#0: uint64 = (== tmp%9#0 1u) - goto tmp%10#0 ? block@9 : block@19 - block@9: // if_body_L26 - let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%11#0 ? block@10 : block@11 - block@10: // if_body_L27 - let tmp%12#0: bytes = (txn Sender) - let tmp%13#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%12#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L27 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L29 - let tmp%15#0: bytes = (txn Sender) - let tmp%16#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%15#0) - (log tmp%16#0) - goto block@18 - block@13: // else_body_L29 - let tmp%17#0: uint64 = (== method#0 "delete_data") - goto tmp%17#0 ? block@14 : block@15 - block@14: // if_body_L31 - let tmp%18#0: bytes = (txn Sender) - examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%18#0) + let tmp%8#0: uint64 = (txn NumAppArgs) + let tmp%9#0: uint64 = (== tmp%8#0 1u) + goto tmp%9#0 ? block@7 : block@17 + block@7: // if_body_L26 + let tmp%10#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%10#0 ? block@8 : block@9 + block@8: // if_body_L27 + let tmp%11#0: bytes = (txn Sender) + let tmp%12#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%11#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L27 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L29 + let tmp%14#0: bytes = (txn Sender) + let tmp%15#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%14#0) + (log tmp%15#0) + goto block@16 + block@11: // else_body_L29 + let tmp%16#0: uint64 = (== method#0 "delete_data") + goto tmp%16#0 ? block@12 : block@13 + block@12: // if_body_L31 + let tmp%17#0: bytes = (txn Sender) + examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%17#0) (log "Deleted") - goto block@18 - block@15: // else_body_L31 + goto block@16 + block@13: // else_body_L31 return 0u - block@18: // after_if_else_L27 + block@16: // after_if_else_L27 return 1u - block@19: // else_body_L26 - let tmp%19#0: uint64 = (txn NumAppArgs) - let tmp%20#0: uint64 = (== tmp%19#0 2u) - goto tmp%20#0 ? block@20 : block@27 - block@20: // if_body_L37 - let tmp%21#0: uint64 = (== method#0 "set_data") - goto tmp%21#0 ? block@21 : block@22 - block@21: // if_body_L38 - let tmp%22#0: bytes = (txn Sender) - let tmp%23#0: bytes = (txna ApplicationArgs 1) - examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%22#0, tmp%23#0) - goto block@26 - block@22: // else_body_L38 - let tmp%24#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%24#0 ? block@23 : block@24 - block@23: // if_body_L40 - let tmp%25#0: bytes = (txn Sender) - let tmp%26#0: bytes = (txna ApplicationArgs 1) - let tmp%27#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%25#0, tmp%26#0) - (log tmp%27#0) - goto block@26 - block@24: // else_body_L40 + block@17: // else_body_L26 + let tmp%18#0: uint64 = (txn NumAppArgs) + let tmp%19#0: uint64 = (== tmp%18#0 2u) + goto tmp%19#0 ? block@18 : block@25 + block@18: // if_body_L37 + let tmp%20#0: uint64 = (== method#0 "set_data") + goto tmp%20#0 ? block@19 : block@20 + block@19: // if_body_L38 + let tmp%21#0: bytes = (txn Sender) + let tmp%22#0: bytes = (txna ApplicationArgs 1) + examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%21#0, tmp%22#0) + goto block@24 + block@20: // else_body_L38 + let tmp%23#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%23#0 ? block@21 : block@22 + block@21: // if_body_L40 + let tmp%24#0: bytes = (txn Sender) + let tmp%25#0: bytes = (txna ApplicationArgs 1) + let tmp%26#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%24#0, tmp%25#0) + (log tmp%26#0) + goto block@24 + block@22: // else_body_L40 return 0u - block@26: // after_if_else_L38 + block@24: // after_if_else_L38 return 1u - block@27: // else_body_L37 + block@25: // else_body_L37 return 0u subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: @@ -113,10 +107,6 @@ contract examples.local_state.local_state_contract.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: - block@0: // L14 - return program clear-state: subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out/LocalStateContract.ssa.ir b/examples/local_state/out/LocalStateContract.ssa.ir index abd4d2126f..40b3106205 100644 --- a/examples/local_state/out/LocalStateContract.ssa.ir +++ b/examples/local_state/out/LocalStateContract.ssa.ir @@ -2,96 +2,90 @@ contract examples.local_state.local_state_contract.LocalStateContract: program approval: subroutine examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: block@0: // L17 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L14 - examples.local_state.local_state_contract.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L14 - let tmp%1#0: uint64 = (txn ApplicationID) - let tmp%2#0: uint64 = (== tmp%1#0 0u) - goto tmp%2#0 ? block@3 : block@4 - block@3: // if_body_L18 + let tmp%0#0: uint64 = (txn ApplicationID) + let tmp%1#0: uint64 = (== tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@2 + block@1: // if_body_L18 return 1u - block@4: // after_if_else_L18 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (== tmp%3#0 NoOp) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L20 + block@2: // after_if_else_L18 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (== tmp%2#0 NoOp) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L20 return 0u - block@6: // after_if_else_L20 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (== tmp%7#0 0u) - goto tmp%8#0 ? block@7 : block@8 - block@7: // if_body_L22 + block@4: // after_if_else_L20 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (== tmp%6#0 0u) + goto tmp%7#0 ? block@5 : block@6 + block@5: // if_body_L22 return 0u - block@8: // after_if_else_L22 + block@6: // after_if_else_L22 let method#0: bytes = (txna ApplicationArgs 0) - let tmp%9#0: uint64 = (txn NumAppArgs) - let tmp%10#0: uint64 = (== tmp%9#0 1u) - goto tmp%10#0 ? block@9 : block@19 - block@9: // if_body_L26 - let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%11#0 ? block@10 : block@11 - block@10: // if_body_L27 - let tmp%12#0: bytes = (txn Sender) - let tmp%13#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%12#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L27 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L29 - let tmp%15#0: bytes = (txn Sender) - let tmp%16#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%15#0) - (log tmp%16#0) - goto block@17 - block@13: // else_body_L29 - let tmp%17#0: uint64 = (== method#0 "delete_data") - goto tmp%17#0 ? block@14 : block@15 - block@14: // if_body_L31 - let tmp%18#0: bytes = (txn Sender) - examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%18#0) - (log "Deleted") + let tmp%8#0: uint64 = (txn NumAppArgs) + let tmp%9#0: uint64 = (== tmp%8#0 1u) + goto tmp%9#0 ? block@7 : block@17 + block@7: // if_body_L26 + let tmp%10#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%10#0 ? block@8 : block@9 + block@8: // if_body_L27 + let tmp%11#0: bytes = (txn Sender) + let tmp%12#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%11#0) + (log tmp%12#0) goto block@16 - block@15: // else_body_L31 + block@9: // else_body_L27 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L29 + let tmp%14#0: bytes = (txn Sender) + let tmp%15#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%14#0) + (log tmp%15#0) + goto block@15 + block@11: // else_body_L29 + let tmp%16#0: uint64 = (== method#0 "delete_data") + goto tmp%16#0 ? block@12 : block@13 + block@12: // if_body_L31 + let tmp%17#0: bytes = (txn Sender) + examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%17#0) + (log "Deleted") + goto block@14 + block@13: // else_body_L31 return 0u - block@16: // after_if_else_L31 - goto block@17 - block@17: // after_if_else_L29 - goto block@18 - block@18: // after_if_else_L27 + block@14: // after_if_else_L31 + goto block@15 + block@15: // after_if_else_L29 + goto block@16 + block@16: // after_if_else_L27 return 1u - block@19: // else_body_L26 - let tmp%19#0: uint64 = (txn NumAppArgs) - let tmp%20#0: uint64 = (== tmp%19#0 2u) - goto tmp%20#0 ? block@20 : block@27 - block@20: // if_body_L37 - let tmp%21#0: uint64 = (== method#0 "set_data") - goto tmp%21#0 ? block@21 : block@22 - block@21: // if_body_L38 - let tmp%22#0: bytes = (txn Sender) - let tmp%23#0: bytes = (txna ApplicationArgs 1) - examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%22#0, tmp%23#0) - goto block@26 - block@22: // else_body_L38 - let tmp%24#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%24#0 ? block@23 : block@24 - block@23: // if_body_L40 - let tmp%25#0: bytes = (txn Sender) - let tmp%26#0: bytes = (txna ApplicationArgs 1) - let tmp%27#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%25#0, tmp%26#0) - (log tmp%27#0) - goto block@25 - block@24: // else_body_L40 + block@17: // else_body_L26 + let tmp%18#0: uint64 = (txn NumAppArgs) + let tmp%19#0: uint64 = (== tmp%18#0 2u) + goto tmp%19#0 ? block@18 : block@25 + block@18: // if_body_L37 + let tmp%20#0: uint64 = (== method#0 "set_data") + goto tmp%20#0 ? block@19 : block@20 + block@19: // if_body_L38 + let tmp%21#0: bytes = (txn Sender) + let tmp%22#0: bytes = (txna ApplicationArgs 1) + examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%21#0, tmp%22#0) + goto block@24 + block@20: // else_body_L38 + let tmp%23#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%23#0 ? block@21 : block@22 + block@21: // if_body_L40 + let tmp%24#0: bytes = (txn Sender) + let tmp%25#0: bytes = (txna ApplicationArgs 1) + let tmp%26#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%24#0, tmp%25#0) + (log tmp%26#0) + goto block@23 + block@22: // else_body_L40 return 0u - block@25: // after_if_else_L40 - goto block@26 - block@26: // after_if_else_L38 + block@23: // after_if_else_L40 + goto block@24 + block@24: // after_if_else_L38 return 1u - block@27: // else_body_L37 + block@25: // else_body_L37 return 0u subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: @@ -123,10 +117,6 @@ contract examples.local_state.local_state_contract.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: - block@0: // L14 - return program clear-state: subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir b/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir index 63cb2e541f..9faf0b5357 100644 --- a/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir +++ b/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir @@ -2,90 +2,84 @@ contract examples.local_state.local_state_contract.LocalStateContract: program approval: subroutine examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: block@0: // L17 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L14 - examples.local_state.local_state_contract.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L14 - let tmp%1#0: uint64 = (txn ApplicationID) - let tmp%2#0: uint64 = (! tmp%1#0) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L18 + let tmp%0#0: uint64 = (txn ApplicationID) + let tmp%1#0: uint64 = (! tmp%0#0) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L18 return 1u - block@4: // after_if_else_L18 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L20 + block@2: // after_if_else_L18 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L20 return 0u - block@6: // after_if_else_L20 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (! tmp%7#0) - goto tmp%7#0 ? block@8 : block@7 - block@7: // if_body_L22 + block@4: // after_if_else_L20 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (! tmp%6#0) + goto tmp%6#0 ? block@6 : block@5 + block@5: // if_body_L22 return 0u - block@8: // after_if_else_L22 + block@6: // after_if_else_L22 let method#0: bytes = (txna ApplicationArgs 0) - let tmp%9#0: uint64 = (txn NumAppArgs) - let tmp%10#0: uint64 = (== tmp%9#0 1u) - goto tmp%10#0 ? block@9 : block@19 - block@9: // if_body_L26 - let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%11#0 ? block@10 : block@11 - block@10: // if_body_L27 - let tmp%12#0: bytes = (txn Sender) - let tmp%13#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%12#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L27 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L29 - let tmp%15#0: bytes = (txn Sender) - let tmp%16#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%15#0) - (log tmp%16#0) - goto block@18 - block@13: // else_body_L29 - let tmp%17#0: uint64 = (== method#0 "delete_data") - goto tmp%17#0 ? block@14 : block@15 - block@14: // if_body_L31 - let tmp%18#0: bytes = (txn Sender) - examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%18#0) + let tmp%8#0: uint64 = (txn NumAppArgs) + let tmp%9#0: uint64 = (== tmp%8#0 1u) + goto tmp%9#0 ? block@7 : block@17 + block@7: // if_body_L26 + let tmp%10#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%10#0 ? block@8 : block@9 + block@8: // if_body_L27 + let tmp%11#0: bytes = (txn Sender) + let tmp%12#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%11#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L27 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L29 + let tmp%14#0: bytes = (txn Sender) + let tmp%15#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%14#0) + (log tmp%15#0) + goto block@16 + block@11: // else_body_L29 + let tmp%16#0: uint64 = (== method#0 "delete_data") + goto tmp%16#0 ? block@12 : block@13 + block@12: // if_body_L31 + let tmp%17#0: bytes = (txn Sender) + examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%17#0) (log "Deleted") - goto block@18 - block@15: // else_body_L31 + goto block@16 + block@13: // else_body_L31 return 0u - block@18: // after_if_else_L27 + block@16: // after_if_else_L27 return 1u - block@19: // else_body_L26 - let tmp%19#0: uint64 = (txn NumAppArgs) - let tmp%20#0: uint64 = (== tmp%19#0 2u) - goto tmp%20#0 ? block@20 : block@27 - block@20: // if_body_L37 - let tmp%21#0: uint64 = (== method#0 "set_data") - goto tmp%21#0 ? block@21 : block@22 - block@21: // if_body_L38 - let tmp%22#0: bytes = (txn Sender) - let tmp%23#0: bytes = (txna ApplicationArgs 1) - examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%22#0, tmp%23#0) - goto block@26 - block@22: // else_body_L38 - let tmp%24#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%24#0 ? block@23 : block@24 - block@23: // if_body_L40 - let tmp%25#0: bytes = (txn Sender) - let tmp%26#0: bytes = (txna ApplicationArgs 1) - let tmp%27#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%25#0, tmp%26#0) - (log tmp%27#0) - goto block@26 - block@24: // else_body_L40 + block@17: // else_body_L26 + let tmp%18#0: uint64 = (txn NumAppArgs) + let tmp%19#0: uint64 = (== tmp%18#0 2u) + goto tmp%19#0 ? block@18 : block@25 + block@18: // if_body_L37 + let tmp%20#0: uint64 = (== method#0 "set_data") + goto tmp%20#0 ? block@19 : block@20 + block@19: // if_body_L38 + let tmp%21#0: bytes = (txn Sender) + let tmp%22#0: bytes = (txna ApplicationArgs 1) + examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%21#0, tmp%22#0) + goto block@24 + block@20: // else_body_L38 + let tmp%23#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%23#0 ? block@21 : block@22 + block@21: // if_body_L40 + let tmp%24#0: bytes = (txn Sender) + let tmp%25#0: bytes = (txna ApplicationArgs 1) + let tmp%26#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%24#0, tmp%25#0) + (log tmp%26#0) + goto block@24 + block@22: // else_body_L40 return 0u - block@26: // after_if_else_L38 + block@24: // after_if_else_L38 return 1u - block@27: // else_body_L37 + block@25: // else_body_L37 return 0u subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: @@ -115,10 +109,6 @@ contract examples.local_state.local_state_contract.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: - block@0: // L14 - return program clear-state: subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir b/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir index 70be5a321c..374b9f1523 100644 --- a/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir +++ b/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir @@ -2,88 +2,82 @@ contract examples.local_state.local_state_contract.LocalStateContract: program approval: subroutine examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: block@0: // L17 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L14 - examples.local_state.local_state_contract.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L14 - let tmp%1#0: uint64 = (txn ApplicationID) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L18 + let tmp%0#0: uint64 = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L18 return 1u - block@4: // after_if_else_L18 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L20 + block@2: // after_if_else_L18 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L20 return 0u - block@6: // after_if_else_L20 - let tmp%7#0: uint64 = (txn NumAppArgs) - goto tmp%7#0 ? block@8 : block@7 - block@7: // if_body_L22 + block@4: // after_if_else_L20 + let tmp%6#0: uint64 = (txn NumAppArgs) + goto tmp%6#0 ? block@6 : block@5 + block@5: // if_body_L22 return 0u - block@8: // after_if_else_L22 + block@6: // after_if_else_L22 let method#0: bytes = (txna ApplicationArgs 0) - let tmp%9#0: uint64 = (txn NumAppArgs) - let tmp%10#0: uint64 = (== tmp%9#0 1u) - goto tmp%10#0 ? block@9 : block@19 - block@9: // if_body_L26 - let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%11#0 ? block@10 : block@11 - block@10: // if_body_L27 - let tmp%12#0: bytes = (txn Sender) - let tmp%13#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%12#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L27 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L29 - let tmp%15#0: bytes = (txn Sender) - let tmp%16#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%15#0) - (log tmp%16#0) - goto block@18 - block@13: // else_body_L29 - let tmp%17#0: uint64 = (== method#0 "delete_data") - goto tmp%17#0 ? block@14 : block@15 - block@14: // if_body_L31 - let tmp%18#0: bytes = (txn Sender) - examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%18#0) + let tmp%8#0: uint64 = (txn NumAppArgs) + let tmp%9#0: uint64 = (== tmp%8#0 1u) + goto tmp%9#0 ? block@7 : block@17 + block@7: // if_body_L26 + let tmp%10#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%10#0 ? block@8 : block@9 + block@8: // if_body_L27 + let tmp%11#0: bytes = (txn Sender) + let tmp%12#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%11#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L27 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L29 + let tmp%14#0: bytes = (txn Sender) + let tmp%15#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%14#0) + (log tmp%15#0) + goto block@16 + block@11: // else_body_L29 + let tmp%16#0: uint64 = (== method#0 "delete_data") + goto tmp%16#0 ? block@12 : block@13 + block@12: // if_body_L31 + let tmp%17#0: bytes = (txn Sender) + examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%17#0) (log "Deleted") - goto block@18 - block@15: // else_body_L31 + goto block@16 + block@13: // else_body_L31 return 0u - block@18: // after_if_else_L27 + block@16: // after_if_else_L27 return 1u - block@19: // else_body_L26 - let tmp%19#0: uint64 = (txn NumAppArgs) - let tmp%20#0: uint64 = (== tmp%19#0 2u) - goto tmp%20#0 ? block@20 : block@27 - block@20: // if_body_L37 - let tmp%21#0: uint64 = (== method#0 "set_data") - goto tmp%21#0 ? block@21 : block@22 - block@21: // if_body_L38 - let tmp%22#0: bytes = (txn Sender) - let tmp%23#0: bytes = (txna ApplicationArgs 1) - examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%22#0, tmp%23#0) - goto block@26 - block@22: // else_body_L38 - let tmp%24#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%24#0 ? block@23 : block@24 - block@23: // if_body_L40 - let tmp%25#0: bytes = (txn Sender) - let tmp%26#0: bytes = (txna ApplicationArgs 1) - let tmp%27#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%25#0, tmp%26#0) - (log tmp%27#0) - goto block@26 - block@24: // else_body_L40 + block@17: // else_body_L26 + let tmp%18#0: uint64 = (txn NumAppArgs) + let tmp%19#0: uint64 = (== tmp%18#0 2u) + goto tmp%19#0 ? block@18 : block@25 + block@18: // if_body_L37 + let tmp%20#0: uint64 = (== method#0 "set_data") + goto tmp%20#0 ? block@19 : block@20 + block@19: // if_body_L38 + let tmp%21#0: bytes = (txn Sender) + let tmp%22#0: bytes = (txna ApplicationArgs 1) + examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%21#0, tmp%22#0) + goto block@24 + block@20: // else_body_L38 + let tmp%23#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%23#0 ? block@21 : block@22 + block@21: // if_body_L40 + let tmp%24#0: bytes = (txn Sender) + let tmp%25#0: bytes = (txna ApplicationArgs 1) + let tmp%26#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%24#0, tmp%25#0) + (log tmp%26#0) + goto block@24 + block@22: // else_body_L40 return 0u - block@26: // after_if_else_L38 + block@24: // after_if_else_L38 return 1u - block@27: // else_body_L37 + block@25: // else_body_L37 return 0u subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: @@ -113,10 +107,6 @@ contract examples.local_state.local_state_contract.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: - block@0: // L14 - return program clear-state: subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out/LocalStateWithOffsets.approval.mir b/examples/local_state/out/LocalStateWithOffsets.approval.mir index 7ee40c44b0..0d56ade568 100644 --- a/examples/local_state/out/LocalStateWithOffsets.approval.mir +++ b/examples/local_state/out/LocalStateWithOffsets.approval.mir @@ -1,289 +1,270 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: main: int 0 - byte "" // allocate 2 to stack (𝕗) method#0,offset#0 | + byte "" // allocate 2 to stack (𝕗) method#0,offset#0 | main_block@0: - txn ApplicationID // (𝕗) method#0,offset#0 | {txn} - // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) method#0,offset#0 | app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) method#0,offset#0 | app_id%0#0 - bnz main_entrypoint@2 // (𝕗) method#0,offset#0 | - // Implicit fall through to main_on_create@1 // (𝕗) method#0,offset#0 | - -main_on_create@1: - callsub __init__ // (𝕗) method#0,offset#0 | - // Implicit fall through to main_entrypoint@2 // (𝕗) method#0,offset#0 | - -main_entrypoint@2: - txn ApplicationID // (𝕗) method#0,offset#0 | {txn} Txn.application_id local_state/local_state_with_offsets.py:19 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%1#0 Txn.application_id local_state/local_state_with_offsets.py:19 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%1#0 if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 - bnz main_after_if_else@4 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 - // Implicit fall through to main_if_body@3 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + txn ApplicationID // (𝕗) method#0,offset#0 | {txn} Txn.application_id local_state/local_state_with_offsets.py:19 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%0#0 Txn.application_id local_state/local_state_with_offsets.py:19 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%0#0 if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + bnz main_after_if_else@2 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + // Implicit fall through to main_if_body@1 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + +main_if_body@1: + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:20 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:20 + +main_after_if_else@2: + txn OnCompletion // (𝕗) method#0,offset#0 | {txn} Txn.on_completion local_state/local_state_with_offsets.py:21 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%2#0 Txn.on_completion local_state/local_state_with_offsets.py:21 + dup // load tmp%2#0 from l-stack (copy) (𝕗) method#0,offset#0 | tmp%2#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + ! // (𝕗) method#0,offset#0 | tmp%2#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + swap // store contains%3#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + int OptIn // (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0,OptIn OnCompleteAction.OptIn local_state/local_state_with_offsets.py:21 + == // (𝕗) method#0,offset#0 | contains%3#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: store is_equal%4#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load contains%3#0 from l-stack (no copy) (𝕗) method#0,offset#0 | is_equal%4#0,contains%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + || // (𝕗) method#0,offset#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + bnz main_after_if_else@4 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // Implicit fall through to main_if_body@3 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 main_if_body@3: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:20 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:20 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:22 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:22 main_after_if_else@4: - txn OnCompletion // (𝕗) method#0,offset#0 | {txn} Txn.on_completion local_state/local_state_with_offsets.py:21 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%3#0 Txn.on_completion local_state/local_state_with_offsets.py:21 - dup // load tmp%3#0 from l-stack (copy) (𝕗) method#0,offset#0 | tmp%3#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - ! // (𝕗) method#0,offset#0 | tmp%3#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - swap // store contains%4#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - int OptIn // (𝕗) method#0,offset#0 | contains%4#0,tmp%3#0,OptIn OnCompleteAction.OptIn local_state/local_state_with_offsets.py:21 - == // (𝕗) method#0,offset#0 | contains%4#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: store is_equal%5#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load contains%4#0 from l-stack (no copy) (𝕗) method#0,offset#0 | is_equal%5#0,contains%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load is_equal%5#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%4#0,is_equal%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - || // (𝕗) method#0,offset#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - bnz main_after_if_else@6 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // Implicit fall through to main_if_body@5 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:23 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.num_app_args local_state/local_state_with_offsets.py:23 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + int 1 // (𝕗) method#0,offset#0 | tmp%6#0,1 1 local_state/local_state_with_offsets.py:23 + < // (𝕗) method#0,offset#0 | {<} Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + bz main_after_if_else@6 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // Implicit fall through to main_if_body@5 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 main_if_body@5: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:22 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:22 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:24 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:24 main_after_if_else@6: - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:23 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args local_state/local_state_with_offsets.py:23 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - int 1 // (𝕗) method#0,offset#0 | tmp%7#0,1 1 local_state/local_state_with_offsets.py:23 - < // (𝕗) method#0,offset#0 | {<} Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - bz main_after_if_else@8 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // Implicit fall through to main_if_body@7 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + txna ApplicationArgs 0 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(0) local_state/local_state_with_offsets.py:26 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 Txn.application_args(0) local_state/local_state_with_offsets.py:26 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + btoi // (𝕗) method#0,offset#0 | {btoi} op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + bury 1 // store offset#0 to f-stack (𝕗) method#0,offset#0 | offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + txna ApplicationArgs 1 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(1) local_state/local_state_with_offsets.py:27 + bury 2 // store method#0 to f-stack (𝕗) method#0,offset#0 | method = Txn.application_args(1) local_state/local_state_with_offsets.py:27 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:28 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.num_app_args local_state/local_state_with_offsets.py:28 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + int 2 // (𝕗) method#0,offset#0 | tmp%9#0,2 2 local_state/local_state_with_offsets.py:28 + == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + bz main_else_body@17 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // Implicit fall through to main_if_body@7 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 main_if_body@7: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:24 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:24 - -main_after_if_else@8: - txna ApplicationArgs 0 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(0) local_state/local_state_with_offsets.py:26 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.application_args(0) local_state/local_state_with_offsets.py:26 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - btoi // (𝕗) method#0,offset#0 | {btoi} op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - bury 1 // store offset#0 to f-stack (𝕗) method#0,offset#0 | offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - txna ApplicationArgs 1 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(1) local_state/local_state_with_offsets.py:27 - bury 2 // store method#0 to f-stack (𝕗) method#0,offset#0 | method = Txn.application_args(1) local_state/local_state_with_offsets.py:27 - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:28 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args local_state/local_state_with_offsets.py:28 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - int 2 // (𝕗) method#0,offset#0 | tmp%10#0,2 2 local_state/local_state_with_offsets.py:28 - == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - bz main_else_body@19 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // Implicit fall through to main_if_body@9 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - -main_if_body@9: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - byte "get_guaranteed_data" // (𝕗) method#0,offset#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_with_offsets.py:29 - == // (𝕗) method#0,offset#0 | {==} method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - bz main_else_body@11 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // Implicit fall through to main_if_body@10 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + byte "get_guaranteed_data" // (𝕗) method#0,offset#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_with_offsets.py:29 + == // (𝕗) method#0,offset#0 | {==} method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + bz main_else_body@9 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // Implicit fall through to main_if_body@8 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + +main_if_body@8: + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + callsub get_guaranteed_data // (𝕗) method#0,offset#0 | {get_guaranteed_data} self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 + log // (𝕗) method#0,offset#0 | log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 + b main_after_if_else@16 // (𝕗) method#0,offset#0 | + +main_else_body@9: + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + byte "get_data_or_assert" // (𝕗) method#0,offset#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_with_offsets.py:31 + == // (𝕗) method#0,offset#0 | {==} method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + bz main_else_body@11 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // Implicit fall through to main_if_body@10 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 main_if_body@10: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - callsub get_guaranteed_data // (𝕗) method#0,offset#0 | {get_guaranteed_data} self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 - log // (𝕗) method#0,offset#0 | log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 - b main_after_if_else@18 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + callsub get_data_or_assert // (𝕗) method#0,offset#0 | {get_data_or_assert} self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 + log // (𝕗) method#0,offset#0 | log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 + b main_after_if_else@16 // (𝕗) method#0,offset#0 | main_else_body@11: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - byte "get_data_or_assert" // (𝕗) method#0,offset#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_with_offsets.py:31 - == // (𝕗) method#0,offset#0 | {==} method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - bz main_else_body@13 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // Implicit fall through to main_if_body@12 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 + byte "delete_data" // (𝕗) method#0,offset#0 | method#0,"delete_data" b"delete_data" local_state/local_state_with_offsets.py:33 + == // (𝕗) method#0,offset#0 | {==} method == b"delete_data": local_state/local_state_with_offsets.py:33 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + bz main_else_body@13 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + // Implicit fall through to main_if_body@12 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 main_if_body@12: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - callsub get_data_or_assert // (𝕗) method#0,offset#0 | {get_data_or_assert} self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 - log // (𝕗) method#0,offset#0 | log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 - b main_after_if_else@18 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.delete_data(offset) local_state/local_state_with_offsets.py:34 + callsub delete_data // (𝕗) method#0,offset#0 | self.delete_data(offset) local_state/local_state_with_offsets.py:34 + byte "Deleted" // (𝕗) method#0,offset#0 | "Deleted" b"Deleted" local_state/local_state_with_offsets.py:35 + log // (𝕗) method#0,offset#0 | log(b"Deleted") local_state/local_state_with_offsets.py:35 + b main_after_if_else@16 // (𝕗) method#0,offset#0 | main_else_body@13: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 - byte "delete_data" // (𝕗) method#0,offset#0 | method#0,"delete_data" b"delete_data" local_state/local_state_with_offsets.py:33 - == // (𝕗) method#0,offset#0 | {==} method == b"delete_data": local_state/local_state_with_offsets.py:33 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 elif method == b"delete_data": local_state/local_state_with_offsets.py:33 - bz main_else_body@15 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 - // Implicit fall through to main_if_body@14 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 - -main_if_body@14: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.delete_data(offset) local_state/local_state_with_offsets.py:34 - callsub delete_data // (𝕗) method#0,offset#0 | self.delete_data(offset) local_state/local_state_with_offsets.py:34 - byte "Deleted" // (𝕗) method#0,offset#0 | "Deleted" b"Deleted" local_state/local_state_with_offsets.py:35 - log // (𝕗) method#0,offset#0 | log(b"Deleted") local_state/local_state_with_offsets.py:35 - b main_after_if_else@18 // (𝕗) method#0,offset#0 | - -main_else_body@15: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:37 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:37 - -main_after_if_else@18: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:38 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:38 - -main_else_body@19: - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:39 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args local_state/local_state_with_offsets.py:39 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - int 3 // (𝕗) method#0,offset#0 | tmp%17#0,3 3 local_state/local_state_with_offsets.py:39 - == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - bz main_else_body@27 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // Implicit fall through to main_if_body@20 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - -main_if_body@20: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"set_data": local_state/local_state_with_offsets.py:40 - byte "set_data" // (𝕗) method#0,offset#0 | method#0,"set_data" b"set_data" local_state/local_state_with_offsets.py:40 - == // (𝕗) method#0,offset#0 | {==} method == b"set_data": local_state/local_state_with_offsets.py:40 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 method == b"set_data": local_state/local_state_with_offsets.py:40 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 if method == b"set_data": local_state/local_state_with_offsets.py:40 - bz main_else_body@22 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 - // Implicit fall through to main_if_body@21 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:37 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:37 + +main_after_if_else@16: + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:38 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:38 + +main_else_body@17: + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:39 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 Txn.num_app_args local_state/local_state_with_offsets.py:39 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + int 3 // (𝕗) method#0,offset#0 | tmp%16#0,3 3 local_state/local_state_with_offsets.py:39 + == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + bz main_else_body@25 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // Implicit fall through to main_if_body@18 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + +main_if_body@18: + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"set_data": local_state/local_state_with_offsets.py:40 + byte "set_data" // (𝕗) method#0,offset#0 | method#0,"set_data" b"set_data" local_state/local_state_with_offsets.py:40 + == // (𝕗) method#0,offset#0 | {==} method == b"set_data": local_state/local_state_with_offsets.py:40 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 method == b"set_data": local_state/local_state_with_offsets.py:40 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 if method == b"set_data": local_state/local_state_with_offsets.py:40 + bz main_else_body@20 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 + // Implicit fall through to main_if_body@19 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 + +main_if_body@19: + txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:41 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 Txn.application_args(2) local_state/local_state_with_offsets.py:41 + dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%19#0,offset#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + swap // load tmp%19#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%19#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + callsub set_data // (𝕗) method#0,offset#0 | self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + b main_after_if_else@24 // (𝕗) method#0,offset#0 | + +main_else_body@20: + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + byte "get_data_with_default" // (𝕗) method#0,offset#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_with_offsets.py:42 + == // (𝕗) method#0,offset#0 | {==} method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + bz main_else_body@22 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // Implicit fall through to main_if_body@21 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 main_if_body@21: - txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:41 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 Txn.application_args(2) local_state/local_state_with_offsets.py:41 - dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%20#0,offset#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - swap // load tmp%20#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%20#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - callsub set_data // (𝕗) method#0,offset#0 | self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - b main_after_if_else@26 // (𝕗) method#0,offset#0 | + txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:43 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 Txn.application_args(2) local_state/local_state_with_offsets.py:43 + dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%21#0,offset#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + swap // load tmp%21#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%21#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + callsub get_data_with_default // (𝕗) method#0,offset#0 | {get_data_with_default} self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 + log // (𝕗) method#0,offset#0 | log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 + b main_after_if_else@24 // (𝕗) method#0,offset#0 | main_else_body@22: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - byte "get_data_with_default" // (𝕗) method#0,offset#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_with_offsets.py:42 - == // (𝕗) method#0,offset#0 | {==} method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - bz main_else_body@24 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // Implicit fall through to main_if_body@23 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - -main_if_body@23: - txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:43 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 Txn.application_args(2) local_state/local_state_with_offsets.py:43 - dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%22#0,offset#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - swap // load tmp%22#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%22#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - callsub get_data_with_default // (𝕗) method#0,offset#0 | {get_data_with_default} self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%23#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%23#0 log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 - log // (𝕗) method#0,offset#0 | log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 - b main_after_if_else@26 // (𝕗) method#0,offset#0 | - -main_else_body@24: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:45 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:45 - -main_after_if_else@26: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:46 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:46 - -main_else_body@27: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:48 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:48 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:45 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:45 + +main_after_if_else@24: + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:46 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:46 + +main_else_body@25: + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:48 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:48 // examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: get_guaranteed_data: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:53-54 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:53-54 get_guaranteed_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_with_offsets.py:55 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_with_offsets.py:55 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 - retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_with_offsets.py:55 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_with_offsets.py:55 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 + retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 // examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: get_data_or_assert: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:61-62 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:61-62 get_data_or_assert_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 - assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 - // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_with_offsets.py:65 - retsub // result#0 return result local_state/local_state_with_offsets.py:65 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 + assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 + // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_with_offsets.py:65 + retsub // result#0 return result local_state/local_state_with_offsets.py:65 // examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(for_account: uint64) -> void: delete_data: - proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: UInt64) -> None: local_state/local_state_with_offsets.py:71-72 + proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: UInt64) -> None: local_state/local_state_with_offsets.py:71-72 delete_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_with_offsets.py:73 - byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:73 - app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_with_offsets.py:73 - retsub // + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_with_offsets.py:73 + byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:73 + app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_with_offsets.py:73 + retsub // // examples.local_state.local_state_with_offsets.LocalStateContract.set_data(for_account: uint64, value: bytes) -> void: set_data: - proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: UInt64, value: Bytes) -> None: local_state/local_state_with_offsets.py:67-68 + proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: UInt64, value: Bytes) -> None: local_state/local_state_with_offsets.py:67-68 set_data_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 - byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:69 - frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 - app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_with_offsets.py:69 - retsub // + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 + byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:69 + frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 + app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_with_offsets.py:69 + retsub // // examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: get_data_with_default: - proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: UInt64, default: Bytes) -> Bytes: local_state/local_state_with_offsets.py:57-58 + proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: UInt64, default: Bytes) -> Bytes: local_state/local_state_with_offsets.py:57-58 get_data_with_default_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - - -// examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: -__init__: - proto 0 0 // def __init__(self) -> None: local_state/local_state_with_offsets.py:15 - -__init___block@0: - retsub // + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 diff --git a/examples/local_state/out/LocalStateWithOffsets.approval.teal b/examples/local_state/out/LocalStateWithOffsets.approval.teal index b123042853..468f39b44d 100644 --- a/examples/local_state/out/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out/LocalStateWithOffsets.approval.teal @@ -3,21 +3,16 @@ examples.local_state.local_state_with_offsets.LocalStateContract.approval_program: int 0 byte "" - txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ - -main_entrypoint@2: // local_state/local_state_with_offsets.py:19 // if Txn.application_id == 0: txn ApplicationID - bnz main_after_if_else@4 + bnz main_after_if_else@2 // local_state/local_state_with_offsets.py:20 // return True int 1 return -main_after_if_else@4: +main_after_if_else@2: // local_state/local_state_with_offsets.py:21 // if Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): txn OnCompletion @@ -27,25 +22,25 @@ main_after_if_else@4: int OptIn == || - bnz main_after_if_else@6 + bnz main_after_if_else@4 // local_state/local_state_with_offsets.py:22 // return False int 0 return -main_after_if_else@6: +main_after_if_else@4: // local_state/local_state_with_offsets.py:23 // if Txn.num_app_args < 1: txn NumAppArgs int 1 < - bz main_after_if_else@8 + bz main_after_if_else@6 // local_state/local_state_with_offsets.py:24 // return False int 0 return -main_after_if_else@8: +main_after_if_else@6: // local_state/local_state_with_offsets.py:26 // offset = op.btoi(Txn.application_args(0)) txna ApplicationArgs 0 @@ -60,41 +55,41 @@ main_after_if_else@8: txn NumAppArgs int 2 == - bz main_else_body@19 + bz main_else_body@17 // local_state/local_state_with_offsets.py:29 // if method == b"get_guaranteed_data": dig 1 byte "get_guaranteed_data" == - bz main_else_body@11 + bz main_else_body@9 // local_state/local_state_with_offsets.py:30 // log(self.get_guaranteed_data(offset)) dup callsub get_guaranteed_data log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@11: +main_else_body@9: // local_state/local_state_with_offsets.py:31 // elif method == b"get_data_or_assert": dig 1 byte "get_data_or_assert" == - bz main_else_body@13 + bz main_else_body@11 // local_state/local_state_with_offsets.py:32 // log(self.get_data_or_assert(offset)) dup callsub get_data_or_assert log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@13: +main_else_body@11: // local_state/local_state_with_offsets.py:33 // elif method == b"delete_data": dig 1 byte "delete_data" == - bz main_else_body@15 + bz main_else_body@13 // local_state/local_state_with_offsets.py:34 // self.delete_data(offset) dup @@ -103,68 +98,68 @@ main_else_body@13: // log(b"Deleted") byte "Deleted" log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@15: +main_else_body@13: // local_state/local_state_with_offsets.py:37 // return False int 0 return -main_after_if_else@18: +main_after_if_else@16: // local_state/local_state_with_offsets.py:38 // return True int 1 return -main_else_body@19: +main_else_body@17: // local_state/local_state_with_offsets.py:39 // elif Txn.num_app_args == 3: txn NumAppArgs int 3 == - bz main_else_body@27 + bz main_else_body@25 // local_state/local_state_with_offsets.py:40 // if method == b"set_data": dig 1 byte "set_data" == - bz main_else_body@22 + bz main_else_body@20 // local_state/local_state_with_offsets.py:41 // self.set_data(offset, Txn.application_args(2)) dup txna ApplicationArgs 2 callsub set_data - b main_after_if_else@26 + b main_after_if_else@24 -main_else_body@22: +main_else_body@20: // local_state/local_state_with_offsets.py:42 // elif method == b"get_data_with_default": dig 1 byte "get_data_with_default" == - bz main_else_body@24 + bz main_else_body@22 // local_state/local_state_with_offsets.py:43 // log(self.get_data_with_default(offset, Txn.application_args(2))) dup txna ApplicationArgs 2 callsub get_data_with_default log - b main_after_if_else@26 + b main_after_if_else@24 -main_else_body@24: +main_else_body@22: // local_state/local_state_with_offsets.py:45 // return False int 0 return -main_after_if_else@26: +main_after_if_else@24: // local_state/local_state_with_offsets.py:46 // return True int 1 return -main_else_body@27: +main_else_body@25: // local_state/local_state_with_offsets.py:48 // return False int 0 @@ -254,11 +249,3 @@ get_data_with_default: uncover 2 select retsub - - -// examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: -__init__: - // local_state/local_state_with_offsets.py:15 - // def __init__(self) -> None: - proto 0 0 - retsub diff --git a/examples/local_state/out/LocalStateWithOffsets.destructured.ir b/examples/local_state/out/LocalStateWithOffsets.destructured.ir index 47e0ef6c22..3abd1702d7 100644 --- a/examples/local_state/out/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out/LocalStateWithOffsets.destructured.ir @@ -2,86 +2,80 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: program approval: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: block@0: // L18 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L15 - examples.local_state.local_state_with_offsets.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L15 - let tmp%1#0: uint64 = (txn ApplicationID) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L19 + let tmp%0#0: uint64 = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L19 return 1u - block@4: // after_if_else_L19 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L21 + block@2: // after_if_else_L19 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L21 return 0u - block@6: // after_if_else_L21 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (< tmp%7#0 1u) - goto tmp%8#0 ? block@7 : block@8 - block@7: // if_body_L23 + block@4: // after_if_else_L21 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (< tmp%6#0 1u) + goto tmp%7#0 ? block@5 : block@6 + block@5: // if_body_L23 return 0u - block@8: // after_if_else_L23 - let tmp%9#0: bytes = (txna ApplicationArgs 0) - let offset#0: uint64 = (btoi tmp%9#0) + block@6: // after_if_else_L23 + let tmp%8#0: bytes = (txna ApplicationArgs 0) + let offset#0: uint64 = (btoi tmp%8#0) let method#0: bytes = (txna ApplicationArgs 1) - let tmp%10#0: uint64 = (txn NumAppArgs) - let tmp%11#0: uint64 = (== tmp%10#0 2u) - goto tmp%11#0 ? block@9 : block@19 - block@9: // if_body_L28 - let tmp%12#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%12#0 ? block@10 : block@11 - block@10: // if_body_L29 - let tmp%13#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L29 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L31 - let tmp%15#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) - (log tmp%15#0) - goto block@18 - block@13: // else_body_L31 - let tmp%16#0: uint64 = (== method#0 "delete_data") - goto tmp%16#0 ? block@14 : block@15 - block@14: // if_body_L33 + let tmp%9#0: uint64 = (txn NumAppArgs) + let tmp%10#0: uint64 = (== tmp%9#0 2u) + goto tmp%10#0 ? block@7 : block@17 + block@7: // if_body_L28 + let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%11#0 ? block@8 : block@9 + block@8: // if_body_L29 + let tmp%12#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L29 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L31 + let tmp%14#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) + (log tmp%14#0) + goto block@16 + block@11: // else_body_L31 + let tmp%15#0: uint64 = (== method#0 "delete_data") + goto tmp%15#0 ? block@12 : block@13 + block@12: // if_body_L33 examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(offset#0) (log "Deleted") - goto block@18 - block@15: // else_body_L33 + goto block@16 + block@13: // else_body_L33 return 0u - block@18: // after_if_else_L29 + block@16: // after_if_else_L29 return 1u - block@19: // else_body_L28 - let tmp%17#0: uint64 = (txn NumAppArgs) - let tmp%18#0: uint64 = (== tmp%17#0 3u) - goto tmp%18#0 ? block@20 : block@27 - block@20: // if_body_L39 - let tmp%19#0: uint64 = (== method#0 "set_data") - goto tmp%19#0 ? block@21 : block@22 - block@21: // if_body_L40 - let tmp%20#0: bytes = (txna ApplicationArgs 2) - examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%20#0) - goto block@26 - block@22: // else_body_L40 - let tmp%21#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%21#0 ? block@23 : block@24 - block@23: // if_body_L42 - let tmp%22#0: bytes = (txna ApplicationArgs 2) - let tmp%23#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%22#0) - (log tmp%23#0) - goto block@26 - block@24: // else_body_L42 + block@17: // else_body_L28 + let tmp%16#0: uint64 = (txn NumAppArgs) + let tmp%17#0: uint64 = (== tmp%16#0 3u) + goto tmp%17#0 ? block@18 : block@25 + block@18: // if_body_L39 + let tmp%18#0: uint64 = (== method#0 "set_data") + goto tmp%18#0 ? block@19 : block@20 + block@19: // if_body_L40 + let tmp%19#0: bytes = (txna ApplicationArgs 2) + examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%19#0) + goto block@24 + block@20: // else_body_L40 + let tmp%20#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%20#0 ? block@21 : block@22 + block@21: // if_body_L42 + let tmp%21#0: bytes = (txna ApplicationArgs 2) + let tmp%22#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%21#0) + (log tmp%22#0) + goto block@24 + block@22: // else_body_L42 return 0u - block@26: // after_if_else_L40 + block@24: // after_if_else_L40 return 1u - block@27: // else_body_L39 + block@25: // else_body_L39 return 0u subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: @@ -111,10 +105,6 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: - block@0: // L15 - return program clear-state: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.ir index 2e40946b2d..e46be0f113 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.ir @@ -2,93 +2,87 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: program approval: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: block@0: // L18 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L15 - examples.local_state.local_state_with_offsets.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L15 - let tmp%1#0: uint64 = (txn ApplicationID) - let tmp%2#0: uint64 = (== tmp%1#0 0u) - goto tmp%2#0 ? block@3 : block@4 - block@3: // if_body_L19 + let tmp%0#0: uint64 = (txn ApplicationID) + let tmp%1#0: uint64 = (== tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@2 + block@1: // if_body_L19 return 1u - block@4: // after_if_else_L19 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (== tmp%3#0 NoOp) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L21 + block@2: // after_if_else_L19 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (== tmp%2#0 NoOp) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L21 return 0u - block@6: // after_if_else_L21 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (< tmp%7#0 1u) - goto tmp%8#0 ? block@7 : block@8 - block@7: // if_body_L23 + block@4: // after_if_else_L21 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (< tmp%6#0 1u) + goto tmp%7#0 ? block@5 : block@6 + block@5: // if_body_L23 return 0u - block@8: // after_if_else_L23 - let tmp%9#0: bytes = (txna ApplicationArgs 0) - let offset#0: uint64 = (btoi tmp%9#0) + block@6: // after_if_else_L23 + let tmp%8#0: bytes = (txna ApplicationArgs 0) + let offset#0: uint64 = (btoi tmp%8#0) let method#0: bytes = (txna ApplicationArgs 1) - let tmp%10#0: uint64 = (txn NumAppArgs) - let tmp%11#0: uint64 = (== tmp%10#0 2u) - goto tmp%11#0 ? block@9 : block@19 - block@9: // if_body_L28 - let tmp%12#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%12#0 ? block@10 : block@11 - block@10: // if_body_L29 - let tmp%13#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L29 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L31 - let tmp%15#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) - (log tmp%15#0) - goto block@17 - block@13: // else_body_L31 - let tmp%16#0: uint64 = (== method#0 "delete_data") - goto tmp%16#0 ? block@14 : block@15 - block@14: // if_body_L33 + let tmp%9#0: uint64 = (txn NumAppArgs) + let tmp%10#0: uint64 = (== tmp%9#0 2u) + goto tmp%10#0 ? block@7 : block@17 + block@7: // if_body_L28 + let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%11#0 ? block@8 : block@9 + block@8: // if_body_L29 + let tmp%12#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L29 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L31 + let tmp%14#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) + (log tmp%14#0) + goto block@15 + block@11: // else_body_L31 + let tmp%15#0: uint64 = (== method#0 "delete_data") + goto tmp%15#0 ? block@12 : block@13 + block@12: // if_body_L33 examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(offset#0) (log "Deleted") - goto block@16 - block@15: // else_body_L33 + goto block@14 + block@13: // else_body_L33 return 0u - block@16: // after_if_else_L33 - goto block@17 - block@17: // after_if_else_L31 - goto block@18 - block@18: // after_if_else_L29 + block@14: // after_if_else_L33 + goto block@15 + block@15: // after_if_else_L31 + goto block@16 + block@16: // after_if_else_L29 return 1u - block@19: // else_body_L28 - let tmp%17#0: uint64 = (txn NumAppArgs) - let tmp%18#0: uint64 = (== tmp%17#0 3u) - goto tmp%18#0 ? block@20 : block@27 - block@20: // if_body_L39 - let tmp%19#0: uint64 = (== method#0 "set_data") - goto tmp%19#0 ? block@21 : block@22 - block@21: // if_body_L40 - let tmp%20#0: bytes = (txna ApplicationArgs 2) - examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%20#0) - goto block@26 - block@22: // else_body_L40 - let tmp%21#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%21#0 ? block@23 : block@24 - block@23: // if_body_L42 - let tmp%22#0: bytes = (txna ApplicationArgs 2) - let tmp%23#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%22#0) - (log tmp%23#0) - goto block@25 - block@24: // else_body_L42 + block@17: // else_body_L28 + let tmp%16#0: uint64 = (txn NumAppArgs) + let tmp%17#0: uint64 = (== tmp%16#0 3u) + goto tmp%17#0 ? block@18 : block@25 + block@18: // if_body_L39 + let tmp%18#0: uint64 = (== method#0 "set_data") + goto tmp%18#0 ? block@19 : block@20 + block@19: // if_body_L40 + let tmp%19#0: bytes = (txna ApplicationArgs 2) + examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%19#0) + goto block@24 + block@20: // else_body_L40 + let tmp%20#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%20#0 ? block@21 : block@22 + block@21: // if_body_L42 + let tmp%21#0: bytes = (txna ApplicationArgs 2) + let tmp%22#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%21#0) + (log tmp%22#0) + goto block@23 + block@22: // else_body_L42 return 0u - block@25: // after_if_else_L42 - goto block@26 - block@26: // after_if_else_L40 + block@23: // after_if_else_L42 + goto block@24 + block@24: // after_if_else_L40 return 1u - block@27: // else_body_L39 + block@25: // else_body_L39 return 0u subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: @@ -120,10 +114,6 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: - block@0: // L15 - return program clear-state: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir index f7d071b548..1e9351afe4 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir @@ -2,87 +2,81 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: program approval: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: block@0: // L18 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L15 - examples.local_state.local_state_with_offsets.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L15 - let tmp%1#0: uint64 = (txn ApplicationID) - let tmp%2#0: uint64 = (! tmp%1#0) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L19 + let tmp%0#0: uint64 = (txn ApplicationID) + let tmp%1#0: uint64 = (! tmp%0#0) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L19 return 1u - block@4: // after_if_else_L19 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L21 + block@2: // after_if_else_L19 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L21 return 0u - block@6: // after_if_else_L21 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (< tmp%7#0 1u) - goto tmp%8#0 ? block@7 : block@8 - block@7: // if_body_L23 + block@4: // after_if_else_L21 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (< tmp%6#0 1u) + goto tmp%7#0 ? block@5 : block@6 + block@5: // if_body_L23 return 0u - block@8: // after_if_else_L23 - let tmp%9#0: bytes = (txna ApplicationArgs 0) - let offset#0: uint64 = (btoi tmp%9#0) + block@6: // after_if_else_L23 + let tmp%8#0: bytes = (txna ApplicationArgs 0) + let offset#0: uint64 = (btoi tmp%8#0) let method#0: bytes = (txna ApplicationArgs 1) - let tmp%10#0: uint64 = (txn NumAppArgs) - let tmp%11#0: uint64 = (== tmp%10#0 2u) - goto tmp%11#0 ? block@9 : block@19 - block@9: // if_body_L28 - let tmp%12#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%12#0 ? block@10 : block@11 - block@10: // if_body_L29 - let tmp%13#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L29 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L31 - let tmp%15#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) - (log tmp%15#0) - goto block@18 - block@13: // else_body_L31 - let tmp%16#0: uint64 = (== method#0 "delete_data") - goto tmp%16#0 ? block@14 : block@15 - block@14: // if_body_L33 + let tmp%9#0: uint64 = (txn NumAppArgs) + let tmp%10#0: uint64 = (== tmp%9#0 2u) + goto tmp%10#0 ? block@7 : block@17 + block@7: // if_body_L28 + let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%11#0 ? block@8 : block@9 + block@8: // if_body_L29 + let tmp%12#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L29 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L31 + let tmp%14#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) + (log tmp%14#0) + goto block@16 + block@11: // else_body_L31 + let tmp%15#0: uint64 = (== method#0 "delete_data") + goto tmp%15#0 ? block@12 : block@13 + block@12: // if_body_L33 examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(offset#0) (log "Deleted") - goto block@18 - block@15: // else_body_L33 + goto block@16 + block@13: // else_body_L33 return 0u - block@18: // after_if_else_L29 + block@16: // after_if_else_L29 return 1u - block@19: // else_body_L28 - let tmp%17#0: uint64 = (txn NumAppArgs) - let tmp%18#0: uint64 = (== tmp%17#0 3u) - goto tmp%18#0 ? block@20 : block@27 - block@20: // if_body_L39 - let tmp%19#0: uint64 = (== method#0 "set_data") - goto tmp%19#0 ? block@21 : block@22 - block@21: // if_body_L40 - let tmp%20#0: bytes = (txna ApplicationArgs 2) - examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%20#0) - goto block@26 - block@22: // else_body_L40 - let tmp%21#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%21#0 ? block@23 : block@24 - block@23: // if_body_L42 - let tmp%22#0: bytes = (txna ApplicationArgs 2) - let tmp%23#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%22#0) - (log tmp%23#0) - goto block@26 - block@24: // else_body_L42 + block@17: // else_body_L28 + let tmp%16#0: uint64 = (txn NumAppArgs) + let tmp%17#0: uint64 = (== tmp%16#0 3u) + goto tmp%17#0 ? block@18 : block@25 + block@18: // if_body_L39 + let tmp%18#0: uint64 = (== method#0 "set_data") + goto tmp%18#0 ? block@19 : block@20 + block@19: // if_body_L40 + let tmp%19#0: bytes = (txna ApplicationArgs 2) + examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%19#0) + goto block@24 + block@20: // else_body_L40 + let tmp%20#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%20#0 ? block@21 : block@22 + block@21: // if_body_L42 + let tmp%21#0: bytes = (txna ApplicationArgs 2) + let tmp%22#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%21#0) + (log tmp%22#0) + goto block@24 + block@22: // else_body_L42 return 0u - block@26: // after_if_else_L40 + block@24: // after_if_else_L40 return 1u - block@27: // else_body_L39 + block@25: // else_body_L39 return 0u subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: @@ -112,10 +106,6 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: - block@0: // L15 - return program clear-state: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir index 47e0ef6c22..3abd1702d7 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir @@ -2,86 +2,80 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: program approval: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: block@0: // L18 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L15 - examples.local_state.local_state_with_offsets.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L15 - let tmp%1#0: uint64 = (txn ApplicationID) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L19 + let tmp%0#0: uint64 = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L19 return 1u - block@4: // after_if_else_L19 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L21 + block@2: // after_if_else_L19 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L21 return 0u - block@6: // after_if_else_L21 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (< tmp%7#0 1u) - goto tmp%8#0 ? block@7 : block@8 - block@7: // if_body_L23 + block@4: // after_if_else_L21 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (< tmp%6#0 1u) + goto tmp%7#0 ? block@5 : block@6 + block@5: // if_body_L23 return 0u - block@8: // after_if_else_L23 - let tmp%9#0: bytes = (txna ApplicationArgs 0) - let offset#0: uint64 = (btoi tmp%9#0) + block@6: // after_if_else_L23 + let tmp%8#0: bytes = (txna ApplicationArgs 0) + let offset#0: uint64 = (btoi tmp%8#0) let method#0: bytes = (txna ApplicationArgs 1) - let tmp%10#0: uint64 = (txn NumAppArgs) - let tmp%11#0: uint64 = (== tmp%10#0 2u) - goto tmp%11#0 ? block@9 : block@19 - block@9: // if_body_L28 - let tmp%12#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%12#0 ? block@10 : block@11 - block@10: // if_body_L29 - let tmp%13#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L29 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L31 - let tmp%15#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) - (log tmp%15#0) - goto block@18 - block@13: // else_body_L31 - let tmp%16#0: uint64 = (== method#0 "delete_data") - goto tmp%16#0 ? block@14 : block@15 - block@14: // if_body_L33 + let tmp%9#0: uint64 = (txn NumAppArgs) + let tmp%10#0: uint64 = (== tmp%9#0 2u) + goto tmp%10#0 ? block@7 : block@17 + block@7: // if_body_L28 + let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%11#0 ? block@8 : block@9 + block@8: // if_body_L29 + let tmp%12#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L29 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L31 + let tmp%14#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) + (log tmp%14#0) + goto block@16 + block@11: // else_body_L31 + let tmp%15#0: uint64 = (== method#0 "delete_data") + goto tmp%15#0 ? block@12 : block@13 + block@12: // if_body_L33 examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(offset#0) (log "Deleted") - goto block@18 - block@15: // else_body_L33 + goto block@16 + block@13: // else_body_L33 return 0u - block@18: // after_if_else_L29 + block@16: // after_if_else_L29 return 1u - block@19: // else_body_L28 - let tmp%17#0: uint64 = (txn NumAppArgs) - let tmp%18#0: uint64 = (== tmp%17#0 3u) - goto tmp%18#0 ? block@20 : block@27 - block@20: // if_body_L39 - let tmp%19#0: uint64 = (== method#0 "set_data") - goto tmp%19#0 ? block@21 : block@22 - block@21: // if_body_L40 - let tmp%20#0: bytes = (txna ApplicationArgs 2) - examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%20#0) - goto block@26 - block@22: // else_body_L40 - let tmp%21#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%21#0 ? block@23 : block@24 - block@23: // if_body_L42 - let tmp%22#0: bytes = (txna ApplicationArgs 2) - let tmp%23#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%22#0) - (log tmp%23#0) - goto block@26 - block@24: // else_body_L42 + block@17: // else_body_L28 + let tmp%16#0: uint64 = (txn NumAppArgs) + let tmp%17#0: uint64 = (== tmp%16#0 3u) + goto tmp%17#0 ? block@18 : block@25 + block@18: // if_body_L39 + let tmp%18#0: uint64 = (== method#0 "set_data") + goto tmp%18#0 ? block@19 : block@20 + block@19: // if_body_L40 + let tmp%19#0: bytes = (txna ApplicationArgs 2) + examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%19#0) + goto block@24 + block@20: // else_body_L40 + let tmp%20#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%20#0 ? block@21 : block@22 + block@21: // if_body_L42 + let tmp%21#0: bytes = (txna ApplicationArgs 2) + let tmp%22#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%21#0) + (log tmp%22#0) + goto block@24 + block@22: // else_body_L42 return 0u - block@26: // after_if_else_L40 + block@24: // after_if_else_L40 return 1u - block@27: // else_body_L39 + block@25: // else_body_L39 return 0u subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: @@ -111,10 +105,6 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: - block@0: // L15 - return program clear-state: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out_O2/LocalStateContract.approval.teal b/examples/local_state/out_O2/LocalStateContract.approval.teal index 81b8df524d..0e8d993035 100644 --- a/examples/local_state/out_O2/LocalStateContract.approval.teal +++ b/examples/local_state/out_O2/LocalStateContract.approval.teal @@ -3,18 +3,13 @@ examples.local_state.local_state_contract.LocalStateContract.approval_program: int 0 txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ + bnz main_after_if_else@2 -main_entrypoint@2: - txn ApplicationID - bnz main_after_if_else@4 - -main_if_body@3: +main_if_body@1: int 1 return -main_after_if_else@4: +main_after_if_else@2: txn OnCompletion dup ! @@ -22,75 +17,75 @@ main_after_if_else@4: int OptIn == || - bnz main_after_if_else@6 + bnz main_after_if_else@4 -main_if_body@5: +main_if_body@3: int 0 return -main_after_if_else@6: +main_after_if_else@4: txn NumAppArgs - bz main_if_body@5 + bz main_if_body@3 txna ApplicationArgs 0 bury 1 txn NumAppArgs int 1 == - bz main_else_body@19 + bz main_else_body@17 dup byte "get_guaranteed_data" == - bz main_else_body@11 + bz main_else_body@9 txn Sender callsub get_guaranteed_data log - b main_if_body@3 + b main_if_body@1 -main_else_body@11: +main_else_body@9: dup byte "get_data_or_assert" == - bz main_else_body@13 + bz main_else_body@11 txn Sender callsub get_data_or_assert log - b main_if_body@3 + b main_if_body@1 -main_else_body@13: +main_else_body@11: dup byte "delete_data" == - bz main_if_body@5 + bz main_if_body@3 txn Sender callsub delete_data byte "Deleted" log - b main_if_body@3 + b main_if_body@1 -main_else_body@19: +main_else_body@17: txn NumAppArgs int 2 == - bz main_if_body@5 + bz main_if_body@3 dup byte "set_data" == - bz main_else_body@22 + bz main_else_body@20 txn Sender txna ApplicationArgs 1 callsub set_data - b main_if_body@3 + b main_if_body@1 -main_else_body@22: +main_else_body@20: dup byte "get_data_with_default" == - bz main_if_body@5 + bz main_if_body@3 txn Sender txna ApplicationArgs 1 callsub get_data_with_default log - b main_if_body@3 + b main_if_body@1 // examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: @@ -147,9 +142,3 @@ get_data_with_default: uncover 2 select retsub - - -// examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: -__init__: - proto 0 0 - retsub diff --git a/examples/local_state/out_O2/LocalStateContract.destructured.ir b/examples/local_state/out_O2/LocalStateContract.destructured.ir index 5c084d2e88..4cccc11777 100644 --- a/examples/local_state/out_O2/LocalStateContract.destructured.ir +++ b/examples/local_state/out_O2/LocalStateContract.destructured.ir @@ -2,77 +2,71 @@ contract examples.local_state.local_state_contract.LocalStateContract: program approval: subroutine examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: block@0: // L17 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L14 - examples.local_state.local_state_contract.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L14 - let tmp%1#0: uint64 = (txn ApplicationID) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L18 + let tmp%0#0: uint64 = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L18 return 1u - block@4: // after_if_else_L18 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L20 + block@2: // after_if_else_L18 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L20 return 0u - block@6: // after_if_else_L20 - let tmp%7#0: uint64 = (txn NumAppArgs) - goto tmp%7#0 ? block@8 : block@5 - block@8: // after_if_else_L22 + block@4: // after_if_else_L20 + let tmp%6#0: uint64 = (txn NumAppArgs) + goto tmp%6#0 ? block@6 : block@3 + block@6: // after_if_else_L22 let method#0: bytes = (txna ApplicationArgs 0) - let tmp%9#0: uint64 = (txn NumAppArgs) - let tmp%10#0: uint64 = (== tmp%9#0 1u) - goto tmp%10#0 ? block@9 : block@19 - block@9: // if_body_L26 - let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%11#0 ? block@10 : block@11 - block@10: // if_body_L27 - let tmp%12#0: bytes = (txn Sender) - let tmp%13#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%12#0) - (log tmp%13#0) - goto block@3 - block@11: // else_body_L27 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L29 - let tmp%15#0: bytes = (txn Sender) - let tmp%16#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%15#0) - (log tmp%16#0) - goto block@3 - block@13: // else_body_L29 - let tmp%17#0: uint64 = (== method#0 "delete_data") - goto tmp%17#0 ? block@14 : block@5 - block@14: // if_body_L31 - let tmp%18#0: bytes = (txn Sender) - examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%18#0) + let tmp%8#0: uint64 = (txn NumAppArgs) + let tmp%9#0: uint64 = (== tmp%8#0 1u) + goto tmp%9#0 ? block@7 : block@17 + block@7: // if_body_L26 + let tmp%10#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%10#0 ? block@8 : block@9 + block@8: // if_body_L27 + let tmp%11#0: bytes = (txn Sender) + let tmp%12#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%11#0) + (log tmp%12#0) + goto block@1 + block@9: // else_body_L27 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L29 + let tmp%14#0: bytes = (txn Sender) + let tmp%15#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%14#0) + (log tmp%15#0) + goto block@1 + block@11: // else_body_L29 + let tmp%16#0: uint64 = (== method#0 "delete_data") + goto tmp%16#0 ? block@12 : block@3 + block@12: // if_body_L31 + let tmp%17#0: bytes = (txn Sender) + examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%17#0) (log "Deleted") - goto block@3 - block@19: // else_body_L26 - let tmp%19#0: uint64 = (txn NumAppArgs) - let tmp%20#0: uint64 = (== tmp%19#0 2u) - goto tmp%20#0 ? block@20 : block@5 - block@20: // if_body_L37 - let tmp%21#0: uint64 = (== method#0 "set_data") - goto tmp%21#0 ? block@21 : block@22 - block@21: // if_body_L38 - let tmp%22#0: bytes = (txn Sender) - let tmp%23#0: bytes = (txna ApplicationArgs 1) - examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%22#0, tmp%23#0) - goto block@3 - block@22: // else_body_L38 - let tmp%24#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%24#0 ? block@23 : block@5 - block@23: // if_body_L40 - let tmp%25#0: bytes = (txn Sender) - let tmp%26#0: bytes = (txna ApplicationArgs 1) - let tmp%27#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%25#0, tmp%26#0) - (log tmp%27#0) - goto block@3 + goto block@1 + block@17: // else_body_L26 + let tmp%18#0: uint64 = (txn NumAppArgs) + let tmp%19#0: uint64 = (== tmp%18#0 2u) + goto tmp%19#0 ? block@18 : block@3 + block@18: // if_body_L37 + let tmp%20#0: uint64 = (== method#0 "set_data") + goto tmp%20#0 ? block@19 : block@20 + block@19: // if_body_L38 + let tmp%21#0: bytes = (txn Sender) + let tmp%22#0: bytes = (txna ApplicationArgs 1) + examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%21#0, tmp%22#0) + goto block@1 + block@20: // else_body_L38 + let tmp%23#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%23#0 ? block@21 : block@3 + block@21: // if_body_L40 + let tmp%24#0: bytes = (txn Sender) + let tmp%25#0: bytes = (txna ApplicationArgs 1) + let tmp%26#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%24#0, tmp%25#0) + (log tmp%26#0) + goto block@1 subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 @@ -101,10 +95,6 @@ contract examples.local_state.local_state_contract.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: - block@0: // L14 - return program clear-state: subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal b/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal index acee3590da..d48f30a5b5 100644 --- a/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal @@ -4,18 +4,13 @@ examples.local_state.local_state_with_offsets.LocalStateContract.approval_progra int 0 byte "" txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ + bnz main_after_if_else@2 -main_entrypoint@2: - txn ApplicationID - bnz main_after_if_else@4 - -main_if_body@3: +main_if_body@1: int 1 return -main_after_if_else@4: +main_after_if_else@2: txn OnCompletion dup ! @@ -23,17 +18,17 @@ main_after_if_else@4: int OptIn == || - bnz main_after_if_else@6 + bnz main_after_if_else@4 -main_if_body@5: +main_if_body@3: int 0 return -main_after_if_else@6: +main_after_if_else@4: txn NumAppArgs int 1 < - bnz main_if_body@5 + bnz main_if_body@3 txna ApplicationArgs 0 btoi bury 1 @@ -42,61 +37,61 @@ main_after_if_else@6: txn NumAppArgs int 2 == - bz main_else_body@19 + bz main_else_body@17 dig 1 byte "get_guaranteed_data" == - bz main_else_body@11 + bz main_else_body@9 dup callsub get_guaranteed_data log - b main_if_body@3 + b main_if_body@1 -main_else_body@11: +main_else_body@9: dig 1 byte "get_data_or_assert" == - bz main_else_body@13 + bz main_else_body@11 dup callsub get_data_or_assert log - b main_if_body@3 + b main_if_body@1 -main_else_body@13: +main_else_body@11: dig 1 byte "delete_data" == - bz main_if_body@5 + bz main_if_body@3 dup callsub delete_data byte "Deleted" log - b main_if_body@3 + b main_if_body@1 -main_else_body@19: +main_else_body@17: txn NumAppArgs int 3 == - bz main_if_body@5 + bz main_if_body@3 dig 1 byte "set_data" == - bz main_else_body@22 + bz main_else_body@20 dup txna ApplicationArgs 2 callsub set_data - b main_if_body@3 + b main_if_body@1 -main_else_body@22: +main_else_body@20: dig 1 byte "get_data_with_default" == - bz main_if_body@5 + bz main_if_body@3 dup txna ApplicationArgs 2 callsub get_data_with_default log - b main_if_body@3 + b main_if_body@1 // examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: @@ -153,9 +148,3 @@ get_data_with_default: uncover 2 select retsub - - -// examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: -__init__: - proto 0 0 - retsub diff --git a/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir b/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir index 2d07f5981a..84c3cc99bc 100644 --- a/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir @@ -2,75 +2,69 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: program approval: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: block@0: // L18 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L15 - examples.local_state.local_state_with_offsets.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L15 - let tmp%1#0: uint64 = (txn ApplicationID) - goto tmp%1#0 ? block@4 : block@3 - block@3: // if_body_L19 + let tmp%0#0: uint64 = (txn ApplicationID) + goto tmp%0#0 ? block@2 : block@1 + block@1: // if_body_L19 return 1u - block@4: // after_if_else_L19 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (! tmp%3#0) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L21 + block@2: // after_if_else_L19 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (! tmp%2#0) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L21 return 0u - block@6: // after_if_else_L21 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (< tmp%7#0 1u) - goto tmp%8#0 ? block@5 : block@8 - block@8: // after_if_else_L23 - let tmp%9#0: bytes = (txna ApplicationArgs 0) - let offset#0: uint64 = (btoi tmp%9#0) + block@4: // after_if_else_L21 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (< tmp%6#0 1u) + goto tmp%7#0 ? block@3 : block@6 + block@6: // after_if_else_L23 + let tmp%8#0: bytes = (txna ApplicationArgs 0) + let offset#0: uint64 = (btoi tmp%8#0) let method#0: bytes = (txna ApplicationArgs 1) - let tmp%10#0: uint64 = (txn NumAppArgs) - let tmp%11#0: uint64 = (== tmp%10#0 2u) - goto tmp%11#0 ? block@9 : block@19 - block@9: // if_body_L28 - let tmp%12#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%12#0 ? block@10 : block@11 - block@10: // if_body_L29 - let tmp%13#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) - (log tmp%13#0) - goto block@3 - block@11: // else_body_L29 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L31 - let tmp%15#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) - (log tmp%15#0) - goto block@3 - block@13: // else_body_L31 - let tmp%16#0: uint64 = (== method#0 "delete_data") - goto tmp%16#0 ? block@14 : block@5 - block@14: // if_body_L33 + let tmp%9#0: uint64 = (txn NumAppArgs) + let tmp%10#0: uint64 = (== tmp%9#0 2u) + goto tmp%10#0 ? block@7 : block@17 + block@7: // if_body_L28 + let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%11#0 ? block@8 : block@9 + block@8: // if_body_L29 + let tmp%12#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) + (log tmp%12#0) + goto block@1 + block@9: // else_body_L29 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L31 + let tmp%14#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) + (log tmp%14#0) + goto block@1 + block@11: // else_body_L31 + let tmp%15#0: uint64 = (== method#0 "delete_data") + goto tmp%15#0 ? block@12 : block@3 + block@12: // if_body_L33 examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(offset#0) (log "Deleted") - goto block@3 - block@19: // else_body_L28 - let tmp%17#0: uint64 = (txn NumAppArgs) - let tmp%18#0: uint64 = (== tmp%17#0 3u) - goto tmp%18#0 ? block@20 : block@5 - block@20: // if_body_L39 - let tmp%19#0: uint64 = (== method#0 "set_data") - goto tmp%19#0 ? block@21 : block@22 - block@21: // if_body_L40 - let tmp%20#0: bytes = (txna ApplicationArgs 2) - examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%20#0) - goto block@3 - block@22: // else_body_L40 - let tmp%21#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%21#0 ? block@23 : block@5 - block@23: // if_body_L42 - let tmp%22#0: bytes = (txna ApplicationArgs 2) - let tmp%23#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%22#0) - (log tmp%23#0) - goto block@3 + goto block@1 + block@17: // else_body_L28 + let tmp%16#0: uint64 = (txn NumAppArgs) + let tmp%17#0: uint64 = (== tmp%16#0 3u) + goto tmp%17#0 ? block@18 : block@3 + block@18: // if_body_L39 + let tmp%18#0: uint64 = (== method#0 "set_data") + goto tmp%18#0 ? block@19 : block@20 + block@19: // if_body_L40 + let tmp%19#0: bytes = (txna ApplicationArgs 2) + examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%19#0) + goto block@1 + block@20: // else_body_L40 + let tmp%20#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%20#0 ? block@21 : block@3 + block@21: // if_body_L42 + let tmp%21#0: bytes = (txna ApplicationArgs 2) + let tmp%22#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%21#0) + (log tmp%22#0) + goto block@1 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 @@ -99,10 +93,6 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: - block@0: // L15 - return program clear-state: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out_unoptimized/LocalStateContract.approval.teal b/examples/local_state/out_unoptimized/LocalStateContract.approval.teal index d8d46a34b4..a2c9c3e285 100644 --- a/examples/local_state/out_unoptimized/LocalStateContract.approval.teal +++ b/examples/local_state/out_unoptimized/LocalStateContract.approval.teal @@ -2,23 +2,18 @@ examples.local_state.local_state_contract.LocalStateContract.approval_program: int 0 - txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ - -main_entrypoint@2: // local_state/local_state_contract.py:18 // if Txn.application_id == 0: txn ApplicationID int 0 == - bz main_after_if_else@4 + bz main_after_if_else@2 // local_state/local_state_contract.py:19 // return True int 1 return -main_after_if_else@4: +main_after_if_else@2: // local_state/local_state_contract.py:20 // if Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): txn OnCompletion @@ -29,25 +24,25 @@ main_after_if_else@4: int OptIn == || - bnz main_after_if_else@6 + bnz main_after_if_else@4 // local_state/local_state_contract.py:21 // return False int 0 return -main_after_if_else@6: +main_after_if_else@4: // local_state/local_state_contract.py:22 // if Txn.num_app_args == 0: txn NumAppArgs int 0 == - bz main_after_if_else@8 + bz main_after_if_else@6 // local_state/local_state_contract.py:23 // return False int 0 return -main_after_if_else@8: +main_after_if_else@6: // local_state/local_state_contract.py:25 // method = Txn.application_args(0) txna ApplicationArgs 0 @@ -57,41 +52,41 @@ main_after_if_else@8: txn NumAppArgs int 1 == - bz main_else_body@19 + bz main_else_body@17 // local_state/local_state_contract.py:27 // if method == b"get_guaranteed_data": dup byte "get_guaranteed_data" == - bz main_else_body@11 + bz main_else_body@9 // local_state/local_state_contract.py:28 // log(self.get_guaranteed_data(Txn.sender)) txn Sender callsub get_guaranteed_data log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@11: +main_else_body@9: // local_state/local_state_contract.py:29 // elif method == b"get_data_or_assert": dup byte "get_data_or_assert" == - bz main_else_body@13 + bz main_else_body@11 // local_state/local_state_contract.py:30 // log(self.get_data_or_assert(Txn.sender)) txn Sender callsub get_data_or_assert log - b main_after_if_else@17 + b main_after_if_else@15 -main_else_body@13: +main_else_body@11: // local_state/local_state_contract.py:31 // elif method == b"delete_data": dup byte "delete_data" == - bz main_else_body@15 + bz main_else_body@13 // local_state/local_state_contract.py:32 // self.delete_data(Txn.sender) txn Sender @@ -100,74 +95,74 @@ main_else_body@13: // log(b"Deleted") byte "Deleted" log - b main_after_if_else@16 + b main_after_if_else@14 -main_else_body@15: +main_else_body@13: // local_state/local_state_contract.py:35 // return False int 0 return -main_after_if_else@16: +main_after_if_else@14: -main_after_if_else@17: +main_after_if_else@15: -main_after_if_else@18: +main_after_if_else@16: // local_state/local_state_contract.py:36 // return True int 1 return -main_else_body@19: +main_else_body@17: // local_state/local_state_contract.py:37 // elif Txn.num_app_args == 2: txn NumAppArgs int 2 == - bz main_else_body@27 + bz main_else_body@25 // local_state/local_state_contract.py:38 // if method == b"set_data": dup byte "set_data" == - bz main_else_body@22 + bz main_else_body@20 // local_state/local_state_contract.py:39 // self.set_data(Txn.sender, Txn.application_args(1)) txn Sender txna ApplicationArgs 1 callsub set_data - b main_after_if_else@26 + b main_after_if_else@24 -main_else_body@22: +main_else_body@20: // local_state/local_state_contract.py:40 // elif method == b"get_data_with_default": dup byte "get_data_with_default" == - bz main_else_body@24 + bz main_else_body@22 // local_state/local_state_contract.py:41 // log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) txn Sender txna ApplicationArgs 1 callsub get_data_with_default log - b main_after_if_else@25 + b main_after_if_else@23 -main_else_body@24: +main_else_body@22: // local_state/local_state_contract.py:43 // return False int 0 return -main_after_if_else@25: +main_after_if_else@23: -main_after_if_else@26: +main_after_if_else@24: // local_state/local_state_contract.py:44 // return True int 1 return -main_else_body@27: +main_else_body@25: // local_state/local_state_contract.py:46 // return False int 0 @@ -257,11 +252,3 @@ get_data_with_default: uncover 2 select retsub - - -// examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: -__init__: - // local_state/local_state_contract.py:14 - // def __init__(self) -> None: - proto 0 0 - retsub diff --git a/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir b/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir index abd4d2126f..40b3106205 100644 --- a/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir +++ b/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir @@ -2,96 +2,90 @@ contract examples.local_state.local_state_contract.LocalStateContract: program approval: subroutine examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: block@0: // L17 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L14 - examples.local_state.local_state_contract.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L14 - let tmp%1#0: uint64 = (txn ApplicationID) - let tmp%2#0: uint64 = (== tmp%1#0 0u) - goto tmp%2#0 ? block@3 : block@4 - block@3: // if_body_L18 + let tmp%0#0: uint64 = (txn ApplicationID) + let tmp%1#0: uint64 = (== tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@2 + block@1: // if_body_L18 return 1u - block@4: // after_if_else_L18 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (== tmp%3#0 NoOp) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L20 + block@2: // after_if_else_L18 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (== tmp%2#0 NoOp) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L20 return 0u - block@6: // after_if_else_L20 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (== tmp%7#0 0u) - goto tmp%8#0 ? block@7 : block@8 - block@7: // if_body_L22 + block@4: // after_if_else_L20 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (== tmp%6#0 0u) + goto tmp%7#0 ? block@5 : block@6 + block@5: // if_body_L22 return 0u - block@8: // after_if_else_L22 + block@6: // after_if_else_L22 let method#0: bytes = (txna ApplicationArgs 0) - let tmp%9#0: uint64 = (txn NumAppArgs) - let tmp%10#0: uint64 = (== tmp%9#0 1u) - goto tmp%10#0 ? block@9 : block@19 - block@9: // if_body_L26 - let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%11#0 ? block@10 : block@11 - block@10: // if_body_L27 - let tmp%12#0: bytes = (txn Sender) - let tmp%13#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%12#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L27 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L29 - let tmp%15#0: bytes = (txn Sender) - let tmp%16#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%15#0) - (log tmp%16#0) - goto block@17 - block@13: // else_body_L29 - let tmp%17#0: uint64 = (== method#0 "delete_data") - goto tmp%17#0 ? block@14 : block@15 - block@14: // if_body_L31 - let tmp%18#0: bytes = (txn Sender) - examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%18#0) - (log "Deleted") + let tmp%8#0: uint64 = (txn NumAppArgs) + let tmp%9#0: uint64 = (== tmp%8#0 1u) + goto tmp%9#0 ? block@7 : block@17 + block@7: // if_body_L26 + let tmp%10#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%10#0 ? block@8 : block@9 + block@8: // if_body_L27 + let tmp%11#0: bytes = (txn Sender) + let tmp%12#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(tmp%11#0) + (log tmp%12#0) goto block@16 - block@15: // else_body_L31 + block@9: // else_body_L27 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L29 + let tmp%14#0: bytes = (txn Sender) + let tmp%15#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(tmp%14#0) + (log tmp%15#0) + goto block@15 + block@11: // else_body_L29 + let tmp%16#0: uint64 = (== method#0 "delete_data") + goto tmp%16#0 ? block@12 : block@13 + block@12: // if_body_L31 + let tmp%17#0: bytes = (txn Sender) + examples.local_state.local_state_contract.LocalStateContract.delete_data(tmp%17#0) + (log "Deleted") + goto block@14 + block@13: // else_body_L31 return 0u - block@16: // after_if_else_L31 - goto block@17 - block@17: // after_if_else_L29 - goto block@18 - block@18: // after_if_else_L27 + block@14: // after_if_else_L31 + goto block@15 + block@15: // after_if_else_L29 + goto block@16 + block@16: // after_if_else_L27 return 1u - block@19: // else_body_L26 - let tmp%19#0: uint64 = (txn NumAppArgs) - let tmp%20#0: uint64 = (== tmp%19#0 2u) - goto tmp%20#0 ? block@20 : block@27 - block@20: // if_body_L37 - let tmp%21#0: uint64 = (== method#0 "set_data") - goto tmp%21#0 ? block@21 : block@22 - block@21: // if_body_L38 - let tmp%22#0: bytes = (txn Sender) - let tmp%23#0: bytes = (txna ApplicationArgs 1) - examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%22#0, tmp%23#0) - goto block@26 - block@22: // else_body_L38 - let tmp%24#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%24#0 ? block@23 : block@24 - block@23: // if_body_L40 - let tmp%25#0: bytes = (txn Sender) - let tmp%26#0: bytes = (txna ApplicationArgs 1) - let tmp%27#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%25#0, tmp%26#0) - (log tmp%27#0) - goto block@25 - block@24: // else_body_L40 + block@17: // else_body_L26 + let tmp%18#0: uint64 = (txn NumAppArgs) + let tmp%19#0: uint64 = (== tmp%18#0 2u) + goto tmp%19#0 ? block@18 : block@25 + block@18: // if_body_L37 + let tmp%20#0: uint64 = (== method#0 "set_data") + goto tmp%20#0 ? block@19 : block@20 + block@19: // if_body_L38 + let tmp%21#0: bytes = (txn Sender) + let tmp%22#0: bytes = (txna ApplicationArgs 1) + examples.local_state.local_state_contract.LocalStateContract.set_data(tmp%21#0, tmp%22#0) + goto block@24 + block@20: // else_body_L38 + let tmp%23#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%23#0 ? block@21 : block@22 + block@21: // if_body_L40 + let tmp%24#0: bytes = (txn Sender) + let tmp%25#0: bytes = (txna ApplicationArgs 1) + let tmp%26#0: bytes = examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(tmp%24#0, tmp%25#0) + (log tmp%26#0) + goto block@23 + block@22: // else_body_L40 return 0u - block@25: // after_if_else_L40 - goto block@26 - block@26: // after_if_else_L38 + block@23: // after_if_else_L40 + goto block@24 + block@24: // after_if_else_L38 return 1u - block@27: // else_body_L37 + block@25: // else_body_L37 return 0u subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: @@ -123,10 +117,6 @@ contract examples.local_state.local_state_contract.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_contract.LocalStateContract.__init__() -> void: - block@0: // L14 - return program clear-state: subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal b/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal index fb857a2d90..47e8db4952 100644 --- a/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out_unoptimized/LocalStateWithOffsets.approval.teal @@ -3,23 +3,18 @@ examples.local_state.local_state_with_offsets.LocalStateContract.approval_program: int 0 byte "" - txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ - -main_entrypoint@2: // local_state/local_state_with_offsets.py:19 // if Txn.application_id == 0: txn ApplicationID int 0 == - bz main_after_if_else@4 + bz main_after_if_else@2 // local_state/local_state_with_offsets.py:20 // return True int 1 return -main_after_if_else@4: +main_after_if_else@2: // local_state/local_state_with_offsets.py:21 // if Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): txn OnCompletion @@ -30,25 +25,25 @@ main_after_if_else@4: int OptIn == || - bnz main_after_if_else@6 + bnz main_after_if_else@4 // local_state/local_state_with_offsets.py:22 // return False int 0 return -main_after_if_else@6: +main_after_if_else@4: // local_state/local_state_with_offsets.py:23 // if Txn.num_app_args < 1: txn NumAppArgs int 1 < - bz main_after_if_else@8 + bz main_after_if_else@6 // local_state/local_state_with_offsets.py:24 // return False int 0 return -main_after_if_else@8: +main_after_if_else@6: // local_state/local_state_with_offsets.py:26 // offset = op.btoi(Txn.application_args(0)) txna ApplicationArgs 0 @@ -63,41 +58,41 @@ main_after_if_else@8: txn NumAppArgs int 2 == - bz main_else_body@19 + bz main_else_body@17 // local_state/local_state_with_offsets.py:29 // if method == b"get_guaranteed_data": dig 1 byte "get_guaranteed_data" == - bz main_else_body@11 + bz main_else_body@9 // local_state/local_state_with_offsets.py:30 // log(self.get_guaranteed_data(offset)) dup callsub get_guaranteed_data log - b main_after_if_else@18 + b main_after_if_else@16 -main_else_body@11: +main_else_body@9: // local_state/local_state_with_offsets.py:31 // elif method == b"get_data_or_assert": dig 1 byte "get_data_or_assert" == - bz main_else_body@13 + bz main_else_body@11 // local_state/local_state_with_offsets.py:32 // log(self.get_data_or_assert(offset)) dup callsub get_data_or_assert log - b main_after_if_else@17 + b main_after_if_else@15 -main_else_body@13: +main_else_body@11: // local_state/local_state_with_offsets.py:33 // elif method == b"delete_data": dig 1 byte "delete_data" == - bz main_else_body@15 + bz main_else_body@13 // local_state/local_state_with_offsets.py:34 // self.delete_data(offset) dup @@ -106,52 +101,52 @@ main_else_body@13: // log(b"Deleted") byte "Deleted" log - b main_after_if_else@16 + b main_after_if_else@14 -main_else_body@15: +main_else_body@13: // local_state/local_state_with_offsets.py:37 // return False int 0 return -main_after_if_else@16: +main_after_if_else@14: -main_after_if_else@17: +main_after_if_else@15: -main_after_if_else@18: +main_after_if_else@16: // local_state/local_state_with_offsets.py:38 // return True int 1 return -main_else_body@19: +main_else_body@17: // local_state/local_state_with_offsets.py:39 // elif Txn.num_app_args == 3: txn NumAppArgs int 3 == - bz main_else_body@27 + bz main_else_body@25 // local_state/local_state_with_offsets.py:40 // if method == b"set_data": dig 1 byte "set_data" == - bz main_else_body@22 + bz main_else_body@20 // local_state/local_state_with_offsets.py:41 // self.set_data(offset, Txn.application_args(2)) txna ApplicationArgs 2 dig 1 swap callsub set_data - b main_after_if_else@26 + b main_after_if_else@24 -main_else_body@22: +main_else_body@20: // local_state/local_state_with_offsets.py:42 // elif method == b"get_data_with_default": dig 1 byte "get_data_with_default" == - bz main_else_body@24 + bz main_else_body@22 // local_state/local_state_with_offsets.py:43 // log(self.get_data_with_default(offset, Txn.application_args(2))) txna ApplicationArgs 2 @@ -159,23 +154,23 @@ main_else_body@22: swap callsub get_data_with_default log - b main_after_if_else@25 + b main_after_if_else@23 -main_else_body@24: +main_else_body@22: // local_state/local_state_with_offsets.py:45 // return False int 0 return -main_after_if_else@25: +main_after_if_else@23: -main_after_if_else@26: +main_after_if_else@24: // local_state/local_state_with_offsets.py:46 // return True int 1 return -main_else_body@27: +main_else_body@25: // local_state/local_state_with_offsets.py:48 // return False int 0 @@ -265,11 +260,3 @@ get_data_with_default: uncover 2 select retsub - - -// examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: -__init__: - // local_state/local_state_with_offsets.py:15 - // def __init__(self) -> None: - proto 0 0 - retsub diff --git a/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir b/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir index 2e40946b2d..e46be0f113 100644 --- a/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir @@ -2,93 +2,87 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: program approval: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: block@0: // L18 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L15 - examples.local_state.local_state_with_offsets.LocalStateContract.__init__() - goto block@2 - block@2: // entrypoint_L15 - let tmp%1#0: uint64 = (txn ApplicationID) - let tmp%2#0: uint64 = (== tmp%1#0 0u) - goto tmp%2#0 ? block@3 : block@4 - block@3: // if_body_L19 + let tmp%0#0: uint64 = (txn ApplicationID) + let tmp%1#0: uint64 = (== tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@2 + block@1: // if_body_L19 return 1u - block@4: // after_if_else_L19 - let tmp%3#0: uint64 = (txn OnCompletion) - let contains%4#0: uint64 = (== tmp%3#0 NoOp) - let is_equal%5#0: uint64 = (== tmp%3#0 OptIn) - let tmp%6#0: uint64 = (|| contains%4#0 is_equal%5#0) - goto tmp%6#0 ? block@6 : block@5 - block@5: // if_body_L21 + block@2: // after_if_else_L19 + let tmp%2#0: uint64 = (txn OnCompletion) + let contains%3#0: uint64 = (== tmp%2#0 NoOp) + let is_equal%4#0: uint64 = (== tmp%2#0 OptIn) + let tmp%5#0: uint64 = (|| contains%3#0 is_equal%4#0) + goto tmp%5#0 ? block@4 : block@3 + block@3: // if_body_L21 return 0u - block@6: // after_if_else_L21 - let tmp%7#0: uint64 = (txn NumAppArgs) - let tmp%8#0: uint64 = (< tmp%7#0 1u) - goto tmp%8#0 ? block@7 : block@8 - block@7: // if_body_L23 + block@4: // after_if_else_L21 + let tmp%6#0: uint64 = (txn NumAppArgs) + let tmp%7#0: uint64 = (< tmp%6#0 1u) + goto tmp%7#0 ? block@5 : block@6 + block@5: // if_body_L23 return 0u - block@8: // after_if_else_L23 - let tmp%9#0: bytes = (txna ApplicationArgs 0) - let offset#0: uint64 = (btoi tmp%9#0) + block@6: // after_if_else_L23 + let tmp%8#0: bytes = (txna ApplicationArgs 0) + let offset#0: uint64 = (btoi tmp%8#0) let method#0: bytes = (txna ApplicationArgs 1) - let tmp%10#0: uint64 = (txn NumAppArgs) - let tmp%11#0: uint64 = (== tmp%10#0 2u) - goto tmp%11#0 ? block@9 : block@19 - block@9: // if_body_L28 - let tmp%12#0: uint64 = (== method#0 "get_guaranteed_data") - goto tmp%12#0 ? block@10 : block@11 - block@10: // if_body_L29 - let tmp%13#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) - (log tmp%13#0) - goto block@18 - block@11: // else_body_L29 - let tmp%14#0: uint64 = (== method#0 "get_data_or_assert") - goto tmp%14#0 ? block@12 : block@13 - block@12: // if_body_L31 - let tmp%15#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) - (log tmp%15#0) - goto block@17 - block@13: // else_body_L31 - let tmp%16#0: uint64 = (== method#0 "delete_data") - goto tmp%16#0 ? block@14 : block@15 - block@14: // if_body_L33 + let tmp%9#0: uint64 = (txn NumAppArgs) + let tmp%10#0: uint64 = (== tmp%9#0 2u) + goto tmp%10#0 ? block@7 : block@17 + block@7: // if_body_L28 + let tmp%11#0: uint64 = (== method#0 "get_guaranteed_data") + goto tmp%11#0 ? block@8 : block@9 + block@8: // if_body_L29 + let tmp%12#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(offset#0) + (log tmp%12#0) + goto block@16 + block@9: // else_body_L29 + let tmp%13#0: uint64 = (== method#0 "get_data_or_assert") + goto tmp%13#0 ? block@10 : block@11 + block@10: // if_body_L31 + let tmp%14#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(offset#0) + (log tmp%14#0) + goto block@15 + block@11: // else_body_L31 + let tmp%15#0: uint64 = (== method#0 "delete_data") + goto tmp%15#0 ? block@12 : block@13 + block@12: // if_body_L33 examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(offset#0) (log "Deleted") - goto block@16 - block@15: // else_body_L33 + goto block@14 + block@13: // else_body_L33 return 0u - block@16: // after_if_else_L33 - goto block@17 - block@17: // after_if_else_L31 - goto block@18 - block@18: // after_if_else_L29 + block@14: // after_if_else_L33 + goto block@15 + block@15: // after_if_else_L31 + goto block@16 + block@16: // after_if_else_L29 return 1u - block@19: // else_body_L28 - let tmp%17#0: uint64 = (txn NumAppArgs) - let tmp%18#0: uint64 = (== tmp%17#0 3u) - goto tmp%18#0 ? block@20 : block@27 - block@20: // if_body_L39 - let tmp%19#0: uint64 = (== method#0 "set_data") - goto tmp%19#0 ? block@21 : block@22 - block@21: // if_body_L40 - let tmp%20#0: bytes = (txna ApplicationArgs 2) - examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%20#0) - goto block@26 - block@22: // else_body_L40 - let tmp%21#0: uint64 = (== method#0 "get_data_with_default") - goto tmp%21#0 ? block@23 : block@24 - block@23: // if_body_L42 - let tmp%22#0: bytes = (txna ApplicationArgs 2) - let tmp%23#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%22#0) - (log tmp%23#0) - goto block@25 - block@24: // else_body_L42 + block@17: // else_body_L28 + let tmp%16#0: uint64 = (txn NumAppArgs) + let tmp%17#0: uint64 = (== tmp%16#0 3u) + goto tmp%17#0 ? block@18 : block@25 + block@18: // if_body_L39 + let tmp%18#0: uint64 = (== method#0 "set_data") + goto tmp%18#0 ? block@19 : block@20 + block@19: // if_body_L40 + let tmp%19#0: bytes = (txna ApplicationArgs 2) + examples.local_state.local_state_with_offsets.LocalStateContract.set_data(offset#0, tmp%19#0) + goto block@24 + block@20: // else_body_L40 + let tmp%20#0: uint64 = (== method#0 "get_data_with_default") + goto tmp%20#0 ? block@21 : block@22 + block@21: // if_body_L42 + let tmp%21#0: bytes = (txna ApplicationArgs 2) + let tmp%22#0: bytes = examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(offset#0, tmp%21#0) + (log tmp%22#0) + goto block@23 + block@22: // else_body_L42 return 0u - block@25: // after_if_else_L42 - goto block@26 - block@26: // after_if_else_L40 + block@23: // after_if_else_L42 + goto block@24 + block@24: // after_if_else_L40 return 1u - block@27: // else_body_L39 + block@25: // else_body_L39 return 0u subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: @@ -120,10 +114,6 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: let (local_get_ex%0#0: any, local_get_ex%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") let tmp%2#0: any = (select default#0 local_get_ex%0#0 local_get_ex%1#0) return tmp%2#0 - - subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__() -> void: - block@0: // L15 - return program clear-state: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program() -> uint64: diff --git a/examples/local_state/puya.log b/examples/local_state/puya.log index b13dd91ada..c575b5f9aa 100644 --- a/examples/local_state/puya.log +++ b/examples/local_state/puya.log @@ -295,67 +295,61 @@ debug: Sealing block@0: // L65 debug: Terminated block@0: // L65 debug: Sealing block@0: // L55 debug: Terminated block@0: // L55 -debug: Sealing block@0: // L14 -debug: Terminated block@0: // L14 debug: Sealing block@0: // L17 debug: Terminated block@0: // L17 -debug: Sealing block@None: // on_create_L14 -debug: Terminated block@1: // on_create_L14 -debug: Sealing block@2: // entrypoint_L14 -debug: Terminated block@2: // entrypoint_L14 debug: Sealing block@None: // if_body_L18 debug: Sealing block@None: // else_body_L18 -debug: Terminated block@3: // if_body_L18 -debug: Sealing block@4: // after_if_else_L18 -debug: Terminated block@4: // after_if_else_L18 +debug: Terminated block@1: // if_body_L18 +debug: Sealing block@2: // after_if_else_L18 +debug: Terminated block@2: // after_if_else_L18 debug: Sealing block@None: // if_body_L20 debug: Sealing block@None: // else_body_L20 -debug: Terminated block@5: // if_body_L20 -debug: Sealing block@6: // after_if_else_L20 -debug: Terminated block@6: // after_if_else_L20 +debug: Terminated block@3: // if_body_L20 +debug: Sealing block@4: // after_if_else_L20 +debug: Terminated block@4: // after_if_else_L20 debug: Sealing block@None: // if_body_L22 debug: Sealing block@None: // else_body_L22 -debug: Terminated block@7: // if_body_L22 -debug: Sealing block@8: // after_if_else_L22 -debug: Terminated block@8: // after_if_else_L22 +debug: Terminated block@5: // if_body_L22 +debug: Sealing block@6: // after_if_else_L22 +debug: Terminated block@6: // after_if_else_L22 debug: Sealing block@None: // if_body_L26 debug: Sealing block@None: // else_body_L26 -debug: Terminated block@9: // if_body_L26 +debug: Terminated block@7: // if_body_L26 debug: Sealing block@None: // if_body_L27 debug: Sealing block@None: // else_body_L27 -debug: Terminated block@10: // if_body_L27 -debug: Terminated block@11: // else_body_L27 +debug: Terminated block@8: // if_body_L27 +debug: Terminated block@9: // else_body_L27 debug: Sealing block@None: // if_body_L29 debug: Sealing block@None: // else_body_L29 -debug: Terminated block@12: // if_body_L29 -debug: Terminated block@13: // else_body_L29 +debug: Terminated block@10: // if_body_L29 +debug: Terminated block@11: // else_body_L29 debug: Sealing block@None: // if_body_L31 debug: Sealing block@None: // else_body_L31 -debug: Terminated block@14: // if_body_L31 -debug: Terminated block@15: // else_body_L31 -debug: Sealing block@16: // after_if_else_L31 -debug: Terminated block@16: // after_if_else_L31 -debug: Sealing block@17: // after_if_else_L29 -debug: Terminated block@17: // after_if_else_L29 -debug: Sealing block@18: // after_if_else_L27 -debug: Terminated block@18: // after_if_else_L27 -debug: Terminated block@19: // else_body_L26 +debug: Terminated block@12: // if_body_L31 +debug: Terminated block@13: // else_body_L31 +debug: Sealing block@14: // after_if_else_L31 +debug: Terminated block@14: // after_if_else_L31 +debug: Sealing block@15: // after_if_else_L29 +debug: Terminated block@15: // after_if_else_L29 +debug: Sealing block@16: // after_if_else_L27 +debug: Terminated block@16: // after_if_else_L27 +debug: Terminated block@17: // else_body_L26 debug: Sealing block@None: // if_body_L37 debug: Sealing block@None: // else_body_L37 -debug: Terminated block@20: // if_body_L37 +debug: Terminated block@18: // if_body_L37 debug: Sealing block@None: // if_body_L38 debug: Sealing block@None: // else_body_L38 -debug: Terminated block@21: // if_body_L38 -debug: Terminated block@22: // else_body_L38 +debug: Terminated block@19: // if_body_L38 +debug: Terminated block@20: // else_body_L38 debug: Sealing block@None: // if_body_L40 debug: Sealing block@None: // else_body_L40 -debug: Terminated block@23: // if_body_L40 -debug: Terminated block@24: // else_body_L40 -debug: Sealing block@25: // after_if_else_L40 -debug: Terminated block@25: // after_if_else_L40 -debug: Sealing block@26: // after_if_else_L38 -debug: Terminated block@26: // after_if_else_L38 -debug: Terminated block@27: // else_body_L37 +debug: Terminated block@21: // if_body_L40 +debug: Terminated block@22: // else_body_L40 +debug: Sealing block@23: // after_if_else_L40 +debug: Terminated block@23: // after_if_else_L40 +debug: Sealing block@24: // after_if_else_L38 +debug: Terminated block@24: // after_if_else_L38 +debug: Terminated block@25: // else_body_L37 debug: Sealing block@None: // after_if_else_L37 debug: Sealing block@None: // after_if_else_L26 debug: Sealing block@0: // L48 @@ -370,67 +364,61 @@ debug: Sealing block@0: // L67 debug: Terminated block@0: // L67 debug: Sealing block@0: // L57 debug: Terminated block@0: // L57 -debug: Sealing block@0: // L15 -debug: Terminated block@0: // L15 debug: Sealing block@0: // L18 debug: Terminated block@0: // L18 -debug: Sealing block@None: // on_create_L15 -debug: Terminated block@1: // on_create_L15 -debug: Sealing block@2: // entrypoint_L15 -debug: Terminated block@2: // entrypoint_L15 debug: Sealing block@None: // if_body_L19 debug: Sealing block@None: // else_body_L19 -debug: Terminated block@3: // if_body_L19 -debug: Sealing block@4: // after_if_else_L19 -debug: Terminated block@4: // after_if_else_L19 +debug: Terminated block@1: // if_body_L19 +debug: Sealing block@2: // after_if_else_L19 +debug: Terminated block@2: // after_if_else_L19 debug: Sealing block@None: // if_body_L21 debug: Sealing block@None: // else_body_L21 -debug: Terminated block@5: // if_body_L21 -debug: Sealing block@6: // after_if_else_L21 -debug: Terminated block@6: // after_if_else_L21 +debug: Terminated block@3: // if_body_L21 +debug: Sealing block@4: // after_if_else_L21 +debug: Terminated block@4: // after_if_else_L21 debug: Sealing block@None: // if_body_L23 debug: Sealing block@None: // else_body_L23 -debug: Terminated block@7: // if_body_L23 -debug: Sealing block@8: // after_if_else_L23 -debug: Terminated block@8: // after_if_else_L23 +debug: Terminated block@5: // if_body_L23 +debug: Sealing block@6: // after_if_else_L23 +debug: Terminated block@6: // after_if_else_L23 debug: Sealing block@None: // if_body_L28 debug: Sealing block@None: // else_body_L28 -debug: Terminated block@9: // if_body_L28 +debug: Terminated block@7: // if_body_L28 debug: Sealing block@None: // if_body_L29 debug: Sealing block@None: // else_body_L29 -debug: Terminated block@10: // if_body_L29 -debug: Terminated block@11: // else_body_L29 +debug: Terminated block@8: // if_body_L29 +debug: Terminated block@9: // else_body_L29 debug: Sealing block@None: // if_body_L31 debug: Sealing block@None: // else_body_L31 -debug: Terminated block@12: // if_body_L31 -debug: Terminated block@13: // else_body_L31 +debug: Terminated block@10: // if_body_L31 +debug: Terminated block@11: // else_body_L31 debug: Sealing block@None: // if_body_L33 debug: Sealing block@None: // else_body_L33 -debug: Terminated block@14: // if_body_L33 -debug: Terminated block@15: // else_body_L33 -debug: Sealing block@16: // after_if_else_L33 -debug: Terminated block@16: // after_if_else_L33 -debug: Sealing block@17: // after_if_else_L31 -debug: Terminated block@17: // after_if_else_L31 -debug: Sealing block@18: // after_if_else_L29 -debug: Terminated block@18: // after_if_else_L29 -debug: Terminated block@19: // else_body_L28 +debug: Terminated block@12: // if_body_L33 +debug: Terminated block@13: // else_body_L33 +debug: Sealing block@14: // after_if_else_L33 +debug: Terminated block@14: // after_if_else_L33 +debug: Sealing block@15: // after_if_else_L31 +debug: Terminated block@15: // after_if_else_L31 +debug: Sealing block@16: // after_if_else_L29 +debug: Terminated block@16: // after_if_else_L29 +debug: Terminated block@17: // else_body_L28 debug: Sealing block@None: // if_body_L39 debug: Sealing block@None: // else_body_L39 -debug: Terminated block@20: // if_body_L39 +debug: Terminated block@18: // if_body_L39 debug: Sealing block@None: // if_body_L40 debug: Sealing block@None: // else_body_L40 -debug: Terminated block@21: // if_body_L40 -debug: Terminated block@22: // else_body_L40 +debug: Terminated block@19: // if_body_L40 +debug: Terminated block@20: // else_body_L40 debug: Sealing block@None: // if_body_L42 debug: Sealing block@None: // else_body_L42 -debug: Terminated block@23: // if_body_L42 -debug: Terminated block@24: // else_body_L42 -debug: Sealing block@25: // after_if_else_L42 -debug: Terminated block@25: // after_if_else_L42 -debug: Sealing block@26: // after_if_else_L40 -debug: Terminated block@26: // after_if_else_L40 -debug: Terminated block@27: // else_body_L39 +debug: Terminated block@21: // if_body_L42 +debug: Terminated block@22: // else_body_L42 +debug: Sealing block@23: // after_if_else_L42 +debug: Terminated block@23: // after_if_else_L42 +debug: Sealing block@24: // after_if_else_L40 +debug: Terminated block@24: // after_if_else_L40 +debug: Terminated block@25: // else_body_L39 debug: Sealing block@None: // after_if_else_L39 debug: Sealing block@None: // after_if_else_L28 debug: Sealing block@0: // L50 @@ -446,17 +434,17 @@ debug: Optimizer: Copy Propagation debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops -debug: simplified branch on !tmp%2#0 by swapping zero and non-zero targets -debug: simplified terminator of block@2: // entrypoint_L14 from goto tmp%2#0 ? block@3 : block@4 to goto tmp%1#0 ? block@4 : block@3 -debug: simplified branch on !tmp%8#0 by swapping zero and non-zero targets -debug: simplified terminator of block@6: // after_if_else_L20 from goto tmp%8#0 ? block@7 : block@8 to goto tmp%7#0 ? block@8 : block@7 +debug: simplified branch on !tmp%1#0 by swapping zero and non-zero targets +debug: simplified terminator of block@0: // L17 from goto tmp%1#0 ? block@1 : block@2 to goto tmp%0#0 ? block@2 : block@1 +debug: simplified branch on !tmp%7#0 by swapping zero and non-zero targets +debug: simplified terminator of block@4: // after_if_else_L20 from goto tmp%7#0 ? block@5 : block@6 to goto tmp%6#0 ? block@6 : block@5 debug: Optimizer: Remove Linear Jump -debug: Replaced predecessor block@16: // after_if_else_L31 with block@14: // if_body_L31 in block@17: // after_if_else_L29 -debug: Merged linear block@16: // after_if_else_L31 into block@14: // if_body_L31 -debug: Replaced predecessor block@25: // after_if_else_L40 with block@23: // if_body_L40 in block@26: // after_if_else_L38 -debug: Merged linear block@25: // after_if_else_L40 into block@23: // if_body_L40 +debug: Replaced predecessor block@14: // after_if_else_L31 with block@12: // if_body_L31 in block@15: // after_if_else_L29 +debug: Merged linear block@14: // after_if_else_L31 into block@12: // if_body_L31 +debug: Replaced predecessor block@23: // after_if_else_L40 with block@21: // if_body_L40 in block@24: // after_if_else_L38 +debug: Merged linear block@23: // after_if_else_L40 into block@21: // if_body_L40 debug: Optimizer: Remove Empty Blocks -debug: Removed empty block: block@17: // after_if_else_L29 +debug: Removed empty block: block@15: // after_if_else_L29 debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data @@ -523,18 +511,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.__init__ -debug: Splitting parallel copies prior to optimization -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification @@ -555,8 +531,8 @@ debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables -debug: Removing unused variable tmp%2#0 -debug: Removing unused variable tmp%8#0 +debug: Removing unused variable tmp%1#0 +debug: Removing unused variable tmp%7#0 debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks @@ -617,17 +593,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.__init__ -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer @@ -707,17 +672,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.__init__ -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_contract.LocalStateContract.clear_state_program debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer @@ -736,7 +690,6 @@ debug: Removing Phis from examples.local_state.local_state_contract.LocalStateCo debug: Removing Phis from examples.local_state.local_state_contract.LocalStateContract.delete_data debug: Removing Phis from examples.local_state.local_state_contract.LocalStateContract.set_data debug: Removing Phis from examples.local_state.local_state_contract.LocalStateContract.get_data_with_default -debug: Removing Phis from examples.local_state.local_state_contract.LocalStateContract.__init__ debug: Removing Phis from examples.local_state.local_state_contract.LocalStateContract.clear_state_program debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.approval_program using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -750,8 +703,6 @@ debug: Coalescing local variables in examples.local_state.local_state_contract.L debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.get_data_with_default using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s -debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.__init__ using strategy RootOperandGrouping -debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_contract.LocalStateContract.clear_state_program using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Sequentializing parallel copies in examples.local_state.local_state_contract.LocalStateContract.approval_program @@ -760,65 +711,62 @@ debug: Sequentializing parallel copies in examples.local_state.local_state_contr debug: Sequentializing parallel copies in examples.local_state.local_state_contract.LocalStateContract.delete_data debug: Sequentializing parallel copies in examples.local_state.local_state_contract.LocalStateContract.set_data debug: Sequentializing parallel copies in examples.local_state.local_state_contract.LocalStateContract.get_data_with_default -debug: Sequentializing parallel copies in examples.local_state.local_state_contract.LocalStateContract.__init__ debug: Sequentializing parallel copies in examples.local_state.local_state_contract.LocalStateContract.clear_state_program debug: Performing post-SSA optimizations debug: Output IR to local_state/out/LocalStateContract.destructured.ir -debug: Inserted main_block@0.ops[1]: 'store app_id%0#0 to l-stack (copy)' -debug: Replaced main_block@0.ops[3]: 'load app_id%0#0' with 'load app_id%0#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[1]: 'store tmp%1#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[3]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[1]: 'store tmp%3#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[3]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[13]: 'store tmp%6#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[15]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[9]: 'store is_equal%5#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[12]: 'load is_equal%5#0' with 'load is_equal%5#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[4]: 'store tmp%3#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[7]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[6]: 'store contains%4#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[13]: 'load contains%4#0' with 'load contains%4#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@6.ops[1]: 'store tmp%7#0 to l-stack (copy)' -debug: Replaced main_after_if_else@6.ops[3]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@8.ops[3]: 'store tmp%9#0 to l-stack (copy)' -debug: Replaced main_after_if_else@8.ops[5]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@8.ops[8]: 'store tmp%10#0 to l-stack (copy)' -debug: Replaced main_after_if_else@8.ops[10]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted main_if_body@9.ops[3]: 'store tmp%11#0 to l-stack (copy)' -debug: Replaced main_if_body@9.ops[5]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' -debug: Inserted main_if_body@10.ops[1]: 'store tmp%12#0 to l-stack (copy)' -debug: Replaced main_if_body@10.ops[3]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' -debug: Inserted main_if_body@10.ops[5]: 'store tmp%13#0 to l-stack (copy)' -debug: Replaced main_if_body@10.ops[7]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' -debug: Inserted main_else_body@11.ops[3]: 'store tmp%14#0 to l-stack (copy)' -debug: Replaced main_else_body@11.ops[5]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' -debug: Inserted main_if_body@12.ops[1]: 'store tmp%15#0 to l-stack (copy)' -debug: Replaced main_if_body@12.ops[3]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' -debug: Inserted main_if_body@12.ops[5]: 'store tmp%16#0 to l-stack (copy)' -debug: Replaced main_if_body@12.ops[7]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' -debug: Inserted main_else_body@13.ops[3]: 'store tmp%17#0 to l-stack (copy)' -debug: Replaced main_else_body@13.ops[5]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' -debug: Inserted main_if_body@14.ops[1]: 'store tmp%18#0 to l-stack (copy)' -debug: Replaced main_if_body@14.ops[3]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' -debug: Inserted main_else_body@19.ops[1]: 'store tmp%19#0 to l-stack (copy)' -debug: Replaced main_else_body@19.ops[3]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' -debug: Inserted main_else_body@19.ops[6]: 'store tmp%20#0 to l-stack (copy)' -debug: Replaced main_else_body@19.ops[8]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' -debug: Inserted main_if_body@20.ops[3]: 'store tmp%21#0 to l-stack (copy)' -debug: Replaced main_if_body@20.ops[5]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' -debug: Inserted main_if_body@21.ops[3]: 'store tmp%23#0 to l-stack (copy)' -debug: Replaced main_if_body@21.ops[6]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' -debug: Inserted main_if_body@21.ops[1]: 'store tmp%22#0 to l-stack (copy)' -debug: Replaced main_if_body@21.ops[6]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' -debug: Inserted main_else_body@22.ops[3]: 'store tmp%24#0 to l-stack (copy)' -debug: Replaced main_else_body@22.ops[5]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' -debug: Inserted main_if_body@23.ops[7]: 'store tmp%27#0 to l-stack (copy)' -debug: Replaced main_if_body@23.ops[9]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' -debug: Inserted main_if_body@23.ops[3]: 'store tmp%26#0 to l-stack (copy)' -debug: Replaced main_if_body@23.ops[6]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' -debug: Inserted main_if_body@23.ops[1]: 'store tmp%25#0 to l-stack (copy)' -debug: Replaced main_if_body@23.ops[6]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' -debug: Found 13 edge set/s for examples.local_state.local_state_contract.LocalStateContract.approval_program +debug: Inserted main_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced main_block@0.ops[3]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[1]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[3]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[13]: 'store tmp%5#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[15]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[9]: 'store is_equal%4#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[12]: 'load is_equal%4#0' with 'load is_equal%4#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[4]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[7]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[6]: 'store contains%3#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[13]: 'load contains%3#0' with 'load contains%3#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@4.ops[1]: 'store tmp%6#0 to l-stack (copy)' +debug: Replaced main_after_if_else@4.ops[3]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@6.ops[3]: 'store tmp%8#0 to l-stack (copy)' +debug: Replaced main_after_if_else@6.ops[5]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@6.ops[8]: 'store tmp%9#0 to l-stack (copy)' +debug: Replaced main_after_if_else@6.ops[10]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' +debug: Inserted main_if_body@7.ops[3]: 'store tmp%10#0 to l-stack (copy)' +debug: Replaced main_if_body@7.ops[5]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' +debug: Inserted main_if_body@8.ops[1]: 'store tmp%11#0 to l-stack (copy)' +debug: Replaced main_if_body@8.ops[3]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' +debug: Inserted main_if_body@8.ops[5]: 'store tmp%12#0 to l-stack (copy)' +debug: Replaced main_if_body@8.ops[7]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' +debug: Inserted main_else_body@9.ops[3]: 'store tmp%13#0 to l-stack (copy)' +debug: Replaced main_else_body@9.ops[5]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' +debug: Inserted main_if_body@10.ops[1]: 'store tmp%14#0 to l-stack (copy)' +debug: Replaced main_if_body@10.ops[3]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' +debug: Inserted main_if_body@10.ops[5]: 'store tmp%15#0 to l-stack (copy)' +debug: Replaced main_if_body@10.ops[7]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' +debug: Inserted main_else_body@11.ops[3]: 'store tmp%16#0 to l-stack (copy)' +debug: Replaced main_else_body@11.ops[5]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' +debug: Inserted main_if_body@12.ops[1]: 'store tmp%17#0 to l-stack (copy)' +debug: Replaced main_if_body@12.ops[3]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' +debug: Inserted main_else_body@17.ops[1]: 'store tmp%18#0 to l-stack (copy)' +debug: Replaced main_else_body@17.ops[3]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' +debug: Inserted main_else_body@17.ops[6]: 'store tmp%19#0 to l-stack (copy)' +debug: Replaced main_else_body@17.ops[8]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' +debug: Inserted main_if_body@18.ops[3]: 'store tmp%20#0 to l-stack (copy)' +debug: Replaced main_if_body@18.ops[5]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' +debug: Inserted main_if_body@19.ops[3]: 'store tmp%22#0 to l-stack (copy)' +debug: Replaced main_if_body@19.ops[6]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' +debug: Inserted main_if_body@19.ops[1]: 'store tmp%21#0 to l-stack (copy)' +debug: Replaced main_if_body@19.ops[6]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' +debug: Inserted main_else_body@20.ops[3]: 'store tmp%23#0 to l-stack (copy)' +debug: Replaced main_else_body@20.ops[5]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' +debug: Inserted main_if_body@21.ops[7]: 'store tmp%26#0 to l-stack (copy)' +debug: Replaced main_if_body@21.ops[9]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' +debug: Inserted main_if_body@21.ops[3]: 'store tmp%25#0 to l-stack (copy)' +debug: Replaced main_if_body@21.ops[6]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' +debug: Inserted main_if_body@21.ops[1]: 'store tmp%24#0 to l-stack (copy)' +debug: Replaced main_if_body@21.ops[6]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' +debug: Found 12 edge set/s for examples.local_state.local_state_contract.LocalStateContract.approval_program debug: examples.local_state.local_state_contract.LocalStateContract.approval_program f-stack entry: ['method#0'] debug: examples.local_state.local_state_contract.LocalStateContract.approval_program f-stack on first store: [] debug: Inserted get_guaranteed_data_block@0.ops[4]: 'store app_local_get_ex_did_exist%1#0 to l-stack (copy)' @@ -846,15 +794,15 @@ debug: Optimizer: Copy Propagation debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops -debug: simplified branch on !tmp%2#0 by swapping zero and non-zero targets -debug: simplified terminator of block@2: // entrypoint_L15 from goto tmp%2#0 ? block@3 : block@4 to goto tmp%1#0 ? block@4 : block@3 +debug: simplified branch on !tmp%1#0 by swapping zero and non-zero targets +debug: simplified terminator of block@0: // L18 from goto tmp%1#0 ? block@1 : block@2 to goto tmp%0#0 ? block@2 : block@1 debug: Optimizer: Remove Linear Jump -debug: Replaced predecessor block@16: // after_if_else_L33 with block@14: // if_body_L33 in block@17: // after_if_else_L31 -debug: Merged linear block@16: // after_if_else_L33 into block@14: // if_body_L33 -debug: Replaced predecessor block@25: // after_if_else_L42 with block@23: // if_body_L42 in block@26: // after_if_else_L40 -debug: Merged linear block@25: // after_if_else_L42 into block@23: // if_body_L42 +debug: Replaced predecessor block@14: // after_if_else_L33 with block@12: // if_body_L33 in block@15: // after_if_else_L31 +debug: Merged linear block@14: // after_if_else_L33 into block@12: // if_body_L33 +debug: Replaced predecessor block@23: // after_if_else_L42 with block@21: // if_body_L42 in block@24: // after_if_else_L40 +debug: Merged linear block@23: // after_if_else_L42 into block@21: // if_body_L42 debug: Optimizer: Remove Empty Blocks -debug: Removed empty block: block@17: // after_if_else_L31 +debug: Removed empty block: block@15: // after_if_else_L31 debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data @@ -921,18 +869,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__ -debug: Splitting parallel copies prior to optimization -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification @@ -953,7 +889,7 @@ debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables -debug: Removing unused variable tmp%2#0 +debug: Removing unused variable tmp%1#0 debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks @@ -1014,17 +950,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__ -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer @@ -1104,17 +1029,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.__init__ -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer @@ -1133,7 +1047,6 @@ debug: Removing Phis from examples.local_state.local_state_with_offsets.LocalSta debug: Removing Phis from examples.local_state.local_state_with_offsets.LocalStateContract.delete_data debug: Removing Phis from examples.local_state.local_state_with_offsets.LocalStateContract.set_data debug: Removing Phis from examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default -debug: Removing Phis from examples.local_state.local_state_with_offsets.LocalStateContract.__init__ debug: Removing Phis from examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.approval_program using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -1147,8 +1060,6 @@ debug: Coalescing local variables in examples.local_state.local_state_with_offse debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s -debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.__init__ using strategy RootOperandGrouping -debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Sequentializing parallel copies in examples.local_state.local_state_with_offsets.LocalStateContract.approval_program @@ -1157,59 +1068,56 @@ debug: Sequentializing parallel copies in examples.local_state.local_state_with_ debug: Sequentializing parallel copies in examples.local_state.local_state_with_offsets.LocalStateContract.delete_data debug: Sequentializing parallel copies in examples.local_state.local_state_with_offsets.LocalStateContract.set_data debug: Sequentializing parallel copies in examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default -debug: Sequentializing parallel copies in examples.local_state.local_state_with_offsets.LocalStateContract.__init__ debug: Sequentializing parallel copies in examples.local_state.local_state_with_offsets.LocalStateContract.clear_state_program debug: Performing post-SSA optimizations debug: Output IR to local_state/out/LocalStateWithOffsets.destructured.ir -debug: Inserted main_block@0.ops[1]: 'store app_id%0#0 to l-stack (copy)' -debug: Replaced main_block@0.ops[3]: 'load app_id%0#0' with 'load app_id%0#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[1]: 'store tmp%1#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[3]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[1]: 'store tmp%3#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[3]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[13]: 'store tmp%6#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[15]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[9]: 'store is_equal%5#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[12]: 'load is_equal%5#0' with 'load is_equal%5#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[4]: 'store tmp%3#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[7]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@4.ops[6]: 'store contains%4#0 to l-stack (copy)' -debug: Replaced main_after_if_else@4.ops[13]: 'load contains%4#0' with 'load contains%4#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@6.ops[1]: 'store tmp%7#0 to l-stack (copy)' -debug: Replaced main_after_if_else@6.ops[3]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@6.ops[6]: 'store tmp%8#0 to l-stack (copy)' -debug: Replaced main_after_if_else@6.ops[8]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@8.ops[1]: 'store tmp%9#0 to l-stack (copy)' -debug: Replaced main_after_if_else@8.ops[3]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@8.ops[9]: 'store tmp%10#0 to l-stack (copy)' -debug: Replaced main_after_if_else@8.ops[11]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted main_after_if_else@8.ops[14]: 'store tmp%11#0 to l-stack (copy)' -debug: Replaced main_after_if_else@8.ops[16]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' -debug: Inserted main_if_body@9.ops[3]: 'store tmp%12#0 to l-stack (copy)' -debug: Replaced main_if_body@9.ops[5]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' -debug: Inserted main_if_body@10.ops[2]: 'store tmp%13#0 to l-stack (copy)' -debug: Replaced main_if_body@10.ops[4]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' -debug: Inserted main_else_body@11.ops[3]: 'store tmp%14#0 to l-stack (copy)' -debug: Replaced main_else_body@11.ops[5]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' -debug: Inserted main_if_body@12.ops[2]: 'store tmp%15#0 to l-stack (copy)' -debug: Replaced main_if_body@12.ops[4]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' -debug: Inserted main_else_body@13.ops[3]: 'store tmp%16#0 to l-stack (copy)' -debug: Replaced main_else_body@13.ops[5]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' -debug: Inserted main_else_body@19.ops[1]: 'store tmp%17#0 to l-stack (copy)' -debug: Replaced main_else_body@19.ops[3]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' -debug: Inserted main_else_body@19.ops[6]: 'store tmp%18#0 to l-stack (copy)' -debug: Replaced main_else_body@19.ops[8]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' -debug: Inserted main_if_body@20.ops[3]: 'store tmp%19#0 to l-stack (copy)' -debug: Replaced main_if_body@20.ops[5]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' -debug: Inserted main_if_body@21.ops[1]: 'store tmp%20#0 to l-stack (copy)' -debug: Replaced main_if_body@21.ops[4]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' -debug: Inserted main_else_body@22.ops[3]: 'store tmp%21#0 to l-stack (copy)' -debug: Replaced main_else_body@22.ops[5]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' -debug: Inserted main_if_body@23.ops[5]: 'store tmp%23#0 to l-stack (copy)' -debug: Replaced main_if_body@23.ops[7]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' -debug: Inserted main_if_body@23.ops[1]: 'store tmp%22#0 to l-stack (copy)' -debug: Replaced main_if_body@23.ops[4]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' -debug: Found 13 edge set/s for examples.local_state.local_state_with_offsets.LocalStateContract.approval_program +debug: Inserted main_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced main_block@0.ops[3]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[1]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[3]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[13]: 'store tmp%5#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[15]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[9]: 'store is_equal%4#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[12]: 'load is_equal%4#0' with 'load is_equal%4#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[4]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[7]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@2.ops[6]: 'store contains%3#0 to l-stack (copy)' +debug: Replaced main_after_if_else@2.ops[13]: 'load contains%3#0' with 'load contains%3#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@4.ops[1]: 'store tmp%6#0 to l-stack (copy)' +debug: Replaced main_after_if_else@4.ops[3]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@4.ops[6]: 'store tmp%7#0 to l-stack (copy)' +debug: Replaced main_after_if_else@4.ops[8]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@6.ops[1]: 'store tmp%8#0 to l-stack (copy)' +debug: Replaced main_after_if_else@6.ops[3]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@6.ops[9]: 'store tmp%9#0 to l-stack (copy)' +debug: Replaced main_after_if_else@6.ops[11]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' +debug: Inserted main_after_if_else@6.ops[14]: 'store tmp%10#0 to l-stack (copy)' +debug: Replaced main_after_if_else@6.ops[16]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' +debug: Inserted main_if_body@7.ops[3]: 'store tmp%11#0 to l-stack (copy)' +debug: Replaced main_if_body@7.ops[5]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' +debug: Inserted main_if_body@8.ops[2]: 'store tmp%12#0 to l-stack (copy)' +debug: Replaced main_if_body@8.ops[4]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' +debug: Inserted main_else_body@9.ops[3]: 'store tmp%13#0 to l-stack (copy)' +debug: Replaced main_else_body@9.ops[5]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' +debug: Inserted main_if_body@10.ops[2]: 'store tmp%14#0 to l-stack (copy)' +debug: Replaced main_if_body@10.ops[4]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' +debug: Inserted main_else_body@11.ops[3]: 'store tmp%15#0 to l-stack (copy)' +debug: Replaced main_else_body@11.ops[5]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' +debug: Inserted main_else_body@17.ops[1]: 'store tmp%16#0 to l-stack (copy)' +debug: Replaced main_else_body@17.ops[3]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' +debug: Inserted main_else_body@17.ops[6]: 'store tmp%17#0 to l-stack (copy)' +debug: Replaced main_else_body@17.ops[8]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' +debug: Inserted main_if_body@18.ops[3]: 'store tmp%18#0 to l-stack (copy)' +debug: Replaced main_if_body@18.ops[5]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' +debug: Inserted main_if_body@19.ops[1]: 'store tmp%19#0 to l-stack (copy)' +debug: Replaced main_if_body@19.ops[4]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' +debug: Inserted main_else_body@20.ops[3]: 'store tmp%20#0 to l-stack (copy)' +debug: Replaced main_else_body@20.ops[5]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' +debug: Inserted main_if_body@21.ops[5]: 'store tmp%22#0 to l-stack (copy)' +debug: Replaced main_if_body@21.ops[7]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' +debug: Inserted main_if_body@21.ops[1]: 'store tmp%21#0 to l-stack (copy)' +debug: Replaced main_if_body@21.ops[4]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' +debug: Found 12 edge set/s for examples.local_state.local_state_with_offsets.LocalStateContract.approval_program debug: examples.local_state.local_state_with_offsets.LocalStateContract.approval_program f-stack entry: ['method#0', 'offset#0'] debug: examples.local_state.local_state_with_offsets.LocalStateContract.approval_program f-stack on first store: [] debug: Inserted get_guaranteed_data_block@0.ops[4]: 'store app_local_get_ex_did_exist%1#0 to l-stack (copy)' diff --git a/examples/sizes.txt b/examples/sizes.txt index b1d19ad36a..1a16a40a7b 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -30,7 +30,7 @@ contains 159 160 160 control_op_simplification 48 52 46 edverify/Verify 43 37 37 enumeration/Enumeration 551 501 501 -everything 479 460 460 +everything 467 448 448 global_state/AppState 305 305 305 hello_world/HelloWorld 23 22 22 hello_world_arc4/HelloWorld 110 89 89 @@ -40,8 +40,8 @@ inner_transactions/itxn_loop 203 260 260 intrinsics/ImmediateVariants 164 162 162 koopman 16 9 9 less_simple 171 148 148 -local_state/LocalState 317 312 300 -local_state/LocalStateWithOffsets 330 323 311 +local_state/LocalState 305 300 288 +local_state/LocalStateWithOffsets 318 311 299 log 172 164 164 match 490 455 455 nested_loops/Nested 243 201 201 diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py index bf22e36f42..6748a5b3a3 100644 --- a/src/puya/ir/main.py +++ b/src/puya/ir/main.py @@ -285,6 +285,8 @@ def fold_state_and_special_methods( maybe_arc4_method_refs.setdefault(cm.name, (cm, cm.abimethod_config)) else: maybe_arc4_method_refs.setdefault(cm.name, None) + if not (c.init and c.init.body.body): + result.init = None arc4_method_refs = dict(filter(None, maybe_arc4_method_refs.values())) if arc4_method_refs: if result.approval_program: diff --git a/test_cases/everything/out/MyContract.approval.mir b/test_cases/everything/out/MyContract.approval.mir index 5e808e5c70..9b6c07cf72 100644 --- a/test_cases/everything/out/MyContract.approval.mir +++ b/test_cases/everything/out/MyContract.approval.mir @@ -4,135 +4,124 @@ // test_cases.everything.contract.Everything.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} - // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 - bnz main_entrypoint@2 // - // Implicit fall through to main_on_create@1 // - -main_on_create@1: - callsub __init__ // - // Implicit fall through to main_entrypoint@2 // - -main_entrypoint@2: txna ApplicationArgs 0 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "create()void" // tmp%1#0,method<"create()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "register(string)void" // tmp%1#0,method<"create()void">,method<"register(string)void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "say_hello()string" // tmp%1#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "calculate(uint64,uint64)uint64" // tmp%1#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "close_out()void" // tmp%1#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - uncover 5 // load tmp%1#0 from l-stack (no copy) method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void">,tmp%1#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - match main_create_route@3 main_register_route@4 main_say_hello_route@5 main_calculate_route@6 main_close_out_route@7 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "create()void" // tmp%0#0,method<"create()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "register(string)void" // tmp%0#0,method<"create()void">,method<"register(string)void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "say_hello()string" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "calculate(uint64,uint64)uint64" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "close_out()void" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + uncover 5 // load tmp%0#0 from l-stack (no copy) method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void">,tmp%0#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + match main_create_route@1 main_register_route@2 main_say_hello_route@3 main_calculate_route@4 main_close_out_route@5 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 err // reject transaction // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 -main_create_route@3: +main_create_route@1: txn OnCompletion // {txn} abimethod(create=True) everything/contract.py:41 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 abimethod(create=True) everything/contract.py:41 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 abimethod(create=True) everything/contract.py:41 + ! // {!} abimethod(create=True) everything/contract.py:41 // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 abimethod(create=True) everything/contract.py:41 // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 abimethod(create=True) everything/contract.py:41 - ! // {!} abimethod(create=True) everything/contract.py:41 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 assert // OnCompletion is NoOp // abimethod(create=True) everything/contract.py:41 txn ApplicationID // {txn} abimethod(create=True) everything/contract.py:41 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 + ! // {!} abimethod(create=True) everything/contract.py:41 // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 abimethod(create=True) everything/contract.py:41 // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 abimethod(create=True) everything/contract.py:41 - ! // {!} abimethod(create=True) everything/contract.py:41 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 abimethod(create=True) everything/contract.py:41 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 abimethod(create=True) everything/contract.py:41 assert // is creating // abimethod(create=True) everything/contract.py:41 callsub create // abimethod(create=True) everything/contract.py:41 int 1 // 1 abimethod(create=True) everything/contract.py:41 return // abimethod(create=True) everything/contract.py:41 -main_register_route@4: +main_register_route@2: txn OnCompletion // {txn} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - int 1 // tmp%6#0,1 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - swap // load tmp%6#0 from l-stack (no copy) 1,tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + int 1 // tmp%5#0,1 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + swap // load tmp%5#0 from l-stack (no copy) 1,tmp%5#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 shl // {shl} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + int 3 // tmp%6#0,3 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + & // {&} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - int 3 // tmp%7#0,3 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - & // {&} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 assert // OnCompletion is one of NoOp, OptIn // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 txn ApplicationID // {txn} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 assert // is not creating // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 txna ApplicationArgs 1 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 callsub register // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 int 1 // 1 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 return // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 -main_say_hello_route@5: +main_say_hello_route@3: txn OnCompletion // {txn} abimethod everything/contract.py:56 + // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 abimethod everything/contract.py:56 + // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 abimethod everything/contract.py:56 + ! // {!} abimethod everything/contract.py:56 // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 abimethod everything/contract.py:56 // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 abimethod everything/contract.py:56 - ! // {!} abimethod everything/contract.py:56 - // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 - // virtual: load tmp%12#0 from l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 assert // OnCompletion is NoOp // abimethod everything/contract.py:56 txn ApplicationID // {txn} abimethod everything/contract.py:56 - // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 abimethod everything/contract.py:56 - // virtual: load tmp%13#0 from l-stack (no copy) tmp%13#0 abimethod everything/contract.py:56 + // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 + // virtual: load tmp%12#0 from l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 assert // is not creating // abimethod everything/contract.py:56 callsub say_hello // {say_hello} abimethod everything/contract.py:56 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 abimethod everything/contract.py:56 - byte 0x151f7c75 // tmp%14#0,0x151f7c75 abimethod everything/contract.py:56 - swap // load tmp%14#0 from l-stack (no copy) 0x151f7c75,tmp%14#0 abimethod everything/contract.py:56 + // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 abimethod everything/contract.py:56 + byte 0x151f7c75 // tmp%13#0,0x151f7c75 abimethod everything/contract.py:56 + swap // load tmp%13#0 from l-stack (no copy) 0x151f7c75,tmp%13#0 abimethod everything/contract.py:56 concat // {concat} abimethod everything/contract.py:56 - // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 abimethod everything/contract.py:56 - // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 abimethod everything/contract.py:56 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 abimethod everything/contract.py:56 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 abimethod everything/contract.py:56 log // abimethod everything/contract.py:56 int 1 // 1 abimethod everything/contract.py:56 return // abimethod everything/contract.py:56 -main_calculate_route@6: +main_calculate_route@4: txn OnCompletion // {txn} abimethod everything/contract.py:64 + // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 abimethod everything/contract.py:64 + // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 abimethod everything/contract.py:64 + ! // {!} abimethod everything/contract.py:64 // virtual: store tmp%16#0 to l-stack (no copy) tmp%16#0 abimethod everything/contract.py:64 // virtual: load tmp%16#0 from l-stack (no copy) tmp%16#0 abimethod everything/contract.py:64 - ! // {!} abimethod everything/contract.py:64 - // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 - // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 assert // OnCompletion is NoOp // abimethod everything/contract.py:64 txn ApplicationID // {txn} abimethod everything/contract.py:64 - // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 abimethod everything/contract.py:64 - // virtual: load tmp%18#0 from l-stack (no copy) tmp%18#0 abimethod everything/contract.py:64 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 + // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 assert // is not creating // abimethod everything/contract.py:64 txna ApplicationArgs 1 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%19#0 to l-stack (no copy) tmp%19#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - txna ApplicationArgs 2 // tmp%19#0,{txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%20#0 to l-stack (no copy) tmp%19#0,tmp%20#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: load tmp%19#0 from l-stack (no copy) tmp%20#0,tmp%19#0 abimethod everything/contract.py:64 - // virtual: load tmp%20#0 from l-stack (no copy) tmp%19#0,tmp%20#0 abimethod everything/contract.py:64 + // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + txna ApplicationArgs 2 // tmp%18#0,{txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: store tmp%19#0 to l-stack (no copy) tmp%18#0,tmp%19#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: load tmp%18#0 from l-stack (no copy) tmp%19#0,tmp%18#0 abimethod everything/contract.py:64 + // virtual: load tmp%19#0 from l-stack (no copy) tmp%18#0,tmp%19#0 abimethod everything/contract.py:64 callsub calculate // {calculate} abimethod everything/contract.py:64 - // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 abimethod everything/contract.py:64 - byte 0x151f7c75 // tmp%21#0,0x151f7c75 abimethod everything/contract.py:64 - swap // load tmp%21#0 from l-stack (no copy) 0x151f7c75,tmp%21#0 abimethod everything/contract.py:64 + // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 abimethod everything/contract.py:64 + byte 0x151f7c75 // tmp%20#0,0x151f7c75 abimethod everything/contract.py:64 + swap // load tmp%20#0 from l-stack (no copy) 0x151f7c75,tmp%20#0 abimethod everything/contract.py:64 concat // {concat} abimethod everything/contract.py:64 - // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 abimethod everything/contract.py:64 - // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 abimethod everything/contract.py:64 + // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 abimethod everything/contract.py:64 + // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 abimethod everything/contract.py:64 log // abimethod everything/contract.py:64 int 1 // 1 abimethod everything/contract.py:64 return // abimethod everything/contract.py:64 -main_close_out_route@7: +main_close_out_route@5: txn OnCompletion // {txn} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + int CloseOut // tmp%22#0,CloseOut abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + == // {==} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - int CloseOut // tmp%23#0,CloseOut abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - == // {==} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 assert // OnCompletion is CloseOut // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 txn ApplicationID // {txn} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 assert // is not creating // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 callsub close_out // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 int 1 // 1 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 @@ -411,11 +400,3 @@ positive_one_block@0: int 1 // 1 1 everything/contract.py:88 retsub // 1 return UInt64(1) everything/contract.py:88 - -// test_cases.everything.contract.Everything.__init__() -> void: -__init__: - proto 0 0 // def __init__(self) -> None: everything/contract.py:38 - -__init___block@0: - retsub // - diff --git a/test_cases/everything/out/MyContract.approval.teal b/test_cases/everything/out/MyContract.approval.teal index a10c131340..56e18a04a4 100644 --- a/test_cases/everything/out/MyContract.approval.teal +++ b/test_cases/everything/out/MyContract.approval.teal @@ -1,11 +1,6 @@ #pragma version 10 test_cases.everything.contract.Everything.approval_program: - txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ - -main_entrypoint@2: // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): method "create()void" @@ -14,10 +9,10 @@ main_entrypoint@2: method "calculate(uint64,uint64)uint64" method "close_out()void" txna ApplicationArgs 0 - match main_create_route@3 main_register_route@4 main_say_hello_route@5 main_calculate_route@6 main_close_out_route@7 + match main_create_route@1 main_register_route@2 main_say_hello_route@3 main_calculate_route@4 main_close_out_route@5 err // reject transaction -main_create_route@3: +main_create_route@1: // everything/contract.py:41 // @abimethod(create=True) txn OnCompletion @@ -30,7 +25,7 @@ main_create_route@3: int 1 return -main_register_route@4: +main_register_route@2: // everything/contract.py:47 // @abimethod(allow_actions=["NoOp", "OptIn"]) int 1 @@ -50,7 +45,7 @@ main_register_route@4: int 1 return -main_say_hello_route@5: +main_say_hello_route@3: // everything/contract.py:56 // @abimethod txn OnCompletion @@ -66,7 +61,7 @@ main_say_hello_route@5: int 1 return -main_calculate_route@6: +main_calculate_route@4: // everything/contract.py:64 // @abimethod txn OnCompletion @@ -88,7 +83,7 @@ main_calculate_route@6: int 1 return -main_close_out_route@7: +main_close_out_route@5: // everything/contract.py:69 // @abimethod(allow_actions=["CloseOut"]) txn OnCompletion @@ -355,11 +350,3 @@ positive_one: // return UInt64(1) int 1 retsub - - -// test_cases.everything.contract.Everything.__init__() -> void: -__init__: - // everything/contract.py:38 - // def __init__(self) -> None: - proto 0 0 - retsub diff --git a/test_cases/everything/out/MyContract.arc32.json b/test_cases/everything/out/MyContract.arc32.json index 295c0535f4..a426773249 100644 --- a/test_cases/everything/out/MyContract.arc32.json +++ b/test_cases/everything/out/MyContract.arc32.json @@ -28,7 +28,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIG1ldGhvZCAicmVnaXN0ZXIoc3RyaW5nKXZvaWQiCiAgICBtZXRob2QgInNheV9oZWxsbygpc3RyaW5nIgogICAgbWV0aG9kICJjYWxjdWxhdGUodWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBtZXRob2QgImNsb3NlX291dCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlX3JvdXRlQDMgbWFpbl9yZWdpc3Rlcl9yb3V0ZUA0IG1haW5fc2F5X2hlbGxvX3JvdXRlQDUgbWFpbl9jYWxjdWxhdGVfcm91dGVANiBtYWluX2Nsb3NlX291dF9yb3V0ZUA3CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0MQogICAgLy8gQGFiaW1ldGhvZChjcmVhdGU9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJfcm91dGVANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGludCAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIGludCAzCiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG9uZSBvZiBOb09wLCBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGNhbGxzdWIgcmVnaXN0ZXIKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fc2F5X2hlbGxvX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9jYWxjdWxhdGVfcm91dGVANjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgY2FsY3VsYXRlCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX291dF9yb3V0ZUA3OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiQ2xvc2VPdXQiXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludCBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgQ2xvc2VPdXQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlX291dAogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNyZWF0ZSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPVRydWUpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnJlbWVtYmVyX2NyZWF0b3IoKQogICAgY2FsbHN1YiByZW1lbWJlcl9jcmVhdG9yCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzZWxmLmNvdW50ZXIgPSBVSW50NjQoWkVSTykKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9jaGVja19iYW5fbGlzdCgpIC0+IHZvaWQ6Cl9jaGVja19iYW5fbGlzdDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jhbl9saXN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBvcC5UeG4uc2VuZGVyICE9IGdldF9iYW5uZWQoKSwgIllvdSBhcmUgYmFubmVkLCBnb29kYnllIgogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRfYmFubmVkCiAgICAhPQogICAgYXNzZXJ0IC8vIFlvdSBhcmUgYmFubmVkLCBnb29kYnllCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuZ2V0X2Jhbm5lZCgpIC0+IGJ5dGVzOgpnZXRfYmFubmVkOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyMy0yNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmFubmVkKCkgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNQogICAgLy8gYWRkciA9IEFjY291bnQoQkFOTkVEKQogICAgYWRkciBWQ01KS1dPWTVQNVA3U0tNWkZGT0NFUk9QSkNaT1RJSk1OSVlOVUNLSDdMUk80NUpNSlA2VVlCSUpBCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyByZXR1cm4gYWRkcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlCYXNlLnJlbWVtYmVyX2NyZWF0b3IoKSAtPiB2b2lkOgpyZW1lbWJlcl9jcmVhdG9yOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjctOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiByZW1lbWJlcl9jcmVhdG9yKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weTo5CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBieXRlICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnJlZ2lzdGVyKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDctNDgKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIC8vIGRlZiByZWdpc3RlcihzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBpZiBvcC5UeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk9wdEluOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50IE9wdEluCiAgICA9PQogICAgYnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBzZW5kZXJfbmFtZSwgc2VuZGVyX25hbWVfZXhpc3RlZCA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnQgMAogICAgaW50IDAKICAgIGJ5dGUgIm5hbWUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTIKICAgIC8vIGlmIG5vdCBzZW5kZXJfbmFtZV9leGlzdGVkOgogICAgYm56IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5jb3VudGVyICs9IG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgICMgaGFzIGZ1bGwgRnVuY0RlZgogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5CiAgICArCiAgICBieXRlICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYubmFtZVswXSA9IG5hbWUKICAgIGludCAwCiAgICBieXRlICJuYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5tdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpIC0+IHVpbnQ2NDoKbXVsdGlwbGljYXRpdmVfaWRlbnRpdHk6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTgtMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToyMAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50IDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnNheV9oZWxsbygpIC0+IGJ5dGVzOgpzYXlfaGVsbG86CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgc2F5X2hlbGxvKHNlbGYpIC0+IFN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTkKICAgIC8vIG5hbWUsIGV4aXN0cyA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnQgMAogICAgaW50IDAKICAgIGJ5dGUgIm5hbWUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBpZiBub3QgZXhpc3RzOgogICAgYm56IHNheV9oZWxsb19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjEKICAgIC8vIHJldHVybiBTdHJpbmcoIkhvd2R5IHN0cmFuZ2VyISIpCiAgICBieXRlICJceDAwXHgwZkhvd2R5IHN0cmFuZ2VyISIKICAgIHN3YXAKICAgIHJldHN1YgoKc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lICsgIiEiCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgY29uY2F0CiAgICBleHRyYWN0IDIgMAogICAgYnl0ZSAiISIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpjYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0LTY1CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzRfVUludDY0LCBiOiBhcmM0X1VJbnQ2NCkgLT4gYXJjNF9VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGMgPSBzdXBlcigpLmNhbGN1bGF0ZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NwogICAgLy8gcmV0dXJuIGFyYzRfVUludDY0KGMuZGVjb2RlKCkgKiBiLmRlY29kZSgpKQogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAqCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6Ck15TWlkZGxlQmFzZS5jYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTMtMTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzQuVUludDY0LCBiOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToxNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGEuZGVjb2RlKCkgKyBiLmRlY29kZSgpKQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICsKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNsb3NlX291dCgpIC0+IHZvaWQ6CmNsb3NlX291dDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICAvLyBkZWYgY2xvc2Vfb3V0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX3JlbW92ZV9zZW5kZXIoKSAtPiB2b2lkOgpfcmVtb3ZlX3NlbmRlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3JlbW92ZV9zZW5kZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5jb3VudGVyIC09IHBvc2l0aXZlX29uZSgpCiAgICBpbnQgMAogICAgYnl0ZSAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgY291bnRlciBleGlzdHMKICAgIGNhbGxzdWIgcG9zaXRpdmVfb25lCiAgICAtCiAgICBieXRlICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5wb3NpdGl2ZV9vbmUoKSAtPiB1aW50NjQ6CnBvc2l0aXZlX29uZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODYtODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcG9zaXRpdmVfb25lKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gVUludDY0KDEpCiAgICBpbnQgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozNwogICAgLy8gY2xhc3MgRXZlcnl0aGluZyhBUkM0Q29udHJhY3QsIE15TWlkZGxlQmFzZSwgbmFtZT0iTXlDb250cmFjdCIpOgogICAgbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBtZXRob2QgInJlZ2lzdGVyKHN0cmluZyl2b2lkIgogICAgbWV0aG9kICJzYXlfaGVsbG8oKXN0cmluZyIKICAgIG1ldGhvZCAiY2FsY3VsYXRlKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgbWV0aG9kICJjbG9zZV9vdXQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZV9yb3V0ZUAxIG1haW5fcmVnaXN0ZXJfcm91dGVAMiBtYWluX3NheV9oZWxsb19yb3V0ZUAzIG1haW5fY2FsY3VsYXRlX3JvdXRlQDQgbWFpbl9jbG9zZV9vdXRfcm91dGVANQogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl9jcmVhdGVfcm91dGVAMToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3JlZ2lzdGVyX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICBpbnQgMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc2hsCiAgICBpbnQgMwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBvbmUgb2YgTm9PcCwgT3B0SW4KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICBjYWxsc3ViIHJlZ2lzdGVyCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3NheV9oZWxsb19yb3V0ZUAzOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1NgogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzYXlfaGVsbG8KICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2FsY3VsYXRlX3JvdXRlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGN1bGF0ZQogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9vdXRfcm91dGVANToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnQgQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIENsb3NlT3V0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBjbG9zZV9vdXQKICAgIGludCAxCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jcmVhdGUoKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT1UcnVlKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBzZWxmLl9jaGVja19iYW5fbGlzdCgpCiAgICBjYWxsc3ViIF9jaGVja19iYW5fbGlzdAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NAogICAgLy8gc2VsZi5yZW1lbWJlcl9jcmVhdG9yKCkKICAgIGNhbGxzdWIgcmVtZW1iZXJfY3JlYXRvcgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5jb3VudGVyID0gVUludDY0KFpFUk8pCiAgICBieXRlICJjb3VudGVyIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5fY2hlY2tfYmFuX2xpc3QoKSAtPiB2b2lkOgpfY2hlY2tfYmFuX2xpc3Q6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojc3LTc4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19iYW5fbGlzdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBhc3NlcnQgb3AuVHhuLnNlbmRlciAhPSBnZXRfYmFubmVkKCksICJZb3UgYXJlIGJhbm5lZCwgZ29vZGJ5ZSIKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgZ2V0X2Jhbm5lZAogICAgIT0KICAgIGFzc2VydCAvLyBZb3UgYXJlIGJhbm5lZCwgZ29vZGJ5ZQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LmdldF9iYW5uZWQoKSAtPiBieXRlczoKZ2V0X2Jhbm5lZDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MjMtMjQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2Jhbm5lZCgpIC0+IEFjY291bnQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIGFkZHIgPSBBY2NvdW50KEJBTk5FRCkKICAgIGFkZHIgVkNNSktXT1k1UDVQN1NLTVpGRk9DRVJPUEpDWk9USUpNTklZTlVDS0g3TFJPNDVKTUpQNlVZQklKQQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNgogICAgLy8gcmV0dXJuIGFkZHIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15QmFzZS5yZW1lbWJlcl9jcmVhdG9yKCkgLT4gdm9pZDoKcmVtZW1iZXJfY3JlYXRvcjoKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weTo3LTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcmVtZW1iZXJfY3JlYXRvcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6OQogICAgLy8gc2VsZi5jcmVhdG9yID0gb3AuVHhuLnNlbmRlcgogICAgYnl0ZSAiY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5yZWdpc3RlcihuYW1lOiBieXRlcykgLT4gdm9pZDoKcmVnaXN0ZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3LTQ4CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgcmVnaXN0ZXIoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBzZWxmLl9jaGVja19iYW5fbGlzdCgpCiAgICBjYWxsc3ViIF9jaGVja19iYW5fbGlzdAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MAogICAgLy8gaWYgb3AuVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludCBPcHRJbgogICAgPT0KICAgIGJ6IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MQogICAgLy8gc2VuZGVyX25hbWUsIHNlbmRlcl9uYW1lX2V4aXN0ZWQgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50IDAKICAgIGludCAwCiAgICBieXRlICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBpZiBub3Qgc2VuZGVyX25hbWVfZXhpc3RlZDoKICAgIGJueiByZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIHNlbGYuY291bnRlciArPSBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpICAjIGhhcyBmdWxsIEZ1bmNEZWYKICAgIGludCAwCiAgICBieXRlICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBjb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eQogICAgKwogICAgYnl0ZSAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBzZWxmLm5hbWVbMF0gPSBuYW1lCiAgICBpbnQgMAogICAgYnl0ZSAibmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UubXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiB1aW50NjQ6Cm11bHRpcGxpY2F0aXZlX2lkZW50aXR5OgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MjAKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludCAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5zYXlfaGVsbG8oKSAtPiBieXRlczoKc2F5X2hlbGxvOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIHNheV9oZWxsbyhzZWxmKSAtPiBTdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBuYW1lLCBleGlzdHMgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50IDAKICAgIGludCAwCiAgICBieXRlICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MAogICAgLy8gaWYgbm90IGV4aXN0czoKICAgIGJueiBzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gU3RyaW5nKCJIb3dkeSBzdHJhbmdlciEiKQogICAgYnl0ZSAiXHgwMFx4MGZIb3dkeSBzdHJhbmdlciEiCiAgICBzd2FwCiAgICByZXRzdWIKCnNheV9oZWxsb19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyByZXR1cm4gIkhlbGxvLCAiICsgbmFtZSArICIhIgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlICJIZWxsbywgIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGUgIiEiCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jYWxjdWxhdGUoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKY2FsY3VsYXRlOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NC02NQogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIGNhbGN1bGF0ZShzZWxmLCBhOiBhcmM0X1VJbnQ2NCwgYjogYXJjNF9VSW50NjQpIC0+IGFyYzRfVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBjID0gc3VwZXIoKS5jYWxjdWxhdGUoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIE15TWlkZGxlQmFzZS5jYWxjdWxhdGUKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjcKICAgIC8vIHJldHVybiBhcmM0X1VJbnQ2NChjLmRlY29kZSgpICogYi5kZWNvZGUoKSkKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgKgogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpNeU1pZGRsZUJhc2UuY2FsY3VsYXRlOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjEzLTE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNhbGN1bGF0ZShzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhLmRlY29kZSgpICsgYi5kZWNvZGUoKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICArCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbG9zZV9vdXQoKSAtPiB2b2lkOgpjbG9zZV9vdXQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5LTcwCiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgLy8gZGVmIGNsb3NlX291dChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBzZWxmLl9yZW1vdmVfc2VuZGVyKCkKICAgIGNhbGxzdWIgX3JlbW92ZV9zZW5kZXIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIHBvc2l0aXZlX29uZQogICAgLQogICAgYnl0ZSAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QucG9zaXRpdmVfb25lKCkgLT4gdWludDY0Ogpwb3NpdGl2ZV9vbmU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBvc2l0aXZlX29uZSgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50IDEKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3NAogICAgLy8gc2VsZi5fcmVtb3ZlX3NlbmRlcigpCiAgICBjYWxsc3ViIF9yZW1vdmVfc2VuZGVyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50IDAKICAgIGJ5dGUgImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIHBvc2l0aXZlX29uZQogICAgLQogICAgYnl0ZSAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QucG9zaXRpdmVfb25lKCkgLT4gdWludDY0Ogpwb3NpdGl2ZV9vbmU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBvc2l0aXZlX29uZSgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50IDEKICAgIHJldHN1Ygo=" }, "state": { diff --git a/test_cases/everything/out/MyContract.destructured.ir b/test_cases/everything/out/MyContract.destructured.ir index 6745414543..b1fb17f43c 100644 --- a/test_cases/everything/out/MyContract.destructured.ir +++ b/test_cases/everything/out/MyContract.destructured.ir @@ -2,61 +2,55 @@ contract test_cases.everything.contract.Everything: program approval: subroutine test_cases.everything.contract.Everything.approval_program() -> uint64: block@0: // L37 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L38 - test_cases.everything.contract.Everything.__init__() - goto block@2 - block@2: // entrypoint_L38 - let tmp%1#0: bytes = (txna ApplicationArgs 0) - switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => fail // reject transaction} - block@3: // create_route_L41 - let tmp%2#0: uint64 = (txn OnCompletion) - let tmp%3#0: uint64 = (! tmp%2#0) - (assert tmp%3#0) // OnCompletion is NoOp - let tmp%4#0: uint64 = (txn ApplicationID) - let tmp%5#0: uint64 = (! tmp%4#0) - (assert tmp%5#0) // is creating + let tmp%0#0: bytes = (txna ApplicationArgs 0) + switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => fail // reject transaction} + block@1: // create_route_L41 + let tmp%1#0: uint64 = (txn OnCompletion) + let tmp%2#0: uint64 = (! tmp%1#0) + (assert tmp%2#0) // OnCompletion is NoOp + let tmp%3#0: uint64 = (txn ApplicationID) + let tmp%4#0: uint64 = (! tmp%3#0) + (assert tmp%4#0) // is creating test_cases.everything.contract.Everything.create() return 1u - block@4: // register_route_L47 - let tmp%6#0: uint64 = (txn OnCompletion) - let tmp%7#0: uint64 = (shl 1u tmp%6#0) - let tmp%8#0: uint64 = (& tmp%7#0 3u) - (assert tmp%8#0) // OnCompletion is one of NoOp, OptIn - let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating - let tmp%10#0: bytes = (txna ApplicationArgs 1) - test_cases.everything.contract.Everything.register(tmp%10#0) + block@2: // register_route_L47 + let tmp%5#0: uint64 = (txn OnCompletion) + let tmp%6#0: uint64 = (shl 1u tmp%5#0) + let tmp%7#0: uint64 = (& tmp%6#0 3u) + (assert tmp%7#0) // OnCompletion is one of NoOp, OptIn + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // is not creating + let tmp%9#0: bytes = (txna ApplicationArgs 1) + test_cases.everything.contract.Everything.register(tmp%9#0) return 1u - block@5: // say_hello_route_L56 - let tmp%11#0: uint64 = (txn OnCompletion) - let tmp%12#0: uint64 = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp - let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating - let tmp%14#0: bytes = test_cases.everything.contract.Everything.say_hello() - let tmp%15#0: bytes = (concat 0x151f7c75 tmp%14#0) - (log tmp%15#0) + block@3: // say_hello_route_L56 + let tmp%10#0: uint64 = (txn OnCompletion) + let tmp%11#0: uint64 = (! tmp%10#0) + (assert tmp%11#0) // OnCompletion is NoOp + let tmp%12#0: uint64 = (txn ApplicationID) + (assert tmp%12#0) // is not creating + let tmp%13#0: bytes = test_cases.everything.contract.Everything.say_hello() + let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) + (log tmp%14#0) return 1u - block@6: // calculate_route_L64 - let tmp%16#0: uint64 = (txn OnCompletion) - let tmp%17#0: uint64 = (! tmp%16#0) - (assert tmp%17#0) // OnCompletion is NoOp - let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating - let tmp%19#0: bytes = (txna ApplicationArgs 1) - let tmp%20#0: bytes = (txna ApplicationArgs 2) - let tmp%21#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%19#0, tmp%20#0) - let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) - (log tmp%22#0) + block@4: // calculate_route_L64 + let tmp%15#0: uint64 = (txn OnCompletion) + let tmp%16#0: uint64 = (! tmp%15#0) + (assert tmp%16#0) // OnCompletion is NoOp + let tmp%17#0: uint64 = (txn ApplicationID) + (assert tmp%17#0) // is not creating + let tmp%18#0: bytes = (txna ApplicationArgs 1) + let tmp%19#0: bytes = (txna ApplicationArgs 2) + let tmp%20#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%18#0, tmp%19#0) + let tmp%21#0: bytes = (concat 0x151f7c75 tmp%20#0) + (log tmp%21#0) return 1u - block@7: // close_out_route_L69 - let tmp%23#0: uint64 = (txn OnCompletion) - let tmp%24#0: uint64 = (== tmp%23#0 CloseOut) - (assert tmp%24#0) // OnCompletion is CloseOut - let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + block@5: // close_out_route_L69 + let tmp%22#0: uint64 = (txn OnCompletion) + let tmp%23#0: uint64 = (== tmp%22#0 CloseOut) + (assert tmp%23#0) // OnCompletion is CloseOut + let tmp%24#0: uint64 = (txn ApplicationID) + (assert tmp%24#0) // is not creating test_cases.everything.contract.Everything.close_out() return 1u @@ -165,10 +159,6 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.positive_one() -> uint64: block@0: // L86 return 1u - - subroutine test_cases.everything.contract.Everything.__init__() -> void: - block@0: // L38 - return program clear-state: subroutine test_cases.everything.contract.Everything.clear_state_program() -> uint64: diff --git a/test_cases/everything/out/MyContract.ssa.ir b/test_cases/everything/out/MyContract.ssa.ir index 77a54b3c26..7025976f85 100644 --- a/test_cases/everything/out/MyContract.ssa.ir +++ b/test_cases/everything/out/MyContract.ssa.ir @@ -2,66 +2,60 @@ contract test_cases.everything.contract.Everything: program approval: subroutine test_cases.everything.contract.Everything.approval_program() -> uint64: block@0: // L37 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L38 - test_cases.everything.contract.Everything.__init__() - goto block@2 - block@2: // entrypoint_L38 - let tmp%1#0: bytes = (txna ApplicationArgs 0) - switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => block@8} - block@3: // create_route_L41 - let tmp%2#0: uint64 = (txn OnCompletion) - let tmp%3#0: uint64 = (== tmp%2#0 NoOp) - (assert tmp%3#0) // OnCompletion is NoOp - let tmp%4#0: uint64 = (txn ApplicationID) - let tmp%5#0: uint64 = (! tmp%4#0) - (assert tmp%5#0) // is creating + let tmp%0#0: bytes = (txna ApplicationArgs 0) + switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => block@6} + block@1: // create_route_L41 + let tmp%1#0: uint64 = (txn OnCompletion) + let tmp%2#0: uint64 = (== tmp%1#0 NoOp) + (assert tmp%2#0) // OnCompletion is NoOp + let tmp%3#0: uint64 = (txn ApplicationID) + let tmp%4#0: uint64 = (! tmp%3#0) + (assert tmp%4#0) // is creating test_cases.everything.contract.Everything.create() return 1u - block@4: // register_route_L47 - let tmp%6#0: uint64 = (txn OnCompletion) - let tmp%7#0: uint64 = (shl 1u tmp%6#0) - let tmp%8#0: uint64 = (& tmp%7#0 3u) - (assert tmp%8#0) // OnCompletion is one of NoOp, OptIn - let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating - let tmp%10#0: bytes = (txna ApplicationArgs 1) - test_cases.everything.contract.Everything.register(tmp%10#0) + block@2: // register_route_L47 + let tmp%5#0: uint64 = (txn OnCompletion) + let tmp%6#0: uint64 = (shl 1u tmp%5#0) + let tmp%7#0: uint64 = (& tmp%6#0 3u) + (assert tmp%7#0) // OnCompletion is one of NoOp, OptIn + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // is not creating + let tmp%9#0: bytes = (txna ApplicationArgs 1) + test_cases.everything.contract.Everything.register(tmp%9#0) return 1u - block@5: // say_hello_route_L56 - let tmp%11#0: uint64 = (txn OnCompletion) - let tmp%12#0: uint64 = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp - let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating - let tmp%14#0: bytes = test_cases.everything.contract.Everything.say_hello() - let tmp%15#0: bytes = (concat 0x151f7c75 tmp%14#0) - (log tmp%15#0) + block@3: // say_hello_route_L56 + let tmp%10#0: uint64 = (txn OnCompletion) + let tmp%11#0: uint64 = (== tmp%10#0 NoOp) + (assert tmp%11#0) // OnCompletion is NoOp + let tmp%12#0: uint64 = (txn ApplicationID) + (assert tmp%12#0) // is not creating + let tmp%13#0: bytes = test_cases.everything.contract.Everything.say_hello() + let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) + (log tmp%14#0) return 1u - block@6: // calculate_route_L64 - let tmp%16#0: uint64 = (txn OnCompletion) - let tmp%17#0: uint64 = (== tmp%16#0 NoOp) - (assert tmp%17#0) // OnCompletion is NoOp - let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating - let tmp%19#0: bytes = (txna ApplicationArgs 1) - let tmp%20#0: bytes = (txna ApplicationArgs 2) - let tmp%21#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%19#0, tmp%20#0) - let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) - (log tmp%22#0) + block@4: // calculate_route_L64 + let tmp%15#0: uint64 = (txn OnCompletion) + let tmp%16#0: uint64 = (== tmp%15#0 NoOp) + (assert tmp%16#0) // OnCompletion is NoOp + let tmp%17#0: uint64 = (txn ApplicationID) + (assert tmp%17#0) // is not creating + let tmp%18#0: bytes = (txna ApplicationArgs 1) + let tmp%19#0: bytes = (txna ApplicationArgs 2) + let tmp%20#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%18#0, tmp%19#0) + let tmp%21#0: bytes = (concat 0x151f7c75 tmp%20#0) + (log tmp%21#0) return 1u - block@7: // close_out_route_L69 - let tmp%23#0: uint64 = (txn OnCompletion) - let tmp%24#0: uint64 = (== tmp%23#0 CloseOut) - (assert tmp%24#0) // OnCompletion is CloseOut - let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + block@5: // close_out_route_L69 + let tmp%22#0: uint64 = (txn OnCompletion) + let tmp%23#0: uint64 = (== tmp%22#0 CloseOut) + (assert tmp%23#0) // OnCompletion is CloseOut + let tmp%24#0: uint64 = (txn ApplicationID) + (assert tmp%24#0) // is not creating test_cases.everything.contract.Everything.close_out() return 1u - block@8: // switch_case_default_L37 - goto block@9 - block@9: // switch_case_next_L37 + block@6: // switch_case_default_L37 + goto block@7 + block@7: // switch_case_next_L37 fail // reject transaction subroutine test_cases.everything.contract.Everything.create() -> void: @@ -178,10 +172,6 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.positive_one() -> uint64: block@0: // L86 return 1u - - subroutine test_cases.everything.contract.Everything.__init__() -> void: - block@0: // L38 - return program clear-state: subroutine test_cases.everything.contract.Everything.clear_state_program() -> uint64: diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir index 6745414543..b1fb17f43c 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir @@ -2,61 +2,55 @@ contract test_cases.everything.contract.Everything: program approval: subroutine test_cases.everything.contract.Everything.approval_program() -> uint64: block@0: // L37 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L38 - test_cases.everything.contract.Everything.__init__() - goto block@2 - block@2: // entrypoint_L38 - let tmp%1#0: bytes = (txna ApplicationArgs 0) - switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => fail // reject transaction} - block@3: // create_route_L41 - let tmp%2#0: uint64 = (txn OnCompletion) - let tmp%3#0: uint64 = (! tmp%2#0) - (assert tmp%3#0) // OnCompletion is NoOp - let tmp%4#0: uint64 = (txn ApplicationID) - let tmp%5#0: uint64 = (! tmp%4#0) - (assert tmp%5#0) // is creating + let tmp%0#0: bytes = (txna ApplicationArgs 0) + switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => fail // reject transaction} + block@1: // create_route_L41 + let tmp%1#0: uint64 = (txn OnCompletion) + let tmp%2#0: uint64 = (! tmp%1#0) + (assert tmp%2#0) // OnCompletion is NoOp + let tmp%3#0: uint64 = (txn ApplicationID) + let tmp%4#0: uint64 = (! tmp%3#0) + (assert tmp%4#0) // is creating test_cases.everything.contract.Everything.create() return 1u - block@4: // register_route_L47 - let tmp%6#0: uint64 = (txn OnCompletion) - let tmp%7#0: uint64 = (shl 1u tmp%6#0) - let tmp%8#0: uint64 = (& tmp%7#0 3u) - (assert tmp%8#0) // OnCompletion is one of NoOp, OptIn - let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating - let tmp%10#0: bytes = (txna ApplicationArgs 1) - test_cases.everything.contract.Everything.register(tmp%10#0) + block@2: // register_route_L47 + let tmp%5#0: uint64 = (txn OnCompletion) + let tmp%6#0: uint64 = (shl 1u tmp%5#0) + let tmp%7#0: uint64 = (& tmp%6#0 3u) + (assert tmp%7#0) // OnCompletion is one of NoOp, OptIn + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // is not creating + let tmp%9#0: bytes = (txna ApplicationArgs 1) + test_cases.everything.contract.Everything.register(tmp%9#0) return 1u - block@5: // say_hello_route_L56 - let tmp%11#0: uint64 = (txn OnCompletion) - let tmp%12#0: uint64 = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp - let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating - let tmp%14#0: bytes = test_cases.everything.contract.Everything.say_hello() - let tmp%15#0: bytes = (concat 0x151f7c75 tmp%14#0) - (log tmp%15#0) + block@3: // say_hello_route_L56 + let tmp%10#0: uint64 = (txn OnCompletion) + let tmp%11#0: uint64 = (! tmp%10#0) + (assert tmp%11#0) // OnCompletion is NoOp + let tmp%12#0: uint64 = (txn ApplicationID) + (assert tmp%12#0) // is not creating + let tmp%13#0: bytes = test_cases.everything.contract.Everything.say_hello() + let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) + (log tmp%14#0) return 1u - block@6: // calculate_route_L64 - let tmp%16#0: uint64 = (txn OnCompletion) - let tmp%17#0: uint64 = (! tmp%16#0) - (assert tmp%17#0) // OnCompletion is NoOp - let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating - let tmp%19#0: bytes = (txna ApplicationArgs 1) - let tmp%20#0: bytes = (txna ApplicationArgs 2) - let tmp%21#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%19#0, tmp%20#0) - let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) - (log tmp%22#0) + block@4: // calculate_route_L64 + let tmp%15#0: uint64 = (txn OnCompletion) + let tmp%16#0: uint64 = (! tmp%15#0) + (assert tmp%16#0) // OnCompletion is NoOp + let tmp%17#0: uint64 = (txn ApplicationID) + (assert tmp%17#0) // is not creating + let tmp%18#0: bytes = (txna ApplicationArgs 1) + let tmp%19#0: bytes = (txna ApplicationArgs 2) + let tmp%20#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%18#0, tmp%19#0) + let tmp%21#0: bytes = (concat 0x151f7c75 tmp%20#0) + (log tmp%21#0) return 1u - block@7: // close_out_route_L69 - let tmp%23#0: uint64 = (txn OnCompletion) - let tmp%24#0: uint64 = (== tmp%23#0 CloseOut) - (assert tmp%24#0) // OnCompletion is CloseOut - let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + block@5: // close_out_route_L69 + let tmp%22#0: uint64 = (txn OnCompletion) + let tmp%23#0: uint64 = (== tmp%22#0 CloseOut) + (assert tmp%23#0) // OnCompletion is CloseOut + let tmp%24#0: uint64 = (txn ApplicationID) + (assert tmp%24#0) // is not creating test_cases.everything.contract.Everything.close_out() return 1u @@ -165,10 +159,6 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.positive_one() -> uint64: block@0: // L86 return 1u - - subroutine test_cases.everything.contract.Everything.__init__() -> void: - block@0: // L38 - return program clear-state: subroutine test_cases.everything.contract.Everything.clear_state_program() -> uint64: diff --git a/test_cases/everything/out_O2/MyContract.approval.teal b/test_cases/everything/out_O2/MyContract.approval.teal index 985813646d..bd5f8f6e3d 100644 --- a/test_cases/everything/out_O2/MyContract.approval.teal +++ b/test_cases/everything/out_O2/MyContract.approval.teal @@ -1,21 +1,16 @@ #pragma version 10 test_cases.everything.contract.Everything.approval_program: - txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ - -main_entrypoint@2: method "create()void" method "register(string)void" method "say_hello()string" method "calculate(uint64,uint64)uint64" method "close_out()void" txna ApplicationArgs 0 - match main_create_route@3 main_register_route@4 main_say_hello_route@5 main_calculate_route@6 main_close_out_route@7 + match main_create_route@1 main_register_route@2 main_say_hello_route@3 main_calculate_route@4 main_close_out_route@5 err // reject transaction -main_create_route@3: +main_create_route@1: txn OnCompletion ! assert // OnCompletion is NoOp @@ -26,7 +21,7 @@ main_create_route@3: int 1 return -main_register_route@4: +main_register_route@2: int 1 txn OnCompletion shl @@ -40,7 +35,7 @@ main_register_route@4: int 1 return -main_say_hello_route@5: +main_say_hello_route@3: txn OnCompletion ! assert // OnCompletion is NoOp @@ -54,7 +49,7 @@ main_say_hello_route@5: int 1 return -main_calculate_route@6: +main_calculate_route@4: txn OnCompletion ! assert // OnCompletion is NoOp @@ -70,7 +65,7 @@ main_calculate_route@6: int 1 return -main_close_out_route@7: +main_close_out_route@5: txn OnCompletion int CloseOut == @@ -249,9 +244,3 @@ positive_one: proto 0 1 int 1 retsub - - -// test_cases.everything.contract.Everything.__init__() -> void: -__init__: - proto 0 0 - retsub diff --git a/test_cases/everything/out_O2/MyContract.destructured.ir b/test_cases/everything/out_O2/MyContract.destructured.ir index 6745414543..b1fb17f43c 100644 --- a/test_cases/everything/out_O2/MyContract.destructured.ir +++ b/test_cases/everything/out_O2/MyContract.destructured.ir @@ -2,61 +2,55 @@ contract test_cases.everything.contract.Everything: program approval: subroutine test_cases.everything.contract.Everything.approval_program() -> uint64: block@0: // L37 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L38 - test_cases.everything.contract.Everything.__init__() - goto block@2 - block@2: // entrypoint_L38 - let tmp%1#0: bytes = (txna ApplicationArgs 0) - switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => fail // reject transaction} - block@3: // create_route_L41 - let tmp%2#0: uint64 = (txn OnCompletion) - let tmp%3#0: uint64 = (! tmp%2#0) - (assert tmp%3#0) // OnCompletion is NoOp - let tmp%4#0: uint64 = (txn ApplicationID) - let tmp%5#0: uint64 = (! tmp%4#0) - (assert tmp%5#0) // is creating + let tmp%0#0: bytes = (txna ApplicationArgs 0) + switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => fail // reject transaction} + block@1: // create_route_L41 + let tmp%1#0: uint64 = (txn OnCompletion) + let tmp%2#0: uint64 = (! tmp%1#0) + (assert tmp%2#0) // OnCompletion is NoOp + let tmp%3#0: uint64 = (txn ApplicationID) + let tmp%4#0: uint64 = (! tmp%3#0) + (assert tmp%4#0) // is creating test_cases.everything.contract.Everything.create() return 1u - block@4: // register_route_L47 - let tmp%6#0: uint64 = (txn OnCompletion) - let tmp%7#0: uint64 = (shl 1u tmp%6#0) - let tmp%8#0: uint64 = (& tmp%7#0 3u) - (assert tmp%8#0) // OnCompletion is one of NoOp, OptIn - let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating - let tmp%10#0: bytes = (txna ApplicationArgs 1) - test_cases.everything.contract.Everything.register(tmp%10#0) + block@2: // register_route_L47 + let tmp%5#0: uint64 = (txn OnCompletion) + let tmp%6#0: uint64 = (shl 1u tmp%5#0) + let tmp%7#0: uint64 = (& tmp%6#0 3u) + (assert tmp%7#0) // OnCompletion is one of NoOp, OptIn + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // is not creating + let tmp%9#0: bytes = (txna ApplicationArgs 1) + test_cases.everything.contract.Everything.register(tmp%9#0) return 1u - block@5: // say_hello_route_L56 - let tmp%11#0: uint64 = (txn OnCompletion) - let tmp%12#0: uint64 = (! tmp%11#0) - (assert tmp%12#0) // OnCompletion is NoOp - let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating - let tmp%14#0: bytes = test_cases.everything.contract.Everything.say_hello() - let tmp%15#0: bytes = (concat 0x151f7c75 tmp%14#0) - (log tmp%15#0) + block@3: // say_hello_route_L56 + let tmp%10#0: uint64 = (txn OnCompletion) + let tmp%11#0: uint64 = (! tmp%10#0) + (assert tmp%11#0) // OnCompletion is NoOp + let tmp%12#0: uint64 = (txn ApplicationID) + (assert tmp%12#0) // is not creating + let tmp%13#0: bytes = test_cases.everything.contract.Everything.say_hello() + let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) + (log tmp%14#0) return 1u - block@6: // calculate_route_L64 - let tmp%16#0: uint64 = (txn OnCompletion) - let tmp%17#0: uint64 = (! tmp%16#0) - (assert tmp%17#0) // OnCompletion is NoOp - let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating - let tmp%19#0: bytes = (txna ApplicationArgs 1) - let tmp%20#0: bytes = (txna ApplicationArgs 2) - let tmp%21#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%19#0, tmp%20#0) - let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) - (log tmp%22#0) + block@4: // calculate_route_L64 + let tmp%15#0: uint64 = (txn OnCompletion) + let tmp%16#0: uint64 = (! tmp%15#0) + (assert tmp%16#0) // OnCompletion is NoOp + let tmp%17#0: uint64 = (txn ApplicationID) + (assert tmp%17#0) // is not creating + let tmp%18#0: bytes = (txna ApplicationArgs 1) + let tmp%19#0: bytes = (txna ApplicationArgs 2) + let tmp%20#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%18#0, tmp%19#0) + let tmp%21#0: bytes = (concat 0x151f7c75 tmp%20#0) + (log tmp%21#0) return 1u - block@7: // close_out_route_L69 - let tmp%23#0: uint64 = (txn OnCompletion) - let tmp%24#0: uint64 = (== tmp%23#0 CloseOut) - (assert tmp%24#0) // OnCompletion is CloseOut - let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + block@5: // close_out_route_L69 + let tmp%22#0: uint64 = (txn OnCompletion) + let tmp%23#0: uint64 = (== tmp%22#0 CloseOut) + (assert tmp%23#0) // OnCompletion is CloseOut + let tmp%24#0: uint64 = (txn ApplicationID) + (assert tmp%24#0) // is not creating test_cases.everything.contract.Everything.close_out() return 1u @@ -165,10 +159,6 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.positive_one() -> uint64: block@0: // L86 return 1u - - subroutine test_cases.everything.contract.Everything.__init__() -> void: - block@0: // L38 - return program clear-state: subroutine test_cases.everything.contract.Everything.clear_state_program() -> uint64: diff --git a/test_cases/everything/out_unoptimized/MyContract.approval.teal b/test_cases/everything/out_unoptimized/MyContract.approval.teal index 13ca86fa38..c806ae8260 100644 --- a/test_cases/everything/out_unoptimized/MyContract.approval.teal +++ b/test_cases/everything/out_unoptimized/MyContract.approval.teal @@ -1,11 +1,6 @@ #pragma version 10 test_cases.everything.contract.Everything.approval_program: - txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ - -main_entrypoint@2: // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): txna ApplicationArgs 0 @@ -15,10 +10,10 @@ main_entrypoint@2: method "calculate(uint64,uint64)uint64" method "close_out()void" uncover 5 - match main_create_route@3 main_register_route@4 main_say_hello_route@5 main_calculate_route@6 main_close_out_route@7 - b main_switch_case_default@8 + match main_create_route@1 main_register_route@2 main_say_hello_route@3 main_calculate_route@4 main_close_out_route@5 + b main_switch_case_default@6 -main_create_route@3: +main_create_route@1: // everything/contract.py:41 // @abimethod(create=True) txn OnCompletion @@ -32,7 +27,7 @@ main_create_route@3: int 1 return -main_register_route@4: +main_register_route@2: // everything/contract.py:47 // @abimethod(allow_actions=["NoOp", "OptIn"]) txn OnCompletion @@ -53,7 +48,7 @@ main_register_route@4: int 1 return -main_say_hello_route@5: +main_say_hello_route@3: // everything/contract.py:56 // @abimethod txn OnCompletion @@ -70,7 +65,7 @@ main_say_hello_route@5: int 1 return -main_calculate_route@6: +main_calculate_route@4: // everything/contract.py:64 // @abimethod txn OnCompletion @@ -93,7 +88,7 @@ main_calculate_route@6: int 1 return -main_close_out_route@7: +main_close_out_route@5: // everything/contract.py:69 // @abimethod(allow_actions=["CloseOut"]) txn OnCompletion @@ -106,7 +101,7 @@ main_close_out_route@7: int 1 return -main_switch_case_default@8: +main_switch_case_default@6: // everything/contract.py:37 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): err // reject transaction @@ -370,11 +365,3 @@ positive_one: // return UInt64(1) int 1 retsub - - -// test_cases.everything.contract.Everything.__init__() -> void: -__init__: - // everything/contract.py:38 - // def __init__(self) -> None: - proto 0 0 - retsub diff --git a/test_cases/everything/out_unoptimized/MyContract.destructured.ir b/test_cases/everything/out_unoptimized/MyContract.destructured.ir index 30a7830e47..b7245219e3 100644 --- a/test_cases/everything/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/everything/out_unoptimized/MyContract.destructured.ir @@ -2,66 +2,60 @@ contract test_cases.everything.contract.Everything: program approval: subroutine test_cases.everything.contract.Everything.approval_program() -> uint64: block@0: // L37 - let app_id%0#0: uint64 = (txn ApplicationID) - goto app_id%0#0 ? block@2 : block@1 - block@1: // on_create_L38 - test_cases.everything.contract.Everything.__init__() - goto block@2 - block@2: // entrypoint_L38 - let tmp%1#0: bytes = (txna ApplicationArgs 0) - switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => block@8} - block@3: // create_route_L41 - let tmp%2#0: uint64 = (txn OnCompletion) - let tmp%3#0: uint64 = (== tmp%2#0 NoOp) - (assert tmp%3#0) // OnCompletion is NoOp - let tmp%4#0: uint64 = (txn ApplicationID) - let tmp%5#0: uint64 = (! tmp%4#0) - (assert tmp%5#0) // is creating + let tmp%0#0: bytes = (txna ApplicationArgs 0) + switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => block@6} + block@1: // create_route_L41 + let tmp%1#0: uint64 = (txn OnCompletion) + let tmp%2#0: uint64 = (== tmp%1#0 NoOp) + (assert tmp%2#0) // OnCompletion is NoOp + let tmp%3#0: uint64 = (txn ApplicationID) + let tmp%4#0: uint64 = (! tmp%3#0) + (assert tmp%4#0) // is creating test_cases.everything.contract.Everything.create() return 1u - block@4: // register_route_L47 - let tmp%6#0: uint64 = (txn OnCompletion) - let tmp%7#0: uint64 = (shl 1u tmp%6#0) - let tmp%8#0: uint64 = (& tmp%7#0 3u) - (assert tmp%8#0) // OnCompletion is one of NoOp, OptIn - let tmp%9#0: uint64 = (txn ApplicationID) - (assert tmp%9#0) // is not creating - let tmp%10#0: bytes = (txna ApplicationArgs 1) - test_cases.everything.contract.Everything.register(tmp%10#0) + block@2: // register_route_L47 + let tmp%5#0: uint64 = (txn OnCompletion) + let tmp%6#0: uint64 = (shl 1u tmp%5#0) + let tmp%7#0: uint64 = (& tmp%6#0 3u) + (assert tmp%7#0) // OnCompletion is one of NoOp, OptIn + let tmp%8#0: uint64 = (txn ApplicationID) + (assert tmp%8#0) // is not creating + let tmp%9#0: bytes = (txna ApplicationArgs 1) + test_cases.everything.contract.Everything.register(tmp%9#0) return 1u - block@5: // say_hello_route_L56 - let tmp%11#0: uint64 = (txn OnCompletion) - let tmp%12#0: uint64 = (== tmp%11#0 NoOp) - (assert tmp%12#0) // OnCompletion is NoOp - let tmp%13#0: uint64 = (txn ApplicationID) - (assert tmp%13#0) // is not creating - let tmp%14#0: bytes = test_cases.everything.contract.Everything.say_hello() - let tmp%15#0: bytes = (concat 0x151f7c75 tmp%14#0) - (log tmp%15#0) + block@3: // say_hello_route_L56 + let tmp%10#0: uint64 = (txn OnCompletion) + let tmp%11#0: uint64 = (== tmp%10#0 NoOp) + (assert tmp%11#0) // OnCompletion is NoOp + let tmp%12#0: uint64 = (txn ApplicationID) + (assert tmp%12#0) // is not creating + let tmp%13#0: bytes = test_cases.everything.contract.Everything.say_hello() + let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0) + (log tmp%14#0) return 1u - block@6: // calculate_route_L64 - let tmp%16#0: uint64 = (txn OnCompletion) - let tmp%17#0: uint64 = (== tmp%16#0 NoOp) - (assert tmp%17#0) // OnCompletion is NoOp - let tmp%18#0: uint64 = (txn ApplicationID) - (assert tmp%18#0) // is not creating - let tmp%19#0: bytes = (txna ApplicationArgs 1) - let tmp%20#0: bytes = (txna ApplicationArgs 2) - let tmp%21#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%19#0, tmp%20#0) - let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0) - (log tmp%22#0) + block@4: // calculate_route_L64 + let tmp%15#0: uint64 = (txn OnCompletion) + let tmp%16#0: uint64 = (== tmp%15#0 NoOp) + (assert tmp%16#0) // OnCompletion is NoOp + let tmp%17#0: uint64 = (txn ApplicationID) + (assert tmp%17#0) // is not creating + let tmp%18#0: bytes = (txna ApplicationArgs 1) + let tmp%19#0: bytes = (txna ApplicationArgs 2) + let tmp%20#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%18#0, tmp%19#0) + let tmp%21#0: bytes = (concat 0x151f7c75 tmp%20#0) + (log tmp%21#0) return 1u - block@7: // close_out_route_L69 - let tmp%23#0: uint64 = (txn OnCompletion) - let tmp%24#0: uint64 = (== tmp%23#0 CloseOut) - (assert tmp%24#0) // OnCompletion is CloseOut - let tmp%25#0: uint64 = (txn ApplicationID) - (assert tmp%25#0) // is not creating + block@5: // close_out_route_L69 + let tmp%22#0: uint64 = (txn OnCompletion) + let tmp%23#0: uint64 = (== tmp%22#0 CloseOut) + (assert tmp%23#0) // OnCompletion is CloseOut + let tmp%24#0: uint64 = (txn ApplicationID) + (assert tmp%24#0) // is not creating test_cases.everything.contract.Everything.close_out() return 1u - block@8: // switch_case_default_L37 - goto block@9 - block@9: // switch_case_next_L37 + block@6: // switch_case_default_L37 + goto block@7 + block@7: // switch_case_next_L37 fail // reject transaction subroutine test_cases.everything.contract.Everything.create() -> void: @@ -177,10 +171,6 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.positive_one() -> uint64: block@0: // L86 return 1u - - subroutine test_cases.everything.contract.Everything.__init__() -> void: - block@0: // L38 - return program clear-state: subroutine test_cases.everything.contract.Everything.clear_state_program() -> uint64: diff --git a/test_cases/everything/puya.log b/test_cases/everything/puya.log index f4c0e1b504..c0257082db 100644 --- a/test_cases/everything/puya.log +++ b/test_cases/everything/puya.log @@ -336,28 +336,22 @@ debug: Sealing block@0: // L81 debug: Terminated block@0: // L81 debug: Sealing block@0: // L86 debug: Terminated block@0: // L86 -debug: Sealing block@0: // L38 -debug: Terminated block@0: // L38 debug: Sealing block@0: // L37 debug: Terminated block@0: // L37 -debug: Sealing block@None: // on_create_L38 -debug: Terminated block@1: // on_create_L38 -debug: Sealing block@2: // entrypoint_L38 -debug: Terminated block@2: // entrypoint_L38 debug: Sealing block@None: // switch_case_default_L37 debug: Sealing block@None: // create_route_L41 debug: Sealing block@None: // register_route_L47 debug: Sealing block@None: // say_hello_route_L56 debug: Sealing block@None: // calculate_route_L64 debug: Sealing block@None: // close_out_route_L69 -debug: Terminated block@3: // create_route_L41 -debug: Terminated block@4: // register_route_L47 -debug: Terminated block@5: // say_hello_route_L56 -debug: Terminated block@6: // calculate_route_L64 -debug: Terminated block@7: // close_out_route_L69 -debug: Terminated block@8: // switch_case_default_L37 -debug: Sealing block@9: // switch_case_next_L37 -debug: Terminated block@9: // switch_case_next_L37 +debug: Terminated block@1: // create_route_L41 +debug: Terminated block@2: // register_route_L47 +debug: Terminated block@3: // say_hello_route_L56 +debug: Terminated block@4: // calculate_route_L64 +debug: Terminated block@5: // close_out_route_L69 +debug: Terminated block@6: // switch_case_default_L37 +debug: Sealing block@7: // switch_case_next_L37 +debug: Terminated block@7: // switch_case_next_L37 debug: Sealing block@0: // L73 debug: Terminated block@0: // L73 debug: Output IR to everything/out/MyContract.ssa.ir @@ -371,14 +365,14 @@ debug: Optimizer: Copy Propagation debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops -debug: adding block@2: // entrypoint_L38 as a predecessor of block@9: // switch_case_next_L37 due to inlining of block@8: // switch_case_default_L37 -debug: simplified terminator of block@2: // entrypoint_L38 from switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => block@8} to switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => block@9} -debug: simplified terminator of block@2: // entrypoint_L38 from switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => block@9} to switch tmp%1#0 {method "create()void" => block@3, method "register(string)void" => block@4, method "say_hello()string" => block@5, method "calculate(uint64,uint64)uint64" => block@6, method "close_out()void" => block@7, * => fail // reject transaction} +debug: adding block@0: // L37 as a predecessor of block@7: // switch_case_next_L37 due to inlining of block@6: // switch_case_default_L37 +debug: simplified terminator of block@0: // L37 from switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => block@6} to switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => block@7} +debug: simplified terminator of block@0: // L37 from switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => block@7} to switch tmp%0#0 {method "create()void" => block@1, method "register(string)void" => block@2, method "say_hello()string" => block@3, method "calculate(uint64,uint64)uint64" => block@4, method "close_out()void" => block@5, * => fail // reject transaction} debug: Optimizer: Remove Linear Jump -debug: Merged linear block@9: // switch_case_next_L37 into block@8: // switch_case_default_L37 +debug: Merged linear block@7: // switch_case_next_L37 into block@6: // switch_case_default_L37 debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks -debug: Removing unreachable blocks: block@8: // switch_case_default_L37 +debug: Removing unreachable blocks: block@6: // switch_case_default_L37 debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine test_cases.everything.contract.Everything.create debug: Splitting parallel copies prior to optimization @@ -536,18 +530,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine test_cases.everything.contract.Everything.__init__ -debug: Splitting parallel copies prior to optimization -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine test_cases.everything.contract.Everything.clear_state_program debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification @@ -705,17 +687,6 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Optimizing subroutine test_cases.everything.contract.Everything.__init__ -debug: Optimizer: Arithmetic Simplification -debug: Optimizer: Constant Replacer -debug: Optimizer: Copy Propagation -debug: Optimizer: Intrinsic Simplifier -debug: Optimizer: Remove Unused Variables -debug: Optimizer: Simplify Control Ops -debug: Optimizer: Remove Linear Jump -debug: Optimizer: Remove Empty Blocks -debug: Optimizer: Remove Unreachable Blocks -debug: Optimizer: Repeated Expression Elimination debug: Optimizing subroutine test_cases.everything.contract.Everything.clear_state_program debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer @@ -741,7 +712,6 @@ debug: Removing Phis from test_cases.everything.my_base.MyMiddleBase.calculate debug: Removing Phis from test_cases.everything.contract.Everything.close_out debug: Removing Phis from test_cases.everything.contract.Everything._remove_sender debug: Removing Phis from test_cases.everything.contract.positive_one -debug: Removing Phis from test_cases.everything.contract.Everything.__init__ debug: Removing Phis from test_cases.everything.contract.Everything.clear_state_program debug: Coalescing local variables in test_cases.everything.contract.Everything.approval_program using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -769,8 +739,6 @@ debug: Coalescing local variables in test_cases.everything.contract.Everything._ debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in test_cases.everything.contract.positive_one using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s -debug: Coalescing local variables in test_cases.everything.contract.Everything.__init__ using strategy RootOperandGrouping -debug: Coalescing resulted in 0 replacement/s debug: Coalescing local variables in test_cases.everything.contract.Everything.clear_state_program using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s debug: Sequentializing parallel copies in test_cases.everything.contract.Everything.approval_program @@ -786,63 +754,60 @@ debug: Sequentializing parallel copies in test_cases.everything.my_base.MyMiddle debug: Sequentializing parallel copies in test_cases.everything.contract.Everything.close_out debug: Sequentializing parallel copies in test_cases.everything.contract.Everything._remove_sender debug: Sequentializing parallel copies in test_cases.everything.contract.positive_one -debug: Sequentializing parallel copies in test_cases.everything.contract.Everything.__init__ debug: Sequentializing parallel copies in test_cases.everything.contract.Everything.clear_state_program debug: Performing post-SSA optimizations debug: Output IR to everything/out/MyContract.destructured.ir -debug: Inserted main_block@0.ops[1]: 'store app_id%0#0 to l-stack (copy)' -debug: Replaced main_block@0.ops[3]: 'load app_id%0#0' with 'load app_id%0#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[1]: 'store tmp%1#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[8]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted main_create_route@3.ops[1]: 'store tmp%2#0 to l-stack (copy)' -debug: Replaced main_create_route@3.ops[3]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' -debug: Inserted main_create_route@3.ops[5]: 'store tmp%3#0 to l-stack (copy)' -debug: Replaced main_create_route@3.ops[7]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted main_create_route@3.ops[10]: 'store tmp%4#0 to l-stack (copy)' -debug: Replaced main_create_route@3.ops[12]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' -debug: Inserted main_create_route@3.ops[14]: 'store tmp%5#0 to l-stack (copy)' -debug: Replaced main_create_route@3.ops[16]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' -debug: Inserted main_register_route@4.ops[5]: 'store tmp%7#0 to l-stack (copy)' -debug: Replaced main_register_route@4.ops[7]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' -debug: Inserted main_register_route@4.ops[10]: 'store tmp%8#0 to l-stack (copy)' -debug: Replaced main_register_route@4.ops[12]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' -debug: Inserted main_register_route@4.ops[15]: 'store tmp%9#0 to l-stack (copy)' -debug: Replaced main_register_route@4.ops[17]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' -debug: Inserted main_register_route@4.ops[20]: 'store tmp%10#0 to l-stack (copy)' -debug: Replaced main_register_route@4.ops[22]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted main_register_route@4.ops[1]: 'store tmp%6#0 to l-stack (copy)' -debug: Replaced main_register_route@4.ops[4]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' -debug: Inserted main_say_hello_route@5.ops[1]: 'store tmp%11#0 to l-stack (copy)' -debug: Replaced main_say_hello_route@5.ops[3]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' -debug: Inserted main_say_hello_route@5.ops[5]: 'store tmp%12#0 to l-stack (copy)' -debug: Replaced main_say_hello_route@5.ops[7]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' -debug: Inserted main_say_hello_route@5.ops[10]: 'store tmp%13#0 to l-stack (copy)' -debug: Replaced main_say_hello_route@5.ops[12]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' -debug: Inserted main_say_hello_route@5.ops[19]: 'store tmp%15#0 to l-stack (copy)' -debug: Replaced main_say_hello_route@5.ops[21]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' -debug: Inserted main_say_hello_route@5.ops[15]: 'store tmp%14#0 to l-stack (copy)' -debug: Replaced main_say_hello_route@5.ops[18]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' -debug: Inserted main_calculate_route@6.ops[1]: 'store tmp%16#0 to l-stack (copy)' -debug: Replaced main_calculate_route@6.ops[3]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' -debug: Inserted main_calculate_route@6.ops[5]: 'store tmp%17#0 to l-stack (copy)' -debug: Replaced main_calculate_route@6.ops[7]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' -debug: Inserted main_calculate_route@6.ops[10]: 'store tmp%18#0 to l-stack (copy)' -debug: Replaced main_calculate_route@6.ops[12]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' -debug: Inserted main_calculate_route@6.ops[25]: 'store tmp%22#0 to l-stack (copy)' -debug: Replaced main_calculate_route@6.ops[27]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' -debug: Inserted main_calculate_route@6.ops[17]: 'store tmp%20#0 to l-stack (copy)' -debug: Replaced main_calculate_route@6.ops[20]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' -debug: Inserted main_calculate_route@6.ops[22]: 'store tmp%21#0 to l-stack (copy)' -debug: Replaced main_calculate_route@6.ops[25]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' -debug: Inserted main_calculate_route@6.ops[15]: 'store tmp%19#0 to l-stack (copy)' -debug: Replaced main_calculate_route@6.ops[20]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' -debug: Inserted main_close_out_route@7.ops[1]: 'store tmp%23#0 to l-stack (copy)' -debug: Replaced main_close_out_route@7.ops[3]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' -debug: Inserted main_close_out_route@7.ops[6]: 'store tmp%24#0 to l-stack (copy)' -debug: Replaced main_close_out_route@7.ops[8]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' -debug: Inserted main_close_out_route@7.ops[11]: 'store tmp%25#0 to l-stack (copy)' -debug: Replaced main_close_out_route@7.ops[13]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' -debug: Found 2 edge set/s for test_cases.everything.contract.Everything.approval_program +debug: Inserted main_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced main_block@0.ops[8]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' +debug: Inserted main_create_route@1.ops[1]: 'store tmp%1#0 to l-stack (copy)' +debug: Replaced main_create_route@1.ops[3]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' +debug: Inserted main_create_route@1.ops[5]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced main_create_route@1.ops[7]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted main_create_route@1.ops[10]: 'store tmp%3#0 to l-stack (copy)' +debug: Replaced main_create_route@1.ops[12]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' +debug: Inserted main_create_route@1.ops[14]: 'store tmp%4#0 to l-stack (copy)' +debug: Replaced main_create_route@1.ops[16]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' +debug: Inserted main_register_route@2.ops[5]: 'store tmp%6#0 to l-stack (copy)' +debug: Replaced main_register_route@2.ops[7]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' +debug: Inserted main_register_route@2.ops[10]: 'store tmp%7#0 to l-stack (copy)' +debug: Replaced main_register_route@2.ops[12]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' +debug: Inserted main_register_route@2.ops[15]: 'store tmp%8#0 to l-stack (copy)' +debug: Replaced main_register_route@2.ops[17]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' +debug: Inserted main_register_route@2.ops[20]: 'store tmp%9#0 to l-stack (copy)' +debug: Replaced main_register_route@2.ops[22]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' +debug: Inserted main_register_route@2.ops[1]: 'store tmp%5#0 to l-stack (copy)' +debug: Replaced main_register_route@2.ops[4]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' +debug: Inserted main_say_hello_route@3.ops[1]: 'store tmp%10#0 to l-stack (copy)' +debug: Replaced main_say_hello_route@3.ops[3]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' +debug: Inserted main_say_hello_route@3.ops[5]: 'store tmp%11#0 to l-stack (copy)' +debug: Replaced main_say_hello_route@3.ops[7]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' +debug: Inserted main_say_hello_route@3.ops[10]: 'store tmp%12#0 to l-stack (copy)' +debug: Replaced main_say_hello_route@3.ops[12]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' +debug: Inserted main_say_hello_route@3.ops[19]: 'store tmp%14#0 to l-stack (copy)' +debug: Replaced main_say_hello_route@3.ops[21]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' +debug: Inserted main_say_hello_route@3.ops[15]: 'store tmp%13#0 to l-stack (copy)' +debug: Replaced main_say_hello_route@3.ops[18]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' +debug: Inserted main_calculate_route@4.ops[1]: 'store tmp%15#0 to l-stack (copy)' +debug: Replaced main_calculate_route@4.ops[3]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' +debug: Inserted main_calculate_route@4.ops[5]: 'store tmp%16#0 to l-stack (copy)' +debug: Replaced main_calculate_route@4.ops[7]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' +debug: Inserted main_calculate_route@4.ops[10]: 'store tmp%17#0 to l-stack (copy)' +debug: Replaced main_calculate_route@4.ops[12]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' +debug: Inserted main_calculate_route@4.ops[25]: 'store tmp%21#0 to l-stack (copy)' +debug: Replaced main_calculate_route@4.ops[27]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' +debug: Inserted main_calculate_route@4.ops[17]: 'store tmp%19#0 to l-stack (copy)' +debug: Replaced main_calculate_route@4.ops[20]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' +debug: Inserted main_calculate_route@4.ops[22]: 'store tmp%20#0 to l-stack (copy)' +debug: Replaced main_calculate_route@4.ops[25]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' +debug: Inserted main_calculate_route@4.ops[15]: 'store tmp%18#0 to l-stack (copy)' +debug: Replaced main_calculate_route@4.ops[20]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' +debug: Inserted main_close_out_route@5.ops[1]: 'store tmp%22#0 to l-stack (copy)' +debug: Replaced main_close_out_route@5.ops[3]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' +debug: Inserted main_close_out_route@5.ops[6]: 'store tmp%23#0 to l-stack (copy)' +debug: Replaced main_close_out_route@5.ops[8]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' +debug: Inserted main_close_out_route@5.ops[11]: 'store tmp%24#0 to l-stack (copy)' +debug: Replaced main_close_out_route@5.ops[13]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' +debug: Found 1 edge set/s for test_cases.everything.contract.Everything.approval_program debug: Inserted _check_ban_list_block@0.ops[7]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced _check_ban_list_block@0.ops[9]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted _check_ban_list_block@0.ops[3]: 'store tmp%1#0 to l-stack (copy)' From afe81d14a8ea991991562b910e81f857ed2c7353 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Thu, 29 Feb 2024 19:35:35 +0800 Subject: [PATCH 24/40] improve optimisation of state.get() --- examples/global_state/out/AppStateContract.approval.teal | 8 ++------ .../global_state/out_O2/AppStateContract.approval.teal | 8 ++------ .../local_state/out/LocalStateContract.approval.teal | 4 +--- .../local_state/out/LocalStateWithOffsets.approval.teal | 4 +--- .../local_state/out_O2/LocalStateContract.approval.teal | 4 +--- .../out_O2/LocalStateWithOffsets.approval.teal | 4 +--- examples/sizes.txt | 6 +++--- src/puya/teal/optimize/peephole.py | 9 +++++++-- 8 files changed, 18 insertions(+), 29 deletions(-) diff --git a/examples/global_state/out/AppStateContract.approval.teal b/examples/global_state/out/AppStateContract.approval.teal index 09b9eac49a..9f3a0d4acd 100644 --- a/examples/global_state/out/AppStateContract.approval.teal +++ b/examples/global_state/out/AppStateContract.approval.teal @@ -87,10 +87,8 @@ main_entrypoint@2: int 0 byte "global_bytes_full" app_global_get_ex - swap byte "default" - swap - uncover 2 + cover 2 select byte "Hello" == @@ -140,10 +138,8 @@ main_entrypoint@2: int 0 byte "global_bytes_no_default" app_global_get_ex - swap byte "default" - swap - uncover 2 + cover 2 select byte "default" == diff --git a/examples/global_state/out_O2/AppStateContract.approval.teal b/examples/global_state/out_O2/AppStateContract.approval.teal index cc5276a2d4..54851a4909 100644 --- a/examples/global_state/out_O2/AppStateContract.approval.teal +++ b/examples/global_state/out_O2/AppStateContract.approval.teal @@ -63,10 +63,8 @@ main_entrypoint@2: int 0 byte "global_bytes_full" app_global_get_ex - swap byte "default" - swap - uncover 2 + cover 2 select byte "Hello" == @@ -98,10 +96,8 @@ main_entrypoint@2: int 0 byte "global_bytes_no_default" app_global_get_ex - swap byte "default" - swap - uncover 2 + cover 2 select byte "default" == diff --git a/examples/local_state/out/LocalStateContract.approval.teal b/examples/local_state/out/LocalStateContract.approval.teal index 687ede9dcd..e32a5b5be0 100644 --- a/examples/local_state/out/LocalStateContract.approval.teal +++ b/examples/local_state/out/LocalStateContract.approval.teal @@ -235,9 +235,7 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - swap frame_dig -1 - swap - uncover 2 + cover 2 select retsub diff --git a/examples/local_state/out/LocalStateWithOffsets.approval.teal b/examples/local_state/out/LocalStateWithOffsets.approval.teal index 468f39b44d..2b2c665750 100644 --- a/examples/local_state/out/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out/LocalStateWithOffsets.approval.teal @@ -243,9 +243,7 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - swap frame_dig -1 - swap - uncover 2 + cover 2 select retsub diff --git a/examples/local_state/out_O2/LocalStateContract.approval.teal b/examples/local_state/out_O2/LocalStateContract.approval.teal index 0e8d993035..2b9d8a9b68 100644 --- a/examples/local_state/out_O2/LocalStateContract.approval.teal +++ b/examples/local_state/out_O2/LocalStateContract.approval.teal @@ -136,9 +136,7 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - swap frame_dig -1 - swap - uncover 2 + cover 2 select retsub diff --git a/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal b/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal index d48f30a5b5..78a603b0f0 100644 --- a/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal +++ b/examples/local_state/out_O2/LocalStateWithOffsets.approval.teal @@ -142,9 +142,7 @@ get_data_with_default: int 0 byte "local" app_local_get_ex - swap frame_dig -1 - swap - uncover 2 + cover 2 select retsub diff --git a/examples/sizes.txt b/examples/sizes.txt index 1a16a40a7b..921f1ee02e 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -31,7 +31,7 @@ control_op_simplification 48 52 46 edverify/Verify 43 37 37 enumeration/Enumeration 551 501 501 everything 467 448 448 -global_state/AppState 305 305 305 +global_state/AppState 305 301 301 hello_world/HelloWorld 23 22 22 hello_world_arc4/HelloWorld 110 89 89 inner_transactions 1862 1222 1222 @@ -40,8 +40,8 @@ inner_transactions/itxn_loop 203 260 260 intrinsics/ImmediateVariants 164 162 162 koopman 16 9 9 less_simple 171 148 148 -local_state/LocalState 305 300 288 -local_state/LocalStateWithOffsets 318 311 299 +local_state/LocalState 305 298 286 +local_state/LocalStateWithOffsets 318 309 297 log 172 164 164 match 490 455 455 nested_loops/Nested 243 201 201 diff --git a/src/puya/teal/optimize/peephole.py b/src/puya/teal/optimize/peephole.py index fe24ff7ba1..7bbb732b97 100644 --- a/src/puya/teal/optimize/peephole.py +++ b/src/puya/teal/optimize/peephole.py @@ -6,6 +6,7 @@ LOAD_OP_CODES_INCL_OFFSET, ORDERING_OPS, STORE_OPS_INCL_OFFSET, + LOAD_OP_CODES, ) from puya.utils import invert_ordered_binary_op @@ -204,10 +205,14 @@ def _frame_digs_overlap_with_ops(stack_height: int, *ops: models.TealOp) -> bool def _optimize_quadruplet( a: models.TealOp, b: models.TealOp, c: models.TealOp, d: models.TealOp ) -> tuple[list[models.TealOp], bool]: - # `swap; dig|uncover n >= 2; swap; uncover 2` -> `dig|uncover n; cover 2` + # `swap; ; swap; uncover 2` -> `dig|uncover n; cover 2` if ( is_stack_swap(a) - and (b.op_code in ("dig", "uncover") and int(b.immediates[0]) >= 2) + and ( + b.op_code in LOAD_OP_CODES + or (b.op_code in ("dig", "uncover") and int(b.immediates[0]) >= 2) + or (b.op_code == "frame_dig" and int(b.immediates[0]) < 0) + ) and is_stack_swap(c) and (d.op_code == "uncover" and d.immediates[0] == 2) ): From 7fb7ea2cef72e38f209e9da71f3fb766321b6274 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 10:47:57 +0800 Subject: [PATCH 25/40] minor changes --- src/puya/awst/nodes.py | 12 +++--------- src/puya/teal/optimize/peephole.py | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index b9335101e0..2de5cd219d 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -683,9 +683,7 @@ class TxnFields: @classmethod @functools.cache def all_fields(cls) -> Sequence[TxnField]: - # values = vars(cls).values() - names = dir(cls) - values = [getattr(cls, name) for name in names] + values = [getattr(cls, name) for name in dir(cls)] return tuple(v for v in values if isinstance(v, TxnField)) @classmethod @@ -700,9 +698,7 @@ def inner_transaction_non_array_fields(cls) -> Sequence[TxnField]: @attrs.define class CreateInnerTransaction(Expression): wtype: wtypes.WInnerTransactionFields - fields: Mapping[TxnField, Expression] = attrs.field( - converter=immutabledict[TxnField, Expression] - ) + fields: Mapping[TxnField, Expression] = attrs.field(converter=immutabledict) def accept(self, visitor: ExpressionVisitor[T]) -> T: return visitor.visit_create_inner_transaction(self) @@ -711,9 +707,7 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T: @attrs.define class UpdateInnerTransaction(Expression): itxn: Expression = attrs.field(validator=expression_has_wtype(wtypes.WInnerTransactionFields)) - fields: Mapping[TxnField, Expression] = attrs.field( - converter=immutabledict[TxnField, Expression] - ) + fields: Mapping[TxnField, Expression] = attrs.field(converter=immutabledict) wtype: WType = attrs.field(default=wtypes.void_wtype, init=False) def accept(self, visitor: ExpressionVisitor[T]) -> T: diff --git a/src/puya/teal/optimize/peephole.py b/src/puya/teal/optimize/peephole.py index 7bbb732b97..d55f4d17cb 100644 --- a/src/puya/teal/optimize/peephole.py +++ b/src/puya/teal/optimize/peephole.py @@ -3,10 +3,10 @@ from puya.teal import models from puya.teal.optimize._data import ( COMMUTATIVE_OPS, + LOAD_OP_CODES, LOAD_OP_CODES_INCL_OFFSET, ORDERING_OPS, STORE_OPS_INCL_OFFSET, - LOAD_OP_CODES, ) from puya.utils import invert_ordered_binary_op From c7743bc35f29e79b676eb13e2435394191dc2dc5 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 10:52:57 +0800 Subject: [PATCH 26/40] minor changes --- src/puya/awst_build/contract.py | 2 +- src/puya/awst_build/eb/app_account_state.py | 2 +- src/puya/awst_build/eb/app_state.py | 7 +------ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index 62325e01ab..e9211044e7 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -80,7 +80,7 @@ def __init__( collected_app_state_definitions[decl.member_name] = AppStateDefinition( member_name=decl.member_name, storage_wtype=decl.storage_wtype, - key=decl.member_name.encode("utf8"), + key=decl.member_name.encode("utf8"), # TODO: use source file encoding key_encoding=BytesEncoding.utf8, description=None, source_location=decl.source_location, diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index 86de47c377..580d1f38b5 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -242,7 +242,7 @@ def call( key = bytes_value key_encoding = BytesEncoding.unknown case Literal(value=str(str_value)): - key = str_value.encode("utf8") + key = str_value.encode("utf8") # TODO: use source file encoding key_encoding = BytesEncoding.utf8 case _: raise CodeError("key should be a string or bytes literal", key_arg.source_location) diff --git a/src/puya/awst_build/eb/app_state.py b/src/puya/awst_build/eb/app_state.py index 0e31cd9380..8230c51d39 100644 --- a/src/puya/awst_build/eb/app_state.py +++ b/src/puya/awst_build/eb/app_state.py @@ -40,11 +40,6 @@ class AppStateClassExpressionBuilder(IntermediateExpressionBuilder): def __init__(self, location: SourceLocation): super().__init__(location) self._storage: wtypes.WType | None = None - self._initial_value: Expression | None = None - - @property - def initial_value(self) -> Expression | None: - return self._initial_value def index( self, index: ExpressionBuilder | Literal, location: SourceLocation @@ -115,7 +110,7 @@ def call( key = bytes_value key_encoding = BytesEncoding.unknown case Literal(value=str(str_value)): - key = str_value.encode("utf8") + key = str_value.encode("utf8") # TODO: use source file encoding key_encoding = BytesEncoding.utf8 case _: raise CodeError("key should be a string or bytes literal", key_arg.source_location) From 9f6e6555ea62f244c1deb0766e80e9ddb529991d Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 12:32:21 +0800 Subject: [PATCH 27/40] - address usage of non-utf8 file encodings - turns out it's somewhat gnarly to plumb this through everywhere, and given the lack of uproar over ruff's complete lack of handling of non-utf8 files https://github.com/astral-sh/ruff/issues/6791, we can just warn about it instead. the only potential negative effects are that the bytes on disk in the python file for something like a LocalState that takes it's key from the member name, might not match exactly what's in the TEAL file (and thus on chain). - refactor to slightly reduce mypy dependencies in ParseResult - pull out component orderding and checking to the parse level - construct read_source directly and add caching at the top level --- src/puya/awst_build/contract.py | 2 +- src/puya/awst_build/eb/app_account_state.py | 2 +- src/puya/awst_build/eb/app_state.py | 2 +- src/puya/awst_build/main.py | 45 ++++++++----------- src/puya/compile.py | 10 +++-- src/puya/context.py | 10 +++-- src/puya/errors.py | 6 +-- src/puya/parse.py | 50 +++++++++++++++++++-- test_cases/constants/puya.log | 1 + 9 files changed, 83 insertions(+), 45 deletions(-) diff --git a/src/puya/awst_build/contract.py b/src/puya/awst_build/contract.py index e9211044e7..62325e01ab 100644 --- a/src/puya/awst_build/contract.py +++ b/src/puya/awst_build/contract.py @@ -80,7 +80,7 @@ def __init__( collected_app_state_definitions[decl.member_name] = AppStateDefinition( member_name=decl.member_name, storage_wtype=decl.storage_wtype, - key=decl.member_name.encode("utf8"), # TODO: use source file encoding + key=decl.member_name.encode("utf8"), key_encoding=BytesEncoding.utf8, description=None, source_location=decl.source_location, diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index 580d1f38b5..86de47c377 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -242,7 +242,7 @@ def call( key = bytes_value key_encoding = BytesEncoding.unknown case Literal(value=str(str_value)): - key = str_value.encode("utf8") # TODO: use source file encoding + key = str_value.encode("utf8") key_encoding = BytesEncoding.utf8 case _: raise CodeError("key should be a string or bytes literal", key_arg.source_location) diff --git a/src/puya/awst_build/eb/app_state.py b/src/puya/awst_build/eb/app_state.py index 8230c51d39..4fc26ea9fc 100644 --- a/src/puya/awst_build/eb/app_state.py +++ b/src/puya/awst_build/eb/app_state.py @@ -110,7 +110,7 @@ def call( key = bytes_value key_encoding = BytesEncoding.unknown case Literal(value=str(str_value)): - key = str_value.encode("utf8") # TODO: use source file encoding + key = str_value.encode("utf8") key_encoding = BytesEncoding.utf8 case _: raise CodeError("key should be a string or bytes literal", key_arg.source_location) diff --git a/src/puya/awst_build/main.py b/src/puya/awst_build/main.py index 4037fa53ba..0a18bd0e2d 100644 --- a/src/puya/awst_build/main.py +++ b/src/puya/awst_build/main.py @@ -1,6 +1,5 @@ from pathlib import Path -import mypy.build import structlog from puya.awst.nodes import Module @@ -8,7 +7,6 @@ from puya.awst_build.context import ASTConversionContext from puya.awst_build.module import ModuleASTConverter from puya.context import CompileContext -from puya.errors import InternalError from puya.options import PuyaOptions from puya.parse import EMBEDDED_MODULES, TYPESHED_PATH from puya.utils import attrs_extend, determine_out_dir, make_path_relative_to_cwd @@ -20,32 +18,25 @@ def transform_ast(compile_context: CompileContext) -> dict[str, Module]: result = dict[str, Module]() ctx: ASTConversionContext = attrs_extend(ASTConversionContext, compile_context) user_modules = {} - for scc_module_names in mypy.build.sorted_components(ctx.parse_result.graph): - for module_name in scc_module_names: - module = ctx.parse_result.manager.modules.get(module_name) - if module is None: - raise InternalError(f"mypy failed to parse: {module_name}") - module_rel_path = make_path_relative_to_cwd(module.path) - if module_name != module.fullname: - raise InternalError( - f"mypy parsed wrong module, expected '{module_name}': {module.fullname}" - ) - if module.is_stub: - if module_name in ("abc", "typing", "collections.abc"): - logger.debug(f"Skipping stdlib stub {module_rel_path}") - elif module_name.startswith("puyapy"): - logger.debug(f"Skipping puyapy stub {module_rel_path}") - elif Path(module.path).is_relative_to(TYPESHED_PATH): - logger.debug(f"Skipping typeshed stub {module_rel_path}") - else: - logger.warning(f"Skipping stub: {module_rel_path}") - elif embedded_src := EMBEDDED_MODULES.get(module.name): - logger.debug(f"Building AWST for embedded puyapy lib at {module_rel_path}") - module._fullname = embedded_src.puya_module_name # noqa: SLF001 - result[embedded_src.puya_module_name] = ModuleASTConverter(ctx, module).convert() + for module in ctx.parse_result.ordered_modules: + module_name = module.fullname + module_rel_path = make_path_relative_to_cwd(module.path) + if module.is_stub: + if module_name in ("abc", "typing", "collections.abc"): + logger.debug(f"Skipping stdlib stub {module_rel_path}") + elif module_name.startswith("puyapy"): + logger.debug(f"Skipping puyapy stub {module_rel_path}") + elif Path(module.path).is_relative_to(TYPESHED_PATH): + logger.debug(f"Skipping typeshed stub {module_rel_path}") else: - logger.debug(f"Discovered user module {module_name} at {module_rel_path}") - user_modules[module_name] = ModuleASTConverter(ctx, module) + logger.warning(f"Skipping stub: {module_rel_path}") + elif embedded_src := EMBEDDED_MODULES.get(module_name): + logger.debug(f"Building AWST for embedded puyapy lib at {module_rel_path}") + module._fullname = embedded_src.puya_module_name # noqa: SLF001 + result[embedded_src.puya_module_name] = ModuleASTConverter(ctx, module).convert() + else: + logger.debug(f"Discovered user module {module_name} at {module_rel_path}") + user_modules[module_name] = ModuleASTConverter(ctx, module) for module_name, converter in user_modules.items(): logger.debug(f"Building AWST for module {module_name}") module_awst = converter.convert() diff --git a/src/puya/compile.py b/src/puya/compile.py index 4e9cfb7e31..966b1913b1 100644 --- a/src/puya/compile.py +++ b/src/puya/compile.py @@ -1,5 +1,7 @@ +import functools import os import sys +from collections.abc import Sequence from pathlib import Path import mypy.build @@ -9,6 +11,7 @@ import mypy.modulefinder import mypy.nodes import mypy.options +import mypy.util import structlog from puya.arc32 import create_arc32_json @@ -66,10 +69,9 @@ def parse_with_mypy(puya_options: PuyaOptions) -> CompileContext: # We don't want to crash when that happens. parse_result.manager.errors.set_file("", module=None, scope=None, options=mypy_options) - # extract the source reader - read_source = parse_result.manager.errors.read_source - if read_source is None: - raise InternalError("parse_results.manager.errors.read_source is None") + @functools.cache + def read_source(p: str) -> Sequence[str] | None: + return mypy.util.read_py_file(p, parse_result.manager.fscache.read) context = CompileContext( options=puya_options, diff --git a/src/puya/context.py b/src/puya/context.py index 8f34882347..f3017753b5 100644 --- a/src/puya/context.py +++ b/src/puya/context.py @@ -1,4 +1,4 @@ -from collections.abc import Callable +from collections.abc import Callable, Sequence import attrs @@ -10,7 +10,7 @@ @attrs.frozen class SourceMeta: location: str | None - code: list[str] | None + code: Sequence[str] | None _EmptyMeta = SourceMeta(None, None) @@ -21,7 +21,7 @@ class CompileContext: options: PuyaOptions parse_result: ParseResult errors: Errors - read_source: Callable[[str], list[str] | None] + read_source: Callable[[str], Sequence[str] | None] def try_get_source(self, location: SourceLocation | None) -> SourceMeta: if location is None: @@ -33,7 +33,9 @@ def try_get_source(self, location: SourceLocation | None) -> SourceMeta: start_line = end_line = location.line if location.end_line: end_line = location.end_line - src_content = source_lines[start_line - 1 : end_line] # location.lines is one-indexed + src_content = list( + source_lines[start_line - 1 : end_line] # location.lines is one-indexed + ) start_column = location.column end_column = location.end_column diff --git a/src/puya/errors.py b/src/puya/errors.py index 516895f78a..7ddd684564 100644 --- a/src/puya/errors.py +++ b/src/puya/errors.py @@ -5,7 +5,7 @@ import traceback import typing import typing as t -from collections.abc import Callable, Iterator +from collections.abc import Callable, Iterator, Sequence from pathlib import Path import attrs @@ -82,7 +82,7 @@ def __init__(self, location: SourceLocation | None, msg: str | None = None): super().__init__(msg or "TODO: support this thing", location=location) -def _get_pretty_source(file_source: list[str], location: SourceLocation) -> list[str]: +def _get_pretty_source(file_source: Sequence[str], location: SourceLocation) -> list[str]: source_line = file_source[location.line - 1] column = location.column end_column = len(source_line) @@ -104,7 +104,7 @@ def _get_pretty_source(file_source: list[str], location: SourceLocation) -> list class Errors: - def __init__(self, read_source: Callable[[str], list[str] | None]) -> None: + def __init__(self, read_source: Callable[[str], Sequence[str] | None]) -> None: self.num_errors = 0 self.num_warnings = 0 self.read_source = read_source diff --git a/src/puya/parse.py b/src/puya/parse.py index 4aa84906c8..66670096ec 100644 --- a/src/puya/parse.py +++ b/src/puya/parse.py @@ -15,6 +15,7 @@ import mypy.modulefinder import mypy.nodes import mypy.options +import mypy.util import structlog from puya.logging_config import mypy_severity_to_loglevel @@ -194,9 +195,12 @@ def __add__(self, other: "SourceLocation | None") -> "SourceLocation": @attrs.frozen class ParseResult: - sources: list[ParseSource] + sources: Sequence[ParseSource] manager: mypy.build.BuildManager - graph: mypy.build.Graph + ordered_modules: Sequence[mypy.nodes.MypyFile] + """All discovered modules, topologically sorted by dependencies. + The sort order is from leaves (nodes without dependencies) to + roots (nodes on which no other nodes depend).""" def get_parse_sources( @@ -227,6 +231,8 @@ def get_parse_sources( def parse_and_typecheck(paths: Sequence[Path], mypy_options: mypy.options.Options) -> ParseResult: + from puya.errors import InternalError + mypy_fscache = mypy.fscache.FileSystemCache() # ensure we have the absolute, canonical paths to the files resolved_input_paths = {p.resolve() for p in paths} @@ -255,11 +261,47 @@ def parse_and_typecheck(paths: Sequence[Path], mypy_options: mypy.options.Option missing_module_names = {s.module_name for s in sources} - result.manager.modules.keys() if missing_module_names: # Note: this shouldn't happen, provided we've successfully disabled the mypy cache - raise Exception(f"mypy parse failed, missing modules: {', '.join(missing_module_names)}") + raise InternalError( + f"mypy parse failed, missing modules: {', '.join(missing_module_names)}" + ) + + # order modules by dependency, and also sanity check the contents + ordered_modules = [] + for scc_module_names in mypy.build.sorted_components(result.graph): + for module_name in scc_module_names: + module = result.manager.modules.get(module_name) + if module is None: + raise InternalError(f"mypy failed to parse: {module_name}") + if module_name != module.fullname: + raise InternalError( + f"mypy parsed wrong module, expected '{module_name}': {module.fullname}" + ) + if module.path and Path(module.path).is_dir(): + # this module is a module directory with no __init__.py, ie it contains + # nothing and is only in the graph as a reference + continue + ordered_modules.append(module) + # from mypy/util.py:decode_python_encoding + # check for BOM UTF-8 encoding + if module.path and not module.is_stub and module_name not in EMBEDDED_MODULES: + source = mypy_fscache.read(module.path) + if source.startswith(b"\xef\xbb\xbf"): + encoding = "utf8" + else: + # look at first two lines and check if PEP-263 coding is present + encoding, _ = mypy.util.find_python_encoding(source) + if encoding != "utf8": + logger.warning( + f"UH OH SPAGHETTI-O's," + f" darn tootin' non-utf8(?!) encoded file encountered:" + f" {make_path_relative_to_cwd(module.path)} encoded as {encoding}", + location=SourceLocation(file=module.path, line=1), + ) + return ParseResult( sources=sources, manager=result.manager, - graph=result.graph, + ordered_modules=ordered_modules, ) diff --git a/test_cases/constants/puya.log b/test_cases/constants/puya.log index d273719c68..86275dab82 100644 --- a/test_cases/constants/puya.log +++ b/test_cases/constants/puya.log @@ -1,4 +1,5 @@ debug: PuyaOptions(paths=['constants'], output_teal=True, output_arc32=True, output_awst=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, debug_level=1, optimization_level=1, log_level=, target_avm_version=10, locals_coalescing_strategy=) +constants/non_utf8.py:1 warning: UH OH SPAGHETTI-O's, darn tootin' non-utf8(?!) encoded file encountered: constants/non_utf8.py encoded as iso-8859-7 debug: Sealing block@0: // L11 debug: Terminated block@0: // L11 debug: Looking for 'required_budget_with_buffer' in an unsealed block creating an incomplete Phi: block@1: // while_top_L19 From bd8c129f1567f91a89b0ec6806fe02ea0e40bf5b Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 14:38:36 +0800 Subject: [PATCH 28/40] wip --- src/puya/awst_build/main.py | 5 ++- src/puya/ir/main.py | 4 +-- src/puya/parse.py | 65 +++++++++++++++++++++++++------------ tests/test_compile.py | 5 +-- 4 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/puya/awst_build/main.py b/src/puya/awst_build/main.py index 0a18bd0e2d..5c1475d651 100644 --- a/src/puya/awst_build/main.py +++ b/src/puya/awst_build/main.py @@ -30,10 +30,9 @@ def transform_ast(compile_context: CompileContext) -> dict[str, Module]: logger.debug(f"Skipping typeshed stub {module_rel_path}") else: logger.warning(f"Skipping stub: {module_rel_path}") - elif embedded_src := EMBEDDED_MODULES.get(module_name): + elif module_name in EMBEDDED_MODULES: logger.debug(f"Building AWST for embedded puyapy lib at {module_rel_path}") - module._fullname = embedded_src.puya_module_name # noqa: SLF001 - result[embedded_src.puya_module_name] = ModuleASTConverter(ctx, module).convert() + result[module_name] = ModuleASTConverter(ctx, module).convert() else: logger.debug(f"Discovered user module {module_name} at {module_rel_path}") user_modules[module_name] = ModuleASTConverter(ctx, module) diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py index 6748a5b3a3..bd9f3b912f 100644 --- a/src/puya/ir/main.py +++ b/src/puya/ir/main.py @@ -45,8 +45,8 @@ def build_module_irs( ) -> dict[str, list[Contract]]: embedded_funcs = [ func - for embedded_src in EMBEDDED_MODULES.values() - for func in module_asts[embedded_src.puya_module_name].body + for embedded_module_name in EMBEDDED_MODULES + for func in module_asts[embedded_module_name].body if isinstance(func, awst_nodes.Function) ] build_context: IRBuildContext = attrs_extend( diff --git a/src/puya/parse.py b/src/puya/parse.py index 66670096ec..088b685d5b 100644 --- a/src/puya/parse.py +++ b/src/puya/parse.py @@ -42,7 +42,7 @@ def from_path(cls, filename: str, *, module_override: str | None = None) -> typi ) -EMBEDDED_MODULES = { +_MYPY_EMBEDDED_MODULES = { es.mypy_module_name: es for es in ( EmbeddedSource.from_path("_puyapy_.py", module_override="puyapy"), @@ -51,6 +51,8 @@ def from_path(cls, filename: str, *, module_override: str | None = None) -> typi ) } +EMBEDDED_MODULES = tuple(es.puya_module_name for es in _MYPY_EMBEDDED_MODULES.values()) + @attrs.frozen class ParseSource: @@ -254,7 +256,7 @@ def parse_and_typecheck(paths: Sequence[Path], mypy_options: mypy.options.Option module=module.mypy_module_name, text=module.path.read_text("utf8"), ) - for module in EMBEDDED_MODULES.values() + for module in _MYPY_EMBEDDED_MODULES.values() ] ) result = _mypy_build(mypy_build_sources, mypy_options, mypy_fscache) @@ -276,27 +278,22 @@ def parse_and_typecheck(paths: Sequence[Path], mypy_options: mypy.options.Option raise InternalError( f"mypy parsed wrong module, expected '{module_name}': {module.fullname}" ) - if module.path and Path(module.path).is_dir(): + if not module.path: + raise InternalError(f"No path for module: {module_name}") + + if embedded_src := _MYPY_EMBEDDED_MODULES.get(module_name): + module._fullname = embedded_src.puya_module_name # noqa: SLF001 + module_path = embedded_src.path + else: + module_path = Path(module.path) + + if module_path.is_dir(): # this module is a module directory with no __init__.py, ie it contains # nothing and is only in the graph as a reference - continue - ordered_modules.append(module) - # from mypy/util.py:decode_python_encoding - # check for BOM UTF-8 encoding - if module.path and not module.is_stub and module_name not in EMBEDDED_MODULES: - source = mypy_fscache.read(module.path) - if source.startswith(b"\xef\xbb\xbf"): - encoding = "utf8" - else: - # look at first two lines and check if PEP-263 coding is present - encoding, _ = mypy.util.find_python_encoding(source) - if encoding != "utf8": - logger.warning( - f"UH OH SPAGHETTI-O's," - f" darn tootin' non-utf8(?!) encoded file encountered:" - f" {make_path_relative_to_cwd(module.path)} encoded as {encoding}", - location=SourceLocation(file=module.path, line=1), - ) + pass + else: + _check_encoding(mypy_fscache, module_path) + ordered_modules.append(module) return ParseResult( sources=sources, @@ -305,6 +302,32 @@ def parse_and_typecheck(paths: Sequence[Path], mypy_options: mypy.options.Option ) +def _check_encoding(mypy_fscache: mypy.fscache.FileSystemCache, module_path: Path) -> None: + module_rel_path = make_path_relative_to_cwd(module_path) + module_loc = SourceLocation(file=str(module_path), line=1) + try: + source = mypy_fscache.read(str(module_path)) + except OSError: + logger.warning( + f"Couldn't read source for {module_rel_path}", + location=module_loc, + ) + return + # below is based on mypy/util.py:decode_python_encoding + # check for BOM UTF-8 encoding + if source.startswith(b"\xef\xbb\xbf"): + return + # otherwise look at first two lines and check if PEP-263 coding is present + encoding, _ = mypy.util.find_python_encoding(source) + if encoding != "utf8": + logger.warning( + f"UH OH SPAGHETTI-O's," + f" darn tootin' non-utf8(?!) encoded file encountered:" + f" {module_rel_path} encoded as {encoding}", + location=module_loc, + ) + + def _mypy_build( sources: list[mypy.modulefinder.BuildSource], options: mypy.options.Options, diff --git a/tests/test_compile.py b/tests/test_compile.py index b55a9f8272..fec8bf5e1b 100644 --- a/tests/test_compile.py +++ b/tests/test_compile.py @@ -10,7 +10,6 @@ from puya.awst_build.main import output_awst from puya.logging_config import LogLevel from puya.options import PuyaOptions -from puya.parse import EMBEDDED_MODULES from tests import EXAMPLES_DIR, TEST_CASES_DIR, VCS_ROOT from tests.utils import APPROVAL_EXTENSIONS, compile_src @@ -69,9 +68,7 @@ def compile_test_case( # TODO: include this in compile_src if puya_options.output_awst: sources = tuple(str(s.path) for s in context.parse_result.sources) - for module_name, module in compile_result.module_awst.items(): - if module_name in EMBEDDED_MODULES: - continue + for module in compile_result.module_awst.values(): if module.source_file_path.startswith(sources): output_awst(module, puya_options) From 145741296d3125076816aa791e55196c3ff8c751 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 14:55:13 +0800 Subject: [PATCH 29/40] wip --- src/puya/awst_build/eb/contracts.py | 4 +- src/puya/awst_build/subroutine.py | 105 +++++++++++++++------------- 2 files changed, 59 insertions(+), 50 deletions(-) diff --git a/src/puya/awst_build/eb/contracts.py b/src/puya/awst_build/eb/contracts.py index 66efdd8fff..fb1164572c 100644 --- a/src/puya/awst_build/eb/contracts.py +++ b/src/puya/awst_build/eb/contracts.py @@ -1,3 +1,5 @@ +from collections.abc import Mapping + from puya.awst.nodes import ( AppStateExpression, InstanceSubroutineTarget, @@ -19,7 +21,7 @@ class ContractSelfExpressionBuilder(IntermediateExpressionBuilder): def __init__( self, context: ASTConversionModuleContext, - app_state: dict[str, AppStateDeclaration], + app_state: Mapping[str, AppStateDeclaration], location: SourceLocation, ): super().__init__(location) diff --git a/src/puya/awst_build/subroutine.py b/src/puya/awst_build/subroutine.py index 4e0aa3fa76..06562e4c06 100644 --- a/src/puya/awst_build/subroutine.py +++ b/src/puya/awst_build/subroutine.py @@ -1,6 +1,6 @@ import contextlib import typing -from collections.abc import Iterator, Sequence +from collections.abc import Iterator, Mapping, Sequence from functools import partialmethod import attrs @@ -102,7 +102,7 @@ class ContractMethodInfo: type_info: mypy.nodes.TypeInfo cref: ContractReference - app_state: dict[str, AppStateDeclaration] + app_state: Mapping[str, AppStateDeclaration] arc4_method_config: ARC4MethodConfig | None @@ -324,65 +324,72 @@ def visit_assignment_stmt(self, stmt: mypy.nodes.AssignmentStmt) -> Sequence[Sta ) return [] rvalue = require_expression_builder(stmt.rvalue.accept(self)) - # special no-op case if isinstance(rvalue, StateProxyDefinitionBuilder): - if self.contract_method_info is None: - raise CodeError( - f"{rvalue.python_name} should only be used inside a contract class", stmt_loc - ) - if len(stmt.lvalues) != 1: - raise CodeError( - f"{rvalue.python_name} can only be assigned to a single member variable", - stmt_loc, - ) - # note: we don't use resolve_lvalue here, because - # these types shouldn't be a valid lvalue target in any other instance - # except initial assignment - (lvalue,) = stmt.lvalues - lvalue_builder = require_expression_builder(lvalue.accept(self)) - if not ( - isinstance(lvalue_builder, StateProxyMemberBuilder) - and rvalue.kind == lvalue_builder.state_decl.kind - and rvalue.storage == lvalue_builder.state_decl.storage_wtype - ): - raise CodeError("Incompatible types on assignment", stmt_loc) - defn = rvalue.build_definition( - lvalue_builder.state_decl.member_name, lvalue_builder.source_location - ) - self.context.state_defs[self.contract_method_info.cref].append(defn) - if rvalue.initial_value is None: - return [] - elif defn.kind != AppStateKind.app_global: - raise InternalError( - f"Don't know how to do initialise-on-declaration" - f" for storage of kind {defn.kind}", - stmt_loc, - ) - else: - global_state_target = AppStateExpression( - field_name=defn.member_name, - wtype=defn.storage_wtype, - source_location=defn.source_location, - ) - return [ - AssignmentStatement( - target=global_state_target, - value=rvalue.initial_value, - source_location=stmt_loc, - ) - ] + return self._handle_state_proxy_assignment(rvalue, stmt.lvalues, stmt_loc) else: if len(stmt.lvalues) > 1: rvalue = temporary_assignment_if_required(rvalue) return [ AssignmentStatement( - source_location=stmt_loc, value=rvalue.build_assignment_source(), target=self.resolve_lvalue(lvalue), + source_location=stmt_loc, ) for lvalue in reversed(stmt.lvalues) ] + def _handle_state_proxy_assignment( + self, + rvalue: StateProxyDefinitionBuilder, + lvalues: list[mypy.nodes.Expression], + stmt_loc: SourceLocation, + ) -> Sequence[Statement]: + if self.contract_method_info is None: + raise CodeError( + f"{rvalue.python_name} should only be used inside a contract class", stmt_loc + ) + if len(lvalues) != 1: + raise CodeError( + f"{rvalue.python_name} can only be assigned to a single member variable", + stmt_loc, + ) + # note: we don't use resolve_lvalue here, because + # these types shouldn't be a valid lvalue target in any other instance + # except initial assignment + (lvalue,) = lvalues + lvalue_builder = require_expression_builder(lvalue.accept(self)) + if not ( + isinstance(lvalue_builder, StateProxyMemberBuilder) + and rvalue.kind == lvalue_builder.state_decl.kind + and rvalue.storage == lvalue_builder.state_decl.storage_wtype + ): + raise CodeError("Incompatible types on assignment", stmt_loc) + defn = rvalue.build_definition( + lvalue_builder.state_decl.member_name, lvalue_builder.source_location + ) + self.context.state_defs[self.contract_method_info.cref].append(defn) + if rvalue.initial_value is None: + return [] + elif defn.kind != AppStateKind.app_global: + raise InternalError( + f"Don't know how to do initialise-on-declaration" + f" for storage of kind {defn.kind}", + stmt_loc, + ) + else: + global_state_target = AppStateExpression( + field_name=defn.member_name, + wtype=defn.storage_wtype, + source_location=defn.source_location, + ) + return [ + AssignmentStatement( + target=global_state_target, + value=rvalue.initial_value, + source_location=stmt_loc, + ) + ] + def resolve_lvalue(self, lvalue: mypy.nodes.Expression) -> Lvalue: builder_or_literal = lvalue.accept(self) builder = require_expression_builder(builder_or_literal) From 0fe45f428f87e6575e9d2d526fbdfc38da018184 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 15:39:18 +0800 Subject: [PATCH 30/40] wip --- src/puyapy-stubs/_contract.pyi | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/src/puyapy-stubs/_contract.pyi b/src/puyapy-stubs/_contract.pyi index 27ed6e4a14..80033298d5 100644 --- a/src/puyapy-stubs/_contract.pyi +++ b/src/puyapy-stubs/_contract.pyi @@ -1,5 +1,4 @@ import abc -import dataclasses import typing from puyapy import UInt64, urange @@ -10,9 +9,8 @@ class Contract(abc.ABC): def __init_subclass__( cls, *, - name: typing.LiteralString | None = None, - scratch_slots: urange | tuple[int | urange, ...] | list[int | urange] = (), - reserve_state: ReserveState = ReserveState(), + name: typing.LiteralString = ..., + scratch_slots: urange | tuple[int | urange, ...] | list[int | urange] = ..., **kwargs: object, ): """ @@ -39,13 +37,7 @@ class Contract(abc.ABC): to have overlapping ranges or values either, so if a base class contract reserves slots 0-5 inclusive and the derived contract reserves 5-10 inclusive, then within the derived contract all slots 0-10 will be marked as reserved. - - :param reserve_state: when using global or local state through one of the provided PuyaPy - abstractions (i.e. assigning to `self.`, either as a raw value for global state or with - puyapy.GlobalState or puyapy.LocalState), these are tallied up and automatically counted - to put the correct """ - # TODO: finish the above docstring @abc.abstractmethod def approval_program(self) -> UInt64 | bool: """Represents the program called for all transactions @@ -53,12 +45,3 @@ class Contract(abc.ABC): @abc.abstractmethod def clear_state_program(self) -> UInt64 | bool: """Represents the program called when `OnCompletion` == `ClearState`""" - -@dataclasses.dataclass(frozen=True) -class ReserveState: - """Optionally reserve""" - - global_uint64: int | None = None - global_bytes: int | None = None - local_uint64: int | None = None - local_bytes: int | None = None From d52b93aa114e513128770be093bce816cb806029 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 15:45:10 +0800 Subject: [PATCH 31/40] wip --- src/puya/ir/arc4_router.py | 8 +++++--- src/puya/ir/main.py | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/puya/ir/arc4_router.py b/src/puya/ir/arc4_router.py index 240a8d27c1..2b1610cc5f 100644 --- a/src/puya/ir/arc4_router.py +++ b/src/puya/ir/arc4_router.py @@ -1,4 +1,5 @@ import itertools +from collections.abc import Mapping from typing import Iterable, Sequence from puya.arc4_util import get_abi_signature, wtype_to_arc4 @@ -775,8 +776,8 @@ def create_abi_router( contract: awst_nodes.ContractFragment, arc4_methods_with_configs: dict[awst_nodes.ContractMethod, ARC4MethodConfig], *, - global_state: list[ContractState], - local_state: list[ContractState], + global_state: Mapping[str, ContractState], + local_state: Mapping[str, ContractState], ) -> tuple[awst_nodes.ContractMethod, list[ARC4Method]]: abi_methods = {} bare_methods = {} @@ -805,7 +806,8 @@ def create_abi_router( router = list(route_abi_methods(router_location, abi_methods).body) known_sources: dict[str, ContractState | awst_nodes.ContractMethod] = { - s.name: s for s in itertools.chain(global_state, local_state) + **global_state, + **local_state, } for method in arc4_methods_with_configs: known_sources[method.name] = method diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py index bd9f3b912f..700f213aea 100644 --- a/src/puya/ir/main.py +++ b/src/puya/ir/main.py @@ -297,8 +297,8 @@ def fold_state_and_special_methods( result.approval_program, result.arc4_methods = create_abi_router( contract, arc4_method_refs, - local_state=list(result.local_state.values()), # TODO: pass mappings - global_state=list(result.global_state.values()), + local_state=result.local_state, + global_state=result.global_state, ) if not result.clear_program: result.clear_program = create_default_clear_state(contract) From aa0727a20f6ae00268ab3909355f41356af1cca0 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 16:31:05 +0800 Subject: [PATCH 32/40] linting --- src/puya/ir/arc4_router.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/puya/ir/arc4_router.py b/src/puya/ir/arc4_router.py index 2b1610cc5f..caa26a3d7c 100644 --- a/src/puya/ir/arc4_router.py +++ b/src/puya/ir/arc4_router.py @@ -1,4 +1,3 @@ -import itertools from collections.abc import Mapping from typing import Iterable, Sequence From 3826e16d09dcf3badf83fd36bb31ef0eadb65585 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 16:37:18 +0800 Subject: [PATCH 33/40] fix doc generation issue --- src/puyapy-stubs/_state.pyi | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/puyapy-stubs/_state.pyi b/src/puyapy-stubs/_state.pyi index 343bf39562..8b0fc0ec80 100644 --- a/src/puyapy-stubs/_state.pyi +++ b/src/puyapy-stubs/_state.pyi @@ -2,14 +2,14 @@ import typing from puyapy import Account, Bytes, BytesBacked, UInt64 -_T = typing.TypeVar("_T", bound=UInt64 | Bytes | BytesBacked) +_TState = typing.TypeVar("_TState", bound=UInt64 | Bytes | BytesBacked) -class LocalState(typing.Generic[_T]): +class LocalState(typing.Generic[_TState]): """Local state associated with the application and an account""" def __init__( self, - type_: type[_T], + type_: type[_TState], /, *, key: bytes | typing.LiteralString | None = None, @@ -21,14 +21,14 @@ class LocalState(typing.Generic[_T]): self.names = LocalState(puyapy.Bytes) ``` """ - def __getitem__(self, account: Account | UInt64 | int) -> _T: + def __getitem__(self, account: Account | UInt64 | int) -> _TState: """Data can be accessed by an `Account` reference or foreign account index ```python account_name = self.names[account] ``` """ - def __setitem__(self, account: Account | UInt64 | int, value: _T) -> None: + def __setitem__(self, account: Account | UInt64 | int, value: _TState) -> None: """Data can be stored by using an `Account` reference or foreign account index ```python @@ -49,7 +49,7 @@ class LocalState(typing.Generic[_T]): assert account in self.names ``` """ - def get(self, account: Account | UInt64 | int, default: _T) -> _T: + def get(self, account: Account | UInt64 | int, default: _TState) -> _TState: """Can retrieve value using an `Account` reference or foreign account index, and a fallback default value. @@ -57,7 +57,7 @@ class LocalState(typing.Generic[_T]): name = self.names.get(account, Bytes(b"no name") ``` """ - def maybe(self, account: Account | UInt64 | int) -> tuple[_T, bool]: + def maybe(self, account: Account | UInt64 | int) -> tuple[_TState, bool]: """Can retrieve value, and a bool indicating if the value was present using an `Account` reference or foreign account index. @@ -68,7 +68,7 @@ class LocalState(typing.Generic[_T]): ``` """ -class GlobalState(typing.Generic[_T]): +class GlobalState(typing.Generic[_TState]): """Global state associated with the application, the key will be the name of the member, this is assigned to @@ -83,7 +83,7 @@ class GlobalState(typing.Generic[_T]): @typing.overload def __init__( self, - type_: type[_T], + type_: type[_TState], /, *, key: bytes | typing.LiteralString | None = None, @@ -93,14 +93,14 @@ class GlobalState(typing.Generic[_T]): @typing.overload def __init__( self, - initial_value: _T, + initial_value: _TState, /, key: typing.LiteralString | bytes | None = None, description: typing.LiteralString | None = None, ) -> None: """Declare the global state key and initialize its value""" @property - def value(self) -> _T: + def value(self) -> _TState: """Returns the value or and error if the value is not set ```python @@ -108,7 +108,7 @@ class GlobalState(typing.Generic[_T]): ``` """ @value.setter - def value(self, value: _T) -> None: + def value(self, value: _TState) -> None: """Sets the value ```python @@ -125,14 +125,14 @@ class GlobalState(typing.Generic[_T]): """ def __bool__(self) -> bool: """Returns `True` if the key has a value set, regardless of the truthiness of that value""" - def get(self, default: _T) -> _T: + def get(self, default: _TState) -> _TState: """Returns the value or `default` if no value is set ```python name = self.name.get(Bytes(b"no name") ``` """ - def maybe(self) -> tuple[_T, bool]: + def maybe(self) -> tuple[_TState, bool]: """Returns the value, and a bool ```python From 2466ea9e9b4dea5661b5b7175de9368cc22a1459 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 16:52:49 +0800 Subject: [PATCH 34/40] use auction contract as a test case for state with custom key/descriptions --- examples/auction/contract.py | 2 +- examples/auction/out/Auction.approval.mir | 10 +++++----- examples/auction/out/Auction.approval.teal | 6 +++--- examples/auction/out/Auction.arc32.json | 5 +++-- examples/auction/out/Auction.destructured.ir | 6 +++--- examples/auction/out/Auction.ssa.ir | 6 +++--- examples/auction/out/Auction.ssa.opt_pass_1.ir | 6 +++--- examples/auction/out/contract.awst | 2 +- examples/auction/out_O2/Auction.approval.teal | 6 +++--- examples/auction/out_O2/Auction.destructured.ir | 6 +++--- examples/auction/out_unoptimized/Auction.approval.teal | 6 +++--- .../auction/out_unoptimized/Auction.destructured.ir | 6 +++--- examples/sizes.txt | 2 +- 13 files changed, 35 insertions(+), 34 deletions(-) diff --git a/examples/auction/contract.py b/examples/auction/contract.py index ad28ac7051..3944b80c9d 100644 --- a/examples/auction/contract.py +++ b/examples/auction/contract.py @@ -20,7 +20,7 @@ def __init__(self) -> None: self.asa = Asset(0) # Use zero address rather than an empty string for Account type safety self.previous_bidder = Global.zero_address - self.claimable_amount = LocalState(UInt64) + self.claimable_amount = LocalState(UInt64, key="claim", description="The claimable amount") @arc4.abimethod def opt_into_asset(self, asset: Asset) -> None: diff --git a/examples/auction/out/Auction.approval.mir b/examples/auction/out/Auction.approval.mir index ec079d1abc..4b823fc84d 100644 --- a/examples/auction/out/Auction.approval.mir +++ b/examples/auction/out/Auction.approval.mir @@ -379,8 +379,8 @@ bid_block@0: txn Sender // (𝕡) pay#0 | tmp%7#0,{txn} unt\nself.claimable_amount[Txn.sender auction/contract.py:80-81 // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) pay#0 | tmp%7#0,tmp%14#0 unt\nself.claimable_amount[Txn.sender auction/contract.py:80-81 // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pay#0 | tmp%7#0,tmp%14#0 # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 - byte "claimable_amount" // (𝕡) pay#0 | tmp%7#0,tmp%14#0,"claimable_amount" # Update claimable amount\nself.claimable_amount[Txn.sender] auction/contract.py:80-81 - uncover 2 // load tmp%7#0 from l-stack (no copy) (𝕡) pay#0 | tmp%14#0,"claimable_amount",tmp%7#0 # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 + byte "claim" // (𝕡) pay#0 | tmp%7#0,tmp%14#0,"claim" # Update claimable amount\nself.claimable_amount[Txn.sender] auction/contract.py:80-81 + uncover 2 // load tmp%7#0 from l-stack (no copy) (𝕡) pay#0 | tmp%14#0,"claim",tmp%7#0 # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 app_local_put // (𝕡) pay#0 | # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 retsub // @@ -394,7 +394,7 @@ claim_bids_block@0: // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender auction/contract.py:85 // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 self.claimable_amount[Txn.sender] auction/contract.py:85 int 0 // tmp%0#0,0 self.claimable_amount[Txn.sender] auction/contract.py:85 - byte "claimable_amount" // tmp%0#0,0,"claimable_amount" self.claimable_amount[Txn.sender] auction/contract.py:85 + byte "claim" // tmp%0#0,0,"claim" self.claimable_amount[Txn.sender] auction/contract.py:85 app_local_get_ex // {app_local_get_ex}.0,{app_local_get_ex}.1 self.claimable_amount[Txn.sender] auction/contract.py:85 swap // store app_local_get_ex_did_exist%2#0 to l-stack (no copy) app_local_get_ex_did_exist%2#0,{app_local_get_ex}.0 self.claimable_amount[Txn.sender] auction/contract.py:85 dup @@ -456,8 +456,8 @@ claim_bids_after_if_else@2: txn Sender // (𝕗) original_amount#0,amount#1 | new_state_value%12#0,{txn} Txn.sender auction/contract.py:97 // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0 Txn.sender auction/contract.py:97 // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0 self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 - byte "claimable_amount" // (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0,"claimable_amount" self.claimable_amount[Txn.sender] auction/contract.py:97 - uncover 2 // load new_state_value%12#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | tmp%13#0,"claimable_amount",new_state_value%12#0 self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 + byte "claim" // (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0,"claim" self.claimable_amount[Txn.sender] auction/contract.py:97 + uncover 2 // load new_state_value%12#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | tmp%13#0,"claim",new_state_value%12#0 self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 app_local_put // (𝕗) original_amount#0,amount#1 | self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 retsub // diff --git a/examples/auction/out/Auction.approval.teal b/examples/auction/out/Auction.approval.teal index 7a8f2edf8e..a6bddda62d 100644 --- a/examples/auction/out/Auction.approval.teal +++ b/examples/auction/out/Auction.approval.teal @@ -332,7 +332,7 @@ bid: // # Update claimable amount // self.claimable_amount[Txn.sender] = pay.amount txn Sender - byte "claimable_amount" + byte "claim" uncover 2 app_local_put retsub @@ -348,7 +348,7 @@ claim_bids: // amount = original_amount = self.claimable_amount[Txn.sender] txn Sender int 0 - byte "claimable_amount" + byte "claim" app_local_get_ex swap dup @@ -411,7 +411,7 @@ claim_bids_after_if_else@2: swap - txn Sender - byte "claimable_amount" + byte "claim" uncover 2 app_local_put retsub diff --git a/examples/auction/out/Auction.arc32.json b/examples/auction/out/Auction.arc32.json index 00df83a1a4..c09d2b8890 100644 --- a/examples/auction/out/Auction.arc32.json +++ b/examples/auction/out/Auction.arc32.json @@ -32,7 +32,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9lbnRyeXBvaW50QDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fZW50cnlwb2ludEAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEyCiAgICBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiCiAgICBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIgogICAgbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICBtZXRob2QgImJpZChwYXkpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2ludG9fYXNzZXRfcm91dGVANCBtYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANSBtYWluX29wdF9pbl9yb3V0ZUA2IG1haW5fYmlkX3JvdXRlQDcgbWFpbl9jbGFpbV9iaWRzX3JvdXRlQDggbWFpbl9jbGFpbV9hc3NldF9yb3V0ZUA5CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTUKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fb3B0X2luX3JvdXRlQDY6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JpZF9yb3V0ZUA3OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBiaWQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYmlkc19yb3V0ZUA4OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltX2JpZHMKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYXNzZXRfcm91dGVAOToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xhaW1fYXNzZXQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmFzc2V0X2lkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludCAwCiAgICBieXRlICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzYSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBBU0EgYWxyZWFkeSBvcHRlZCBpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozMS0zMgogICAgLy8gIyBTYXZlIEFTQSBJRCBpbiBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhID0gYXNzZXQKICAgIGJ5dGUgImFzYSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzQtMzkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM1CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM5CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogYnl0ZXMsIGxlbmd0aDogYnl0ZXMsIGF4ZmVyOiB1aW50NjQpIC0+IHZvaWQ6CnN0YXJ0X2F1Y3Rpb246CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQxLTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzdGFydF9hdWN0aW9uKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc3RhcnRpbmdfcHJpY2U6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYXhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBhdWN0aW9uIG11c3QgYmUgc3RhcnRlZCBieSBjcmVhdG9yCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUwLTUxCiAgICAvLyAjIEVuc3VyZSB0aGUgYXVjdGlvbiBoYXNuJ3QgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKICAgIC8vIGFzc2VydCBzZWxmLmF1Y3Rpb25fZW5kID09IDAsICJhdWN0aW9uIGFscmVhZHkgc3RhcnRlZCIKICAgIGludCAwCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTUKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUzLTU2CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU4LTU5CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZSAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGguZGVjb2RlKCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgKwogICAgYnl0ZSAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLm9wdF9pbigpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYmlkKHBheTogdWludDY0KSAtPiB2b2lkOgpiaWQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjY3LTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBiaWQoc2VsZiwgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2OS03MAogICAgLy8gIyBFbnN1cmUgYXVjdGlvbiBoYXNuJ3QgZW5kZWQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuYXVjdGlvbl9lbmQsICJhdWN0aW9uIGhhcyBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludCAwCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzQKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkIGV4aXN0cwogICAgZGlnIDEKICAgIDwKICAgIGFzc2VydCAvLyBCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzYtNzcKICAgIC8vICMgc2V0IGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBwYXkuYW1vdW50CiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzgKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkZGVyID0gcGF5LnNlbmRlcgogICAgYnl0ZSAicHJldmlvdXNfYmlkZGVyIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MC04MQogICAgLy8gIyBVcGRhdGUgY2xhaW1hYmxlIGFtb3VudAogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gcGF5LmFtb3VudAogICAgdHhuIFNlbmRlcgogICAgYnl0ZSAiY2xhaW1hYmxlX2Ftb3VudCIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2JpZHMoKSAtPiB2b2lkOgpjbGFpbV9iaWRzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYmlkcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBhbW91bnQgPSBvcmlnaW5hbF9hbW91bnQgPSBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0KICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJjbGFpbWFibGVfYW1vdW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBjbGFpbWFibGVfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Ny04OAogICAgLy8gIyBzdWJ0cmFjdCBwcmV2aW91cyBiaWQgaWYgc2VuZGVyIGlzIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLnByZXZpb3VzX2JpZGRlcjoKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHByZXZpb3VzX2JpZGRlciBleGlzdHMKICAgID09CiAgICBieiBjbGFpbV9iaWRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4OQogICAgLy8gYW1vdW50IC09IHNlbGYucHJldmlvdXNfYmlkCiAgICBpbnQgMAogICAgYnl0ZSAicHJldmlvdXNfYmlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBwcmV2aW91c19iaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpjbGFpbV9iaWRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTEtOTUKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MQogICAgLy8gaXR4bi5QYXltZW50KAogICAgaW50IHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gZmVlPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkxLTk1CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXSA9IG9yaWdpbmFsX2Ftb3VudCAtIGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIHR4biBTZW5kZXIKICAgIGJ5dGUgImNsYWltYWJsZV9hbW91bnQiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbGFpbV9hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAxCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgbm90IGVuZGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50IDAKICAgIGJ5dGUgImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAyLTEwOQogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIGludCAwCiAgICBieXRlICJhc2FfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc2FfYW1vdW50IGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDYKICAgIC8vIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDItMTAzCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gZmVlPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAyLTEwOQogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gc2VsZi5hdWN0aW9uX2VuZCA9IFVJbnQ2NCgwKQogICAgYnl0ZSAiYXVjdGlvbl9lbmQiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkID0gVUludDY0KDApCiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTkKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZSAiYXNhX2Ftb3VudCIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyMAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgwKQogICAgYnl0ZSAiYXNhIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIxLTIyCiAgICAvLyAjIFVzZSB6ZXJvIGFkZHJlc3MgcmF0aGVyIHRoYW4gYW4gZW1wdHkgc3RyaW5nIGZvciBBY2NvdW50IHR5cGUgc2FmZXR5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9lbnRyeXBvaW50QDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fZW50cnlwb2ludEAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEyCiAgICBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiCiAgICBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIgogICAgbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICBtZXRob2QgImJpZChwYXkpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIKICAgIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2ludG9fYXNzZXRfcm91dGVANCBtYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANSBtYWluX29wdF9pbl9yb3V0ZUA2IG1haW5fYmlkX3JvdXRlQDcgbWFpbl9jbGFpbV9iaWRzX3JvdXRlQDggbWFpbl9jbGFpbV9hc3NldF9yb3V0ZUA5CiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTUKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3N0YXJ0X2F1Y3Rpb25fcm91dGVANToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludCAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnQgYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fb3B0X2luX3JvdXRlQDY6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JpZF9yb3V0ZUA3OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50IDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludCBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBiaWQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYmlkc19yb3V0ZUA4OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltX2JpZHMKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1fYXNzZXRfcm91dGVAOToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xhaW1fYXNzZXQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNQogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIHJlamVjdCB0cmFuc2FjdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50IDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmFzc2V0X2lkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludCAwCiAgICBieXRlICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIGFzYSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBBU0EgYWxyZWFkeSBvcHRlZCBpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozMS0zMgogICAgLy8gIyBTYXZlIEFTQSBJRCBpbiBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhID0gYXNzZXQKICAgIGJ5dGUgImFzYSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzQtMzkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM1CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM5CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogYnl0ZXMsIGxlbmd0aDogYnl0ZXMsIGF4ZmVyOiB1aW50NjQpIC0+IHZvaWQ6CnN0YXJ0X2F1Y3Rpb246CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQxLTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzdGFydF9hdWN0aW9uKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc3RhcnRpbmdfcHJpY2U6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYXhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBhdWN0aW9uIG11c3QgYmUgc3RhcnRlZCBieSBjcmVhdG9yCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUwLTUxCiAgICAvLyAjIEVuc3VyZSB0aGUgYXVjdGlvbiBoYXNuJ3QgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKICAgIC8vIGFzc2VydCBzZWxmLmF1Y3Rpb25fZW5kID09IDAsICJhdWN0aW9uIGFscmVhZHkgc3RhcnRlZCIKICAgIGludCAwCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTUKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUzLTU2CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU4LTU5CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZSAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGguZGVjb2RlKCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgKwogICAgYnl0ZSAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZS5kZWNvZGUoKQogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLm9wdF9pbigpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYmlkKHBheTogdWludDY0KSAtPiB2b2lkOgpiaWQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjY3LTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBiaWQoc2VsZiwgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2OS03MAogICAgLy8gIyBFbnN1cmUgYXVjdGlvbiBoYXNuJ3QgZW5kZWQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuYXVjdGlvbl9lbmQsICJhdWN0aW9uIGhhcyBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludCAwCiAgICBieXRlICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzQKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkIGV4aXN0cwogICAgZGlnIDEKICAgIDwKICAgIGFzc2VydCAvLyBCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzYtNzcKICAgIC8vICMgc2V0IGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBwYXkuYW1vdW50CiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzgKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkZGVyID0gcGF5LnNlbmRlcgogICAgYnl0ZSAicHJldmlvdXNfYmlkZGVyIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MC04MQogICAgLy8gIyBVcGRhdGUgY2xhaW1hYmxlIGFtb3VudAogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gcGF5LmFtb3VudAogICAgdHhuIFNlbmRlcgogICAgYnl0ZSAiY2xhaW0iCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9iaWRzKCkgLT4gdm9pZDoKY2xhaW1fYmlkczoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODMtODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsYWltX2JpZHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4NQogICAgLy8gYW1vdW50ID0gb3JpZ2luYWxfYW1vdW50ID0gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdCiAgICB0eG4gU2VuZGVyCiAgICBpbnQgMAogICAgYnl0ZSAiY2xhaW0iCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIGNsYWltYWJsZV9hbW91bnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg3LTg4CiAgICAvLyAjIHN1YnRyYWN0IHByZXZpb3VzIGJpZCBpZiBzZW5kZXIgaXMgcHJldmlvdXMgYmlkZGVyCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYucHJldmlvdXNfYmlkZGVyOgogICAgdHhuIFNlbmRlcgogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgPT0KICAgIGJ6IGNsYWltX2JpZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBhbW91bnQgLT0gc2VsZi5wcmV2aW91c19iaWQKICAgIGludCAwCiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHByZXZpb3VzX2JpZCBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9idXJ5IDEKCmNsYWltX2JpZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MS05NQogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gICAgIGFtb3VudD1hbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTQKICAgIC8vIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnQgcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBmZWU9MCwKICAgIGludCAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTEtOTUKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NwogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gb3JpZ2luYWxfYW1vdW50IC0gYW1vdW50CiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgLQogICAgdHhuIFNlbmRlcgogICAgYnl0ZSAiY2xhaW0iCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbGFpbV9hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAxCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgbm90IGVuZGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50IDAKICAgIGJ5dGUgImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAyLTEwOQogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIGludCAwCiAgICBieXRlICJhc2FfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBhc2FfYW1vdW50IGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDYKICAgIC8vIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50IDAKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgcHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDItMTAzCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50IGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gZmVlPTAsCiAgICBpbnQgMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAyLTEwOQogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gc2VsZi5hdWN0aW9uX2VuZCA9IFVJbnQ2NCgwKQogICAgYnl0ZSAiYXVjdGlvbl9lbmQiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkID0gVUludDY0KDApCiAgICBieXRlICJwcmV2aW91c19iaWQiCiAgICBpbnQgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTkKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZSAiYXNhX2Ftb3VudCIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyMAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgwKQogICAgYnl0ZSAiYXNhIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIxLTIyCiAgICAvLyAjIFVzZSB6ZXJvIGFkZHJlc3MgcmF0aGVyIHRoYW4gYW4gZW1wdHkgc3RyaW5nIGZvciBBY2NvdW50IHR5cGUgc2FmZXR5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGJ5dGUgInByZXZpb3VzX2JpZGRlciIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTIwCiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIHJldHVybgo=" }, "state": { @@ -75,7 +75,8 @@ "declared": { "claimable_amount": { "type": "uint64", - "key": "claimable_amount" + "key": "claim", + "descr": "The claimable amount" } }, "reserved": {} diff --git a/examples/auction/out/Auction.destructured.ir b/examples/auction/out/Auction.destructured.ir index 43e28c628b..2ae9caf703 100644 --- a/examples/auction/out/Auction.destructured.ir +++ b/examples/auction/out/Auction.destructured.ir @@ -155,13 +155,13 @@ contract examples.auction.contract.Auction: (app_global_put "previous_bid" tmp%7#0) (app_global_put "previous_bidder" tmp%4#0) let tmp%14#0: bytes = (txn Sender) - (app_local_put tmp%14#0 "claimable_amount" tmp%7#0) + (app_local_put tmp%14#0 "claim" tmp%7#0) return subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") + let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") @@ -184,7 +184,7 @@ contract examples.auction.contract.Auction: itxn_submit let new_state_value%12#0: uint64 = (- original_amount#0 amount#1) let tmp%13#0: bytes = (txn Sender) - (app_local_put tmp%13#0 "claimable_amount" new_state_value%12#0) + (app_local_put tmp%13#0 "claim" new_state_value%12#0) return subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: diff --git a/examples/auction/out/Auction.ssa.ir b/examples/auction/out/Auction.ssa.ir index 0a9b138798..4ecd00781c 100644 --- a/examples/auction/out/Auction.ssa.ir +++ b/examples/auction/out/Auction.ssa.ir @@ -286,13 +286,13 @@ contract examples.auction.contract.Auction: (app_global_put "previous_bidder" new_state_value%12#0) let new_state_value%13#0: uint64 = ((gtxns Amount) pay#0) let tmp%14#0: bytes = (txn Sender) - (app_local_put tmp%14#0 "claimable_amount" new_state_value%13#0) + (app_local_put tmp%14#0 "claim" new_state_value%13#0) return subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") + let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let awst_tmp%3#0: uint64 = app_local_get_ex_value%1#0 let original_amount#0: uint64 = awst_tmp%3#0 @@ -436,7 +436,7 @@ contract examples.auction.contract.Auction: let submit_result_0%10%%XferAsset#0: uint64 = (itxn XferAsset) let new_state_value%12#0: uint64 = (- original_amount#0 amount#2) let tmp%13#0: bytes = (txn Sender) - (app_local_put tmp%13#0 "claimable_amount" new_state_value%12#0) + (app_local_put tmp%13#0 "claim" new_state_value%12#0) return subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: diff --git a/examples/auction/out/Auction.ssa.opt_pass_1.ir b/examples/auction/out/Auction.ssa.opt_pass_1.ir index 0e759becc8..4aa963c7ae 100644 --- a/examples/auction/out/Auction.ssa.opt_pass_1.ir +++ b/examples/auction/out/Auction.ssa.opt_pass_1.ir @@ -155,13 +155,13 @@ contract examples.auction.contract.Auction: (app_global_put "previous_bid" tmp%7#0) (app_global_put "previous_bidder" tmp%4#0) let tmp%14#0: bytes = (txn Sender) - (app_local_put tmp%14#0 "claimable_amount" tmp%7#0) + (app_local_put tmp%14#0 "claim" tmp%7#0) return subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") + let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") @@ -184,7 +184,7 @@ contract examples.auction.contract.Auction: itxn_submit let new_state_value%12#0: uint64 = (- original_amount#0 amount#2) let tmp%13#0: bytes = (txn Sender) - (app_local_put tmp%13#0 "claimable_amount" new_state_value%12#0) + (app_local_put tmp%13#0 "claim" new_state_value%12#0) return subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: diff --git a/examples/auction/out/contract.awst b/examples/auction/out/contract.awst index 1b008fa139..651fad329e 100644 --- a/examples/auction/out/contract.awst +++ b/examples/auction/out/contract.awst @@ -8,7 +8,7 @@ contract Auction ['previous_bidder']: puyapy.Account } locals { - ['claimable_amount']: puyapy.UInt64 + ['claim']: puyapy.UInt64 } constructor() diff --git a/examples/auction/out_O2/Auction.approval.teal b/examples/auction/out_O2/Auction.approval.teal index da8cfba6f7..995cf9f002 100644 --- a/examples/auction/out_O2/Auction.approval.teal +++ b/examples/auction/out_O2/Auction.approval.teal @@ -218,7 +218,7 @@ bid: uncover 2 app_global_put txn Sender - byte "claimable_amount" + byte "claim" uncover 2 app_local_put retsub @@ -229,7 +229,7 @@ claim_bids: proto 0 0 txn Sender int 0 - byte "claimable_amount" + byte "claim" app_local_get_ex swap dup @@ -267,7 +267,7 @@ claim_bids_after_if_else@2: swap - txn Sender - byte "claimable_amount" + byte "claim" uncover 2 app_local_put retsub diff --git a/examples/auction/out_O2/Auction.destructured.ir b/examples/auction/out_O2/Auction.destructured.ir index 43e28c628b..2ae9caf703 100644 --- a/examples/auction/out_O2/Auction.destructured.ir +++ b/examples/auction/out_O2/Auction.destructured.ir @@ -155,13 +155,13 @@ contract examples.auction.contract.Auction: (app_global_put "previous_bid" tmp%7#0) (app_global_put "previous_bidder" tmp%4#0) let tmp%14#0: bytes = (txn Sender) - (app_local_put tmp%14#0 "claimable_amount" tmp%7#0) + (app_local_put tmp%14#0 "claim" tmp%7#0) return subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") + let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") @@ -184,7 +184,7 @@ contract examples.auction.contract.Auction: itxn_submit let new_state_value%12#0: uint64 = (- original_amount#0 amount#1) let tmp%13#0: bytes = (txn Sender) - (app_local_put tmp%13#0 "claimable_amount" new_state_value%12#0) + (app_local_put tmp%13#0 "claim" new_state_value%12#0) return subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: diff --git a/examples/auction/out_unoptimized/Auction.approval.teal b/examples/auction/out_unoptimized/Auction.approval.teal index 32376c419d..7c2715b702 100644 --- a/examples/auction/out_unoptimized/Auction.approval.teal +++ b/examples/auction/out_unoptimized/Auction.approval.teal @@ -369,7 +369,7 @@ bid: frame_dig -1 gtxns Amount txn Sender - byte "claimable_amount" + byte "claim" uncover 2 app_local_put retsub @@ -385,7 +385,7 @@ claim_bids: // amount = original_amount = self.claimable_amount[Txn.sender] txn Sender int 0 - byte "claimable_amount" + byte "claim" app_local_get_ex assert // check claimable_amount exists for account dup @@ -450,7 +450,7 @@ claim_bids_after_if_else@2: frame_dig 1 - txn Sender - byte "claimable_amount" + byte "claim" uncover 2 app_local_put retsub diff --git a/examples/auction/out_unoptimized/Auction.destructured.ir b/examples/auction/out_unoptimized/Auction.destructured.ir index 2fd05b6cc8..a96f975008 100644 --- a/examples/auction/out_unoptimized/Auction.destructured.ir +++ b/examples/auction/out_unoptimized/Auction.destructured.ir @@ -175,13 +175,13 @@ contract examples.auction.contract.Auction: (app_global_put "previous_bidder" new_state_value%12#0) let new_state_value%13#0: uint64 = ((gtxns Amount) pay#0) let tmp%14#0: bytes = (txn Sender) - (app_local_put tmp%14#0 "claimable_amount" new_state_value%13#0) + (app_local_put tmp%14#0 "claim" new_state_value%13#0) return subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claimable_amount") + let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account let awst_tmp%3#0: uint64 = app_local_get_ex_value%1#0 let original_amount#0: uint64 = awst_tmp%3#0 @@ -214,7 +214,7 @@ contract examples.auction.contract.Auction: itxn_submit let new_state_value%12#0: uint64 = (- original_amount#0 amount#0) let tmp%13#0: bytes = (txn Sender) - (app_local_put tmp%13#0 "claimable_amount" new_state_value%12#0) + (app_local_put tmp%13#0 "claim" new_state_value%12#0) return subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: diff --git a/examples/sizes.txt b/examples/sizes.txt index 921f1ee02e..76b7b8f213 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -13,7 +13,7 @@ arc4_types/Arc4StructsFromAnotherModule 67 12 12 arc4_types/Arc4StructsType 283 225 225 arc4_types/Arc4TuplesType 799 207 207 asset/Reference 259 252 252 -auction/Auction 575 534 534 +auction/Auction 564 523 523 augmented_assignment/Augmented 159 158 158 avm_types_in_abi/Test 226 181 181 biguint_binary_ops/BiguintBinaryOps 280 216 216 From 41b13e5875417e272d15423c4259c32c3b0fe522 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 1 Mar 2024 17:06:26 +0800 Subject: [PATCH 35/40] add test case that exercises all the custom key/description options --- examples/sizes.txt | 1 + test_cases/state_proxies/contract.py | 15 + .../out/StateProxyContract.approval.mir | 78 +++ .../out/StateProxyContract.approval.teal | 67 +++ .../out/StateProxyContract.arc32.json | 69 +++ .../out/StateProxyContract.clear.mir | 9 + .../out/StateProxyContract.clear.teal | 7 + .../out/StateProxyContract.destructured.ir | 40 ++ .../out/StateProxyContract.ssa.ir | 44 ++ .../out/StateProxyContract.ssa.opt_pass_1.ir | 40 ++ test_cases/state_proxies/out/contract.awst | 23 + .../out_O2/StateProxyContract.approval.teal | 50 ++ .../out_O2/StateProxyContract.clear.teal | 5 + .../out_O2/StateProxyContract.destructured.ir | 40 ++ .../StateProxyContract.approval.teal | 73 +++ .../StateProxyContract.clear.teal | 7 + .../StateProxyContract.destructured.ir | 44 ++ test_cases/state_proxies/puya.log | 446 ++++++++++++++++++ tests/test_arc32.py | 12 + 19 files changed, 1070 insertions(+) create mode 100644 test_cases/state_proxies/contract.py create mode 100644 test_cases/state_proxies/out/StateProxyContract.approval.mir create mode 100644 test_cases/state_proxies/out/StateProxyContract.approval.teal create mode 100644 test_cases/state_proxies/out/StateProxyContract.arc32.json create mode 100644 test_cases/state_proxies/out/StateProxyContract.clear.mir create mode 100644 test_cases/state_proxies/out/StateProxyContract.clear.teal create mode 100644 test_cases/state_proxies/out/StateProxyContract.destructured.ir create mode 100644 test_cases/state_proxies/out/StateProxyContract.ssa.ir create mode 100644 test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir create mode 100644 test_cases/state_proxies/out/contract.awst create mode 100644 test_cases/state_proxies/out_O2/StateProxyContract.approval.teal create mode 100644 test_cases/state_proxies/out_O2/StateProxyContract.clear.teal create mode 100644 test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir create mode 100644 test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal create mode 100644 test_cases/state_proxies/out_unoptimized/StateProxyContract.clear.teal create mode 100644 test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir create mode 100644 test_cases/state_proxies/puya.log diff --git a/examples/sizes.txt b/examples/sizes.txt index 76b7b8f213..04353555c9 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -53,6 +53,7 @@ simple 81 29 29 simplish/Simplish 747 719 720 ssa 286 230 230 ssa2 95 87 87 +state_proxies/StateProxy 87 83 83 string_ops 157 152 152 stubs/BigUInt 172 112 112 stubs/Bytes 660 8 8 diff --git a/test_cases/state_proxies/contract.py b/test_cases/state_proxies/contract.py new file mode 100644 index 0000000000..c729f5fec3 --- /dev/null +++ b/test_cases/state_proxies/contract.py @@ -0,0 +1,15 @@ +from puyapy import ARC4Contract, GlobalState, LocalState, Txn, UInt64, arc4 + + +class StateProxyContract(ARC4Contract): + def __init__(self) -> None: + self.local1 = LocalState(UInt64, key="l1", description="l1 description") + self.local2 = LocalState(UInt64, key=b"l2", description="l2 description") + self.global1 = GlobalState(UInt64, key="g1", description="g1 description") + self.global2 = GlobalState(UInt64(0), key=b"g2", description="g2 description") + + @arc4.abimethod(allow_actions=["OptIn"], create=True) + def create(self) -> None: + self.global1.value = UInt64(1) + self.local1[Txn.sender] = UInt64(2) + self.local2[Txn.sender] = UInt64(3) diff --git a/test_cases/state_proxies/out/StateProxyContract.approval.mir b/test_cases/state_proxies/out/StateProxyContract.approval.mir new file mode 100644 index 0000000000..bdcac2234e --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.approval.mir @@ -0,0 +1,78 @@ +// Op // Op Description Stack (out) X stack Source code Source line + +#pragma version 10 + +// test_cases.state_proxies.contract.StateProxyContract.approval_program() -> uint64: +main_block@0: + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + bnz main_entrypoint@2 // + // Implicit fall through to main_on_create@1 // + +main_on_create@1: + callsub __init__ // + // Implicit fall through to main_entrypoint@2 // + +main_entrypoint@2: + txna ApplicationArgs 0 // {txna} class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + method "create()void" // tmp%1#0,method<"create()void"> class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + swap // load tmp%1#0 from l-stack (no copy) method<"create()void">,tmp%1#0 class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + match main_create_route@3 // class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + err // reject transaction // class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + +main_create_route@3: + txn OnCompletion // {txn} arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + int OptIn // tmp%2#0,OptIn arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + == // {==} arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + assert // OnCompletion is OptIn // arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + txn ApplicationID // {txn} arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + ! // {!} arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + assert // is creating // arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + callsub create // arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + int 1 // 1 arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + return // arc4.abimethod(allow_actions=["OptIn"], create=True) state_proxies/contract.py:11 + + +// test_cases.state_proxies.contract.StateProxyContract.create() -> void: +create: + proto 0 0 // @arc4.abimethod(allow_actions=["OptIn"], create=True)\ndef create(self) -> None: state_proxies/contract.py:11-12 + +create_block@0: + byte "g1" // "g1" self.global1 state_proxies/contract.py:13 + int 1 // "g1",1 1 state_proxies/contract.py:13 + app_global_put // self.global1.value = UInt64(1) state_proxies/contract.py:13 + txn Sender // {txn} Txn.sender state_proxies/contract.py:14 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender state_proxies/contract.py:14 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 self.local1[Txn.sender] = UInt64(2) state_proxies/contract.py:14 + byte "l1" // tmp%0#0,"l1" self.local1[Txn.sender] state_proxies/contract.py:14 + int 2 // tmp%0#0,"l1",2 2 state_proxies/contract.py:14 + app_local_put // self.local1[Txn.sender] = UInt64(2) state_proxies/contract.py:14 + txn Sender // {txn} Txn.sender state_proxies/contract.py:15 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 Txn.sender state_proxies/contract.py:15 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 self.local2[Txn.sender] = UInt64(3) state_proxies/contract.py:15 + byte 0x6c32 // tmp%1#0,0x6c32 self.local2[Txn.sender] state_proxies/contract.py:15 + int 3 // tmp%1#0,0x6c32,3 3 state_proxies/contract.py:15 + app_local_put // self.local2[Txn.sender] = UInt64(3) state_proxies/contract.py:15 + retsub // + + +// test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: +__init__: + proto 0 0 // def __init__(self) -> None: state_proxies/contract.py:5 + +__init___block@0: + byte 0x6732 // 0x6732 self.global2 state_proxies/contract.py:9 + int 0 // 0x6732,0 0 state_proxies/contract.py:9 + app_global_put // self.global2 = GlobalState(UInt64(0), key=b"g2", description="g2 description") state_proxies/contract.py:9 + retsub // + diff --git a/test_cases/state_proxies/out/StateProxyContract.approval.teal b/test_cases/state_proxies/out/StateProxyContract.approval.teal new file mode 100644 index 0000000000..559aede036 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.approval.teal @@ -0,0 +1,67 @@ +#pragma version 10 + +test_cases.state_proxies.contract.StateProxyContract.approval_program: + txn ApplicationID + bnz main_entrypoint@2 + callsub __init__ + +main_entrypoint@2: + // state_proxies/contract.py:4 + // class StateProxyContract(ARC4Contract): + method "create()void" + txna ApplicationArgs 0 + match main_create_route@3 + err // reject transaction + +main_create_route@3: + // state_proxies/contract.py:11 + // @arc4.abimethod(allow_actions=["OptIn"], create=True) + txn OnCompletion + int OptIn + == + assert // OnCompletion is OptIn + txn ApplicationID + ! + assert // is creating + callsub create + int 1 + return + + +// test_cases.state_proxies.contract.StateProxyContract.create() -> void: +create: + // state_proxies/contract.py:11-12 + // @arc4.abimethod(allow_actions=["OptIn"], create=True) + // def create(self) -> None: + proto 0 0 + // state_proxies/contract.py:13 + // self.global1.value = UInt64(1) + byte "g1" + int 1 + app_global_put + // state_proxies/contract.py:14 + // self.local1[Txn.sender] = UInt64(2) + txn Sender + byte "l1" + int 2 + app_local_put + // state_proxies/contract.py:15 + // self.local2[Txn.sender] = UInt64(3) + txn Sender + byte 0x6c32 + int 3 + app_local_put + retsub + + +// test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: +__init__: + // state_proxies/contract.py:5 + // def __init__(self) -> None: + proto 0 0 + // state_proxies/contract.py:9 + // self.global2 = GlobalState(UInt64(0), key=b"g2", description="g2 description") + byte 0x6732 + int 0 + app_global_put + retsub diff --git a/test_cases/state_proxies/out/StateProxyContract.arc32.json b/test_cases/state_proxies/out/StateProxyContract.arc32.json new file mode 100644 index 0000000000..4667071913 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.arc32.json @@ -0,0 +1,69 @@ +{ + "hints": { + "create()void": { + "call_config": { + "opt_in": "CREATE" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgU3RhdGVQcm94eUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlX3JvdXRlQDMKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0sIGNyZWF0ZT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50IE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludCAxCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmNyZWF0ZSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSwgY3JlYXRlPVRydWUpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTMKICAgIC8vIHNlbGYuZ2xvYmFsMS52YWx1ZSA9IFVJbnQ2NCgxKQogICAgYnl0ZSAiZzEiCiAgICBpbnQgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTQKICAgIC8vIHNlbGYubG9jYWwxW1R4bi5zZW5kZXJdID0gVUludDY0KDIpCiAgICB0eG4gU2VuZGVyCiAgICBieXRlICJsMSIKICAgIGludCAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBzZWxmLmxvY2FsMltUeG4uc2VuZGVyXSA9IFVJbnQ2NCgzKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZSAweDZjMzIKICAgIGludCAzCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjUKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHNlbGYuZ2xvYmFsMiA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSwga2V5PWIiZzIiLCBkZXNjcmlwdGlvbj0iZzIgZGVzY3JpcHRpb24iKQogICAgYnl0ZSAweDY3MzIKICAgIGludCAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFN0YXRlUHJveHlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo=" + }, + "state": { + "global": { + "num_byte_slices": 0, + "num_uints": 2 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 2 + } + }, + "schema": { + "global": { + "declared": { + "global1": { + "type": "uint64", + "key": "g1", + "descr": "g1 description" + }, + "global2": { + "type": "uint64", + "key": "g2", + "descr": "g2 description" + } + }, + "reserved": {} + }, + "local": { + "declared": { + "local1": { + "type": "uint64", + "key": "l1", + "descr": "l1 description" + }, + "local2": { + "type": "uint64", + "key": "l2", + "descr": "l2 description" + } + }, + "reserved": {} + } + }, + "contract": { + "name": "StateProxyContract", + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + } + } + ], + "networks": {} + }, + "bare_call_config": {} +} \ No newline at end of file diff --git a/test_cases/state_proxies/out/StateProxyContract.clear.mir b/test_cases/state_proxies/out/StateProxyContract.clear.mir new file mode 100644 index 0000000000..2a70ee1085 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.clear.mir @@ -0,0 +1,9 @@ +// Op // Stack (out) Source code Source line + +#pragma version 10 + +// test_cases.state_proxies.contract.StateProxyContract.clear_state_program() -> uint64: +main_block@0: + int 1 // 1 class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + return // class StateProxyContract(ARC4Contract): state_proxies/contract.py:4 + diff --git a/test_cases/state_proxies/out/StateProxyContract.clear.teal b/test_cases/state_proxies/out/StateProxyContract.clear.teal new file mode 100644 index 0000000000..b809150ad9 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.state_proxies.contract.StateProxyContract.clear_state_program: + // state_proxies/contract.py:4 + // class StateProxyContract(ARC4Contract): + int 1 + return diff --git a/test_cases/state_proxies/out/StateProxyContract.destructured.ir b/test_cases/state_proxies/out/StateProxyContract.destructured.ir new file mode 100644 index 0000000000..430a6c76a1 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.destructured.ir @@ -0,0 +1,40 @@ +contract test_cases.state_proxies.contract.StateProxyContract: + program approval: + subroutine test_cases.state_proxies.contract.StateProxyContract.approval_program() -> uint64: + block@0: // L4 + let app_id%0#0: uint64 = (txn ApplicationID) + goto app_id%0#0 ? block@2 : block@1 + block@1: // on_create_L5 + test_cases.state_proxies.contract.StateProxyContract.__init__() + goto block@2 + block@2: // entrypoint_L5 + let tmp%1#0: bytes = (txna ApplicationArgs 0) + switch tmp%1#0 {method "create()void" => block@3, * => fail // reject transaction} + block@3: // create_route_L11 + let tmp%2#0: uint64 = (txn OnCompletion) + let tmp%3#0: uint64 = (== tmp%2#0 OptIn) + (assert tmp%3#0) // OnCompletion is OptIn + let tmp%4#0: uint64 = (txn ApplicationID) + let tmp%5#0: uint64 = (! tmp%4#0) + (assert tmp%5#0) // is creating + test_cases.state_proxies.contract.StateProxyContract.create() + return 1u + + subroutine test_cases.state_proxies.contract.StateProxyContract.create() -> void: + block@0: // L11 + (app_global_put "g1" 1u) + let tmp%0#0: bytes = (txn Sender) + (app_local_put tmp%0#0 "l1" 2u) + let tmp%1#0: bytes = (txn Sender) + (app_local_put tmp%1#0 0x6c32 3u) + return + + subroutine test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: + block@0: // L5 + (app_global_put 0x6732 0u) + return + + program clear-state: + subroutine test_cases.state_proxies.contract.StateProxyContract.clear_state_program() -> uint64: + block@0: // L4 + return 1u \ No newline at end of file diff --git a/test_cases/state_proxies/out/StateProxyContract.ssa.ir b/test_cases/state_proxies/out/StateProxyContract.ssa.ir new file mode 100644 index 0000000000..04906e5383 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.ssa.ir @@ -0,0 +1,44 @@ +contract test_cases.state_proxies.contract.StateProxyContract: + program approval: + subroutine test_cases.state_proxies.contract.StateProxyContract.approval_program() -> uint64: + block@0: // L4 + let app_id%0#0: uint64 = (txn ApplicationID) + goto app_id%0#0 ? block@2 : block@1 + block@1: // on_create_L5 + test_cases.state_proxies.contract.StateProxyContract.__init__() + goto block@2 + block@2: // entrypoint_L5 + let tmp%1#0: bytes = (txna ApplicationArgs 0) + switch tmp%1#0 {method "create()void" => block@3, * => block@4} + block@3: // create_route_L11 + let tmp%2#0: uint64 = (txn OnCompletion) + let tmp%3#0: uint64 = (== tmp%2#0 OptIn) + (assert tmp%3#0) // OnCompletion is OptIn + let tmp%4#0: uint64 = (txn ApplicationID) + let tmp%5#0: uint64 = (! tmp%4#0) + (assert tmp%5#0) // is creating + test_cases.state_proxies.contract.StateProxyContract.create() + return 1u + block@4: // switch_case_default_L4 + goto block@5 + block@5: // switch_case_next_L4 + fail // reject transaction + + subroutine test_cases.state_proxies.contract.StateProxyContract.create() -> void: + block@0: // L11 + (app_global_put "g1" 1u) + let tmp%0#0: bytes = (txn Sender) + (app_local_put tmp%0#0 "l1" 2u) + let tmp%1#0: bytes = (txn Sender) + (app_local_put tmp%1#0 0x6c32 3u) + return + + subroutine test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: + block@0: // L5 + (app_global_put 0x6732 0u) + return + + program clear-state: + subroutine test_cases.state_proxies.contract.StateProxyContract.clear_state_program() -> uint64: + block@0: // L4 + return 1u \ No newline at end of file diff --git a/test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir b/test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir new file mode 100644 index 0000000000..430a6c76a1 --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir @@ -0,0 +1,40 @@ +contract test_cases.state_proxies.contract.StateProxyContract: + program approval: + subroutine test_cases.state_proxies.contract.StateProxyContract.approval_program() -> uint64: + block@0: // L4 + let app_id%0#0: uint64 = (txn ApplicationID) + goto app_id%0#0 ? block@2 : block@1 + block@1: // on_create_L5 + test_cases.state_proxies.contract.StateProxyContract.__init__() + goto block@2 + block@2: // entrypoint_L5 + let tmp%1#0: bytes = (txna ApplicationArgs 0) + switch tmp%1#0 {method "create()void" => block@3, * => fail // reject transaction} + block@3: // create_route_L11 + let tmp%2#0: uint64 = (txn OnCompletion) + let tmp%3#0: uint64 = (== tmp%2#0 OptIn) + (assert tmp%3#0) // OnCompletion is OptIn + let tmp%4#0: uint64 = (txn ApplicationID) + let tmp%5#0: uint64 = (! tmp%4#0) + (assert tmp%5#0) // is creating + test_cases.state_proxies.contract.StateProxyContract.create() + return 1u + + subroutine test_cases.state_proxies.contract.StateProxyContract.create() -> void: + block@0: // L11 + (app_global_put "g1" 1u) + let tmp%0#0: bytes = (txn Sender) + (app_local_put tmp%0#0 "l1" 2u) + let tmp%1#0: bytes = (txn Sender) + (app_local_put tmp%1#0 0x6c32 3u) + return + + subroutine test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: + block@0: // L5 + (app_global_put 0x6732 0u) + return + + program clear-state: + subroutine test_cases.state_proxies.contract.StateProxyContract.clear_state_program() -> uint64: + block@0: // L4 + return 1u \ No newline at end of file diff --git a/test_cases/state_proxies/out/contract.awst b/test_cases/state_proxies/out/contract.awst new file mode 100644 index 0000000000..967ad4ecd1 --- /dev/null +++ b/test_cases/state_proxies/out/contract.awst @@ -0,0 +1,23 @@ +contract StateProxyContract +{ + globals { + ['g1']: puyapy.UInt64 + ['g2']: puyapy.UInt64 + } + locals { + ['l1']: puyapy.UInt64 + ['l2']: puyapy.UInt64 + } + + constructor() + { + this.global2: puyapy.UInt64 = 0u + } + + abimethod create(): None + { + this.global1: puyapy.UInt64 = 1u + this.local1[txn()]: puyapy.UInt64 = 2u + this.local2[txn()]: puyapy.UInt64 = 3u + } +} \ No newline at end of file diff --git a/test_cases/state_proxies/out_O2/StateProxyContract.approval.teal b/test_cases/state_proxies/out_O2/StateProxyContract.approval.teal new file mode 100644 index 0000000000..c2969417d8 --- /dev/null +++ b/test_cases/state_proxies/out_O2/StateProxyContract.approval.teal @@ -0,0 +1,50 @@ +#pragma version 10 + +test_cases.state_proxies.contract.StateProxyContract.approval_program: + txn ApplicationID + bnz main_entrypoint@2 + callsub __init__ + +main_entrypoint@2: + method "create()void" + txna ApplicationArgs 0 + match main_create_route@3 + err // reject transaction + +main_create_route@3: + txn OnCompletion + int OptIn + == + assert // OnCompletion is OptIn + txn ApplicationID + ! + assert // is creating + callsub create + int 1 + return + + +// test_cases.state_proxies.contract.StateProxyContract.create() -> void: +create: + proto 0 0 + byte "g1" + int 1 + app_global_put + txn Sender + byte "l1" + int 2 + app_local_put + txn Sender + byte 0x6c32 + int 3 + app_local_put + retsub + + +// test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: +__init__: + proto 0 0 + byte 0x6732 + int 0 + app_global_put + retsub diff --git a/test_cases/state_proxies/out_O2/StateProxyContract.clear.teal b/test_cases/state_proxies/out_O2/StateProxyContract.clear.teal new file mode 100644 index 0000000000..601e644c5c --- /dev/null +++ b/test_cases/state_proxies/out_O2/StateProxyContract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +test_cases.state_proxies.contract.StateProxyContract.clear_state_program: + int 1 + return diff --git a/test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir b/test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir new file mode 100644 index 0000000000..430a6c76a1 --- /dev/null +++ b/test_cases/state_proxies/out_O2/StateProxyContract.destructured.ir @@ -0,0 +1,40 @@ +contract test_cases.state_proxies.contract.StateProxyContract: + program approval: + subroutine test_cases.state_proxies.contract.StateProxyContract.approval_program() -> uint64: + block@0: // L4 + let app_id%0#0: uint64 = (txn ApplicationID) + goto app_id%0#0 ? block@2 : block@1 + block@1: // on_create_L5 + test_cases.state_proxies.contract.StateProxyContract.__init__() + goto block@2 + block@2: // entrypoint_L5 + let tmp%1#0: bytes = (txna ApplicationArgs 0) + switch tmp%1#0 {method "create()void" => block@3, * => fail // reject transaction} + block@3: // create_route_L11 + let tmp%2#0: uint64 = (txn OnCompletion) + let tmp%3#0: uint64 = (== tmp%2#0 OptIn) + (assert tmp%3#0) // OnCompletion is OptIn + let tmp%4#0: uint64 = (txn ApplicationID) + let tmp%5#0: uint64 = (! tmp%4#0) + (assert tmp%5#0) // is creating + test_cases.state_proxies.contract.StateProxyContract.create() + return 1u + + subroutine test_cases.state_proxies.contract.StateProxyContract.create() -> void: + block@0: // L11 + (app_global_put "g1" 1u) + let tmp%0#0: bytes = (txn Sender) + (app_local_put tmp%0#0 "l1" 2u) + let tmp%1#0: bytes = (txn Sender) + (app_local_put tmp%1#0 0x6c32 3u) + return + + subroutine test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: + block@0: // L5 + (app_global_put 0x6732 0u) + return + + program clear-state: + subroutine test_cases.state_proxies.contract.StateProxyContract.clear_state_program() -> uint64: + block@0: // L4 + return 1u \ No newline at end of file diff --git a/test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal b/test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal new file mode 100644 index 0000000000..fcf8ece6c1 --- /dev/null +++ b/test_cases/state_proxies/out_unoptimized/StateProxyContract.approval.teal @@ -0,0 +1,73 @@ +#pragma version 10 + +test_cases.state_proxies.contract.StateProxyContract.approval_program: + txn ApplicationID + bnz main_entrypoint@2 + callsub __init__ + +main_entrypoint@2: + // state_proxies/contract.py:4 + // class StateProxyContract(ARC4Contract): + txna ApplicationArgs 0 + method "create()void" + swap + match main_create_route@3 + b main_switch_case_default@4 + +main_create_route@3: + // state_proxies/contract.py:11 + // @arc4.abimethod(allow_actions=["OptIn"], create=True) + txn OnCompletion + int OptIn + == + assert // OnCompletion is OptIn + txn ApplicationID + ! + assert // is creating + callsub create + int 1 + return + +main_switch_case_default@4: + // state_proxies/contract.py:4 + // class StateProxyContract(ARC4Contract): + err // reject transaction + + +// test_cases.state_proxies.contract.StateProxyContract.create() -> void: +create: + // state_proxies/contract.py:11-12 + // @arc4.abimethod(allow_actions=["OptIn"], create=True) + // def create(self) -> None: + proto 0 0 + // state_proxies/contract.py:13 + // self.global1.value = UInt64(1) + byte "g1" + int 1 + app_global_put + // state_proxies/contract.py:14 + // self.local1[Txn.sender] = UInt64(2) + txn Sender + byte "l1" + int 2 + app_local_put + // state_proxies/contract.py:15 + // self.local2[Txn.sender] = UInt64(3) + txn Sender + byte 0x6c32 + int 3 + app_local_put + retsub + + +// test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: +__init__: + // state_proxies/contract.py:5 + // def __init__(self) -> None: + proto 0 0 + // state_proxies/contract.py:9 + // self.global2 = GlobalState(UInt64(0), key=b"g2", description="g2 description") + byte 0x6732 + int 0 + app_global_put + retsub diff --git a/test_cases/state_proxies/out_unoptimized/StateProxyContract.clear.teal b/test_cases/state_proxies/out_unoptimized/StateProxyContract.clear.teal new file mode 100644 index 0000000000..b809150ad9 --- /dev/null +++ b/test_cases/state_proxies/out_unoptimized/StateProxyContract.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 + +test_cases.state_proxies.contract.StateProxyContract.clear_state_program: + // state_proxies/contract.py:4 + // class StateProxyContract(ARC4Contract): + int 1 + return diff --git a/test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir b/test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir new file mode 100644 index 0000000000..04906e5383 --- /dev/null +++ b/test_cases/state_proxies/out_unoptimized/StateProxyContract.destructured.ir @@ -0,0 +1,44 @@ +contract test_cases.state_proxies.contract.StateProxyContract: + program approval: + subroutine test_cases.state_proxies.contract.StateProxyContract.approval_program() -> uint64: + block@0: // L4 + let app_id%0#0: uint64 = (txn ApplicationID) + goto app_id%0#0 ? block@2 : block@1 + block@1: // on_create_L5 + test_cases.state_proxies.contract.StateProxyContract.__init__() + goto block@2 + block@2: // entrypoint_L5 + let tmp%1#0: bytes = (txna ApplicationArgs 0) + switch tmp%1#0 {method "create()void" => block@3, * => block@4} + block@3: // create_route_L11 + let tmp%2#0: uint64 = (txn OnCompletion) + let tmp%3#0: uint64 = (== tmp%2#0 OptIn) + (assert tmp%3#0) // OnCompletion is OptIn + let tmp%4#0: uint64 = (txn ApplicationID) + let tmp%5#0: uint64 = (! tmp%4#0) + (assert tmp%5#0) // is creating + test_cases.state_proxies.contract.StateProxyContract.create() + return 1u + block@4: // switch_case_default_L4 + goto block@5 + block@5: // switch_case_next_L4 + fail // reject transaction + + subroutine test_cases.state_proxies.contract.StateProxyContract.create() -> void: + block@0: // L11 + (app_global_put "g1" 1u) + let tmp%0#0: bytes = (txn Sender) + (app_local_put tmp%0#0 "l1" 2u) + let tmp%1#0: bytes = (txn Sender) + (app_local_put tmp%1#0 0x6c32 3u) + return + + subroutine test_cases.state_proxies.contract.StateProxyContract.__init__() -> void: + block@0: // L5 + (app_global_put 0x6732 0u) + return + + program clear-state: + subroutine test_cases.state_proxies.contract.StateProxyContract.clear_state_program() -> uint64: + block@0: // L4 + return 1u \ No newline at end of file diff --git a/test_cases/state_proxies/puya.log b/test_cases/state_proxies/puya.log new file mode 100644 index 0000000000..ec3ba49ea2 --- /dev/null +++ b/test_cases/state_proxies/puya.log @@ -0,0 +1,446 @@ +debug: PuyaOptions(paths=['state_proxies'], output_teal=True, output_arc32=True, output_awst=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, debug_level=1, optimization_level=1, log_level=, target_avm_version=10, locals_coalescing_strategy=) +debug: Sealing block@0: // L11 +debug: Terminated block@0: // L11 +debug: Looking for 'required_budget_with_buffer' in an unsealed block creating an incomplete Phi: block@1: // while_top_L19 +debug: Created Phi assignment: let required_budget_with_buffer#1: uint64 = undefined while trying to resolve 'required_budget_with_buffer' in block@1: // while_top_L19 +debug: Terminated block@1: // while_top_L19 +debug: Sealing block@None: // while_body_L19 +debug: Looking for 'fee_source' in an unsealed block creating an incomplete Phi: block@1: // while_top_L19 +debug: Created Phi assignment: let fee_source#1: uint64 = undefined while trying to resolve 'fee_source' in block@1: // while_top_L19 +debug: Terminated block@2: // while_body_L19 +debug: Sealing block@None: // switch_case_default_L25 +debug: Sealing block@None: // switch_case_0_L27 +debug: Sealing block@None: // switch_case_1_L29 +debug: Terminated block@3: // switch_case_0_L27 +debug: Terminated block@4: // switch_case_1_L29 +debug: Terminated block@5: // switch_case_default_L25 +debug: Sealing block@6: // switch_case_next_L25 +debug: Terminated block@6: // switch_case_next_L25 +debug: Sealing block@1: // while_top_L19 +debug: Added required_budget_with_buffer#0 to Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0) in block@0: // L11 +debug: Created Phi assignment: let required_budget_with_buffer#2: uint64 = undefined while trying to resolve 'required_budget_with_buffer' in block@6: // switch_case_next_L25 +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3) in block@3: // switch_case_0_L27 +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4) in block@4: // switch_case_1_L29 +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) in block@5: // switch_case_default_L25 +debug: Replacing trivial Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) (required_budget_with_buffer#2) with required_budget_with_buffer#1 +debug: Deleting Phi assignment: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) +debug: Replaced trivial Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) (required_budget_with_buffer#2) with required_budget_with_buffer#1 in current definition for 1 blocks +debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) in block@6: // switch_case_next_L25 +debug: Replacing trivial Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) (required_budget_with_buffer#1) with required_budget_with_buffer#0 +debug: Deleting Phi assignment: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) +debug: Replaced trivial Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) (required_budget_with_buffer#1) with required_budget_with_buffer#0 in current definition for 6 blocks +debug: Added fee_source#0 to Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0) in block@0: // L11 +debug: Created Phi assignment: let fee_source#2: uint64 = undefined while trying to resolve 'fee_source' in block@6: // switch_case_next_L25 +debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3) in block@3: // switch_case_0_L27 +debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4) in block@4: // switch_case_1_L29 +debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) in block@5: // switch_case_default_L25 +debug: Replacing trivial Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) (fee_source#2) with fee_source#1 +debug: Deleting Phi assignment: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) +debug: Replaced trivial Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) (fee_source#2) with fee_source#1 in current definition for 1 blocks +debug: Added fee_source#1 to Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) in block@6: // switch_case_next_L25 +debug: Replacing trivial Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) (fee_source#1) with fee_source#0 +debug: Deleting Phi assignment: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) +debug: Replaced trivial Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) (fee_source#1) with fee_source#0 in current definition for 6 blocks +debug: Sealing block@None: // after_while_L19 +debug: Terminated block@7: // after_while_L19 +debug: Sealing block@0: // L20 +debug: Terminated block@0: // L20 +debug: Sealing block@0: // L39 +debug: Terminated block@0: // L39 +debug: Sealing block@0: // L57 +debug: Terminated block@0: // L57 +debug: Sealing block@0: // L84 +debug: Terminated block@0: // L84 +debug: Sealing block@None: // if_body_L106 +debug: Sealing block@None: // else_body_L106 +debug: Terminated block@1: // if_body_L106 +debug: Sealing block@2: // after_if_else_L106 +debug: Created Phi assignment: let array_length#1: uint64 = undefined while trying to resolve 'array_length' in block@2: // after_if_else_L106 +debug: Added array_length#0 to Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0) in block@0: // L84 +debug: Added array_length#0 to Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) in block@1: // if_body_L106 +debug: Replacing trivial Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) (array_length#1) with array_length#0 +debug: Deleting Phi assignment: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) +debug: Replaced trivial Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) (array_length#1) with array_length#0 in current definition for 1 blocks +debug: Created Phi assignment: let is_packed#1: uint64 = undefined while trying to resolve 'is_packed' in block@2: // after_if_else_L106 +debug: Added is_packed#0 to Phi node: let is_packed#1: uint64 = φ(is_packed#0 <- block@0) in block@0: // L84 +debug: Added is_packed#0 to Phi node: let is_packed#1: uint64 = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) in block@1: // if_body_L106 +debug: Replacing trivial Phi node: let is_packed#1: uint64 = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) (is_packed#1) with is_packed#0 +debug: Deleting Phi assignment: let is_packed#1: uint64 = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) +debug: Replaced trivial Phi node: let is_packed#1: uint64 = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) (is_packed#1) with is_packed#0 in current definition for 1 blocks +debug: Terminated block@2: // after_if_else_L106 +debug: Sealing block@None: // ternary_true_L110 +debug: Sealing block@None: // ternary_false_L110 +debug: Terminated block@3: // ternary_true_L110 +debug: Terminated block@4: // ternary_false_L110 +debug: Sealing block@5: // ternary_merge_L110 +debug: Created Phi assignment: let ternary_result%6#2: uint64 = undefined while trying to resolve 'ternary_result%6' in block@5: // ternary_merge_L110 +debug: Added ternary_result%6#0 to Phi node: let ternary_result%6#2: uint64 = φ(ternary_result%6#0 <- block@3) in block@3: // ternary_true_L110 +debug: Added ternary_result%6#1 to Phi node: let ternary_result%6#2: uint64 = φ(ternary_result%6#0 <- block@3, ternary_result%6#1 <- block@4) in block@4: // ternary_false_L110 +debug: Created Phi assignment: let new_items_count#1: uint64 = undefined while trying to resolve 'new_items_count' in block@5: // ternary_merge_L110 +debug: Created Phi assignment: let new_items_count#2: uint64 = undefined while trying to resolve 'new_items_count' in block@2: // after_if_else_L106 +debug: Added new_items_count#0 to Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@0) in block@0: // L84 +debug: Added new_items_count#0 to Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) in block@1: // if_body_L106 +debug: Replacing trivial Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) (new_items_count#2) with new_items_count#0 +debug: Deleting Phi assignment: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) +debug: Replaced trivial Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) (new_items_count#2) with new_items_count#0 in current definition for 1 blocks +debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@3) in block@3: // ternary_true_L110 +debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@3, new_items_count#0 <- block@4) in block@4: // ternary_false_L110 +debug: Replacing trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@3, new_items_count#0 <- block@4) (new_items_count#1) with new_items_count#0 +debug: Deleting Phi assignment: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@3, new_items_count#0 <- block@4) +debug: Replaced trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@3, new_items_count#0 <- block@4) (new_items_count#1) with new_items_count#0 in current definition for 1 blocks +debug: Terminated block@5: // ternary_merge_L110 +debug: Looking for 'range_item%7' in an unsealed block creating an incomplete Phi: block@6: // for_header_L110 +debug: Created Phi assignment: let range_item%7#1: uint64 = undefined while trying to resolve 'range_item%7' in block@6: // for_header_L110 +debug: Terminated block@6: // for_header_L110 +debug: Looking for 'range_item%7' in an unsealed block creating an incomplete Phi: block@7: // for_body_L110 +debug: Created Phi assignment: let range_item%7#2: uint64 = undefined while trying to resolve 'range_item%7' in block@7: // for_body_L110 +debug: Looking for 'result' in an unsealed block creating an incomplete Phi: block@7: // for_body_L110 +debug: Created Phi assignment: let result#2: bytes = undefined while trying to resolve 'result' in block@7: // for_body_L110 +debug: Looking for 'write_offset' in an unsealed block creating an incomplete Phi: block@7: // for_body_L110 +debug: Created Phi assignment: let write_offset#1: uint64 = undefined while trying to resolve 'write_offset' in block@7: // for_body_L110 +debug: Looking for 'new_items_bytes' in an unsealed block creating an incomplete Phi: block@7: // for_body_L110 +debug: Created Phi assignment: let new_items_bytes#1: bytes = undefined while trying to resolve 'new_items_bytes' in block@7: // for_body_L110 +debug: Terminated block@7: // for_body_L110 +debug: Sealing block@8: // for_footer_L110 +debug: Terminated block@8: // for_footer_L110 +debug: Sealing block@9: // for_increment_L110 +debug: Terminated block@9: // for_increment_L110 +debug: Sealing block@6: // for_header_L110 +debug: Added range_item%7#0 to Phi node: let range_item%7#1: uint64 = φ(range_item%7#0 <- block@5) in block@5: // ternary_merge_L110 +debug: Added range_item%7#3 to Phi node: let range_item%7#1: uint64 = φ(range_item%7#0 <- block@5, range_item%7#3 <- block@9) in block@9: // for_increment_L110 +debug: Sealing block@7: // for_body_L110 +debug: Added range_item%7#1 to Phi node: let range_item%7#2: uint64 = φ(range_item%7#1 <- block@6) in block@6: // for_header_L110 +debug: Replacing trivial Phi node: let range_item%7#2: uint64 = φ(range_item%7#1 <- block@6) (range_item%7#2) with range_item%7#1 +debug: Deleting Phi assignment: let range_item%7#2: uint64 = φ(range_item%7#1 <- block@6) +debug: Replaced trivial Phi node: let range_item%7#2: uint64 = φ(range_item%7#1 <- block@6) (range_item%7#2) with range_item%7#1 in current definition for 2 blocks +debug: Created Phi assignment: let result#4: bytes = undefined while trying to resolve 'result' in block@6: // for_header_L110 +debug: Created Phi assignment: let result#5: bytes = undefined while trying to resolve 'result' in block@5: // ternary_merge_L110 +debug: Created Phi assignment: let result#6: bytes = undefined while trying to resolve 'result' in block@2: // after_if_else_L106 +debug: Added result#0 to Phi node: let result#6: bytes = φ(result#0 <- block@0) in block@0: // L84 +debug: Added result#1 to Phi node: let result#6: bytes = φ(result#0 <- block@0, result#1 <- block@1) in block@1: // if_body_L106 +debug: Added result#6 to Phi node: let result#5: bytes = φ(result#6 <- block@3) in block@3: // ternary_true_L110 +debug: Added result#6 to Phi node: let result#5: bytes = φ(result#6 <- block@3, result#6 <- block@4) in block@4: // ternary_false_L110 +debug: Replacing trivial Phi node: let result#5: bytes = φ(result#6 <- block@3, result#6 <- block@4) (result#5) with result#6 +debug: Deleting Phi assignment: let result#5: bytes = φ(result#6 <- block@3, result#6 <- block@4) +debug: Replaced trivial Phi node: let result#5: bytes = φ(result#6 <- block@3, result#6 <- block@4) (result#5) with result#6 in current definition for 1 blocks +debug: Added result#6 to Phi node: let result#4: bytes = φ(result#6 <- block@5) in block@5: // ternary_merge_L110 +debug: Added result#3 to Phi node: let result#4: bytes = φ(result#6 <- block@5, result#3 <- block@9) in block@9: // for_increment_L110 +debug: Added result#4 to Phi node: let result#2: bytes = φ(result#4 <- block@6) in block@6: // for_header_L110 +debug: Replacing trivial Phi node: let result#2: bytes = φ(result#4 <- block@6) (result#2) with result#4 +debug: Deleting Phi assignment: let result#2: bytes = φ(result#4 <- block@6) +debug: Replaced trivial Phi node: let result#2: bytes = φ(result#4 <- block@6) (result#2) with result#4 in current definition for 0 blocks +debug: Created Phi assignment: let write_offset#3: uint64 = undefined while trying to resolve 'write_offset' in block@6: // for_header_L110 +debug: Created Phi assignment: let write_offset#4: uint64 = undefined while trying to resolve 'write_offset' in block@5: // ternary_merge_L110 +debug: Added write_offset#0 to Phi node: let write_offset#4: uint64 = φ(write_offset#0 <- block@3) in block@3: // ternary_true_L110 +debug: Added write_offset#0 to Phi node: let write_offset#4: uint64 = φ(write_offset#0 <- block@3, write_offset#0 <- block@4) in block@4: // ternary_false_L110 +debug: Replacing trivial Phi node: let write_offset#4: uint64 = φ(write_offset#0 <- block@3, write_offset#0 <- block@4) (write_offset#4) with write_offset#0 +debug: Deleting Phi assignment: let write_offset#4: uint64 = φ(write_offset#0 <- block@3, write_offset#0 <- block@4) +debug: Replaced trivial Phi node: let write_offset#4: uint64 = φ(write_offset#0 <- block@3, write_offset#0 <- block@4) (write_offset#4) with write_offset#0 in current definition for 1 blocks +debug: Added write_offset#0 to Phi node: let write_offset#3: uint64 = φ(write_offset#0 <- block@5) in block@5: // ternary_merge_L110 +debug: Added write_offset#2 to Phi node: let write_offset#3: uint64 = φ(write_offset#0 <- block@5, write_offset#2 <- block@9) in block@9: // for_increment_L110 +debug: Added write_offset#3 to Phi node: let write_offset#1: uint64 = φ(write_offset#3 <- block@6) in block@6: // for_header_L110 +debug: Replacing trivial Phi node: let write_offset#1: uint64 = φ(write_offset#3 <- block@6) (write_offset#1) with write_offset#3 +debug: Deleting Phi assignment: let write_offset#1: uint64 = φ(write_offset#3 <- block@6) +debug: Replaced trivial Phi node: let write_offset#1: uint64 = φ(write_offset#3 <- block@6) (write_offset#1) with write_offset#3 in current definition for 0 blocks +debug: Created Phi assignment: let new_items_bytes#2: bytes = undefined while trying to resolve 'new_items_bytes' in block@6: // for_header_L110 +debug: Created Phi assignment: let new_items_bytes#3: bytes = undefined while trying to resolve 'new_items_bytes' in block@5: // ternary_merge_L110 +debug: Created Phi assignment: let new_items_bytes#4: bytes = undefined while trying to resolve 'new_items_bytes' in block@2: // after_if_else_L106 +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#4: bytes = φ(new_items_bytes#0 <- block@0) in block@0: // L84 +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#4: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) in block@1: // if_body_L106 +debug: Replacing trivial Phi node: let new_items_bytes#4: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) (new_items_bytes#4) with new_items_bytes#0 +debug: Deleting Phi assignment: let new_items_bytes#4: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) +debug: Replaced trivial Phi node: let new_items_bytes#4: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) (new_items_bytes#4) with new_items_bytes#0 in current definition for 1 blocks +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#3: bytes = φ(new_items_bytes#0 <- block@3) in block@3: // ternary_true_L110 +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#3: bytes = φ(new_items_bytes#0 <- block@3, new_items_bytes#0 <- block@4) in block@4: // ternary_false_L110 +debug: Replacing trivial Phi node: let new_items_bytes#3: bytes = φ(new_items_bytes#0 <- block@3, new_items_bytes#0 <- block@4) (new_items_bytes#3) with new_items_bytes#0 +debug: Deleting Phi assignment: let new_items_bytes#3: bytes = φ(new_items_bytes#0 <- block@3, new_items_bytes#0 <- block@4) +debug: Replaced trivial Phi node: let new_items_bytes#3: bytes = φ(new_items_bytes#0 <- block@3, new_items_bytes#0 <- block@4) (new_items_bytes#3) with new_items_bytes#0 in current definition for 1 blocks +debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@5) in block@5: // ternary_merge_L110 +debug: Added new_items_bytes#1 to Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@5, new_items_bytes#1 <- block@9) in block@9: // for_increment_L110 +debug: Added new_items_bytes#2 to Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#2 <- block@6) in block@6: // for_header_L110 +debug: Replacing trivial Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#2 <- block@6) (new_items_bytes#1) with new_items_bytes#2 +debug: Deleting Phi assignment: let new_items_bytes#1: bytes = φ(new_items_bytes#2 <- block@6) +debug: Replacing trivial Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@5, new_items_bytes#2 <- block@9) (new_items_bytes#2) with new_items_bytes#0 +debug: Deleting Phi assignment: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@5, new_items_bytes#2 <- block@9) +debug: Replaced trivial Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#2 <- block@6) (new_items_bytes#1) with new_items_bytes#2 in current definition for 3 blocks +debug: Replaced trivial Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@5, new_items_bytes#2 <- block@9) (new_items_bytes#2) with new_items_bytes#0 in current definition for 4 blocks +debug: Sealing block@None: // after_for_L110 +debug: Terminated block@10: // after_for_L110 +debug: Sealing block@0: // L117 +debug: Terminated block@0: // L117 +debug: Sealing block@0: // L139 +debug: Terminated block@0: // L139 +debug: Sealing block@0: // L166 +debug: Terminated block@0: // L166 +debug: Sealing block@0: // L195 +debug: Terminated block@0: // L195 +debug: Sealing block@None: // if_body_L210 +debug: Sealing block@None: // else_body_L210 +debug: Terminated block@1: // if_body_L210 +debug: Terminated block@2: // else_body_L210 +debug: Sealing block@3: // after_if_else_L210 +debug: Created Phi assignment: let length#1: uint64 = undefined while trying to resolve 'length' in block@3: // after_if_else_L210 +debug: Added length#0 to Phi node: let length#1: uint64 = φ(length#0 <- block@1) in block@1: // if_body_L210 +debug: Added length#0 to Phi node: let length#1: uint64 = φ(length#0 <- block@1, length#0 <- block@2) in block@2: // else_body_L210 +debug: Replacing trivial Phi node: let length#1: uint64 = φ(length#0 <- block@1, length#0 <- block@2) (length#1) with length#0 +debug: Deleting Phi assignment: let length#1: uint64 = φ(length#0 <- block@1, length#0 <- block@2) +debug: Replaced trivial Phi node: let length#1: uint64 = φ(length#0 <- block@1, length#0 <- block@2) (length#1) with length#0 in current definition for 1 blocks +debug: Created Phi assignment: let start_at_index#1: uint64 = undefined while trying to resolve 'start_at_index' in block@3: // after_if_else_L210 +debug: Added start_at_index#0 to Phi node: let start_at_index#1: uint64 = φ(start_at_index#0 <- block@1) in block@1: // if_body_L210 +debug: Added start_at_index#0 to Phi node: let start_at_index#1: uint64 = φ(start_at_index#0 <- block@1, start_at_index#0 <- block@2) in block@2: // else_body_L210 +debug: Replacing trivial Phi node: let start_at_index#1: uint64 = φ(start_at_index#0 <- block@1, start_at_index#0 <- block@2) (start_at_index#1) with start_at_index#0 +debug: Deleting Phi assignment: let start_at_index#1: uint64 = φ(start_at_index#0 <- block@1, start_at_index#0 <- block@2) +debug: Replaced trivial Phi node: let start_at_index#1: uint64 = φ(start_at_index#0 <- block@1, start_at_index#0 <- block@2) (start_at_index#1) with start_at_index#0 in current definition for 1 blocks +debug: Terminated block@3: // after_if_else_L210 +debug: Looking for 'range_item%1' in an unsealed block creating an incomplete Phi: block@4: // for_header_L215 +debug: Created Phi assignment: let range_item%1#1: uint64 = undefined while trying to resolve 'range_item%1' in block@4: // for_header_L215 +debug: Terminated block@4: // for_header_L215 +debug: Looking for 'range_item%1' in an unsealed block creating an incomplete Phi: block@5: // for_body_L215 +debug: Created Phi assignment: let range_item%1#2: uint64 = undefined while trying to resolve 'range_item%1' in block@5: // for_body_L215 +debug: Looking for 'tail_cursor' in an unsealed block creating an incomplete Phi: block@5: // for_body_L215 +debug: Created Phi assignment: let tail_cursor#2: uint64 = undefined while trying to resolve 'tail_cursor' in block@5: // for_body_L215 +debug: Looking for 'array_data' in an unsealed block creating an incomplete Phi: block@5: // for_body_L215 +debug: Created Phi assignment: let array_data#1: bytes = undefined while trying to resolve 'array_data' in block@5: // for_body_L215 +debug: Looking for 'header_cursor' in an unsealed block creating an incomplete Phi: block@5: // for_body_L215 +debug: Created Phi assignment: let header_cursor#1: uint64 = undefined while trying to resolve 'header_cursor' in block@5: // for_body_L215 +debug: Terminated block@5: // for_body_L215 +debug: Sealing block@6: // for_footer_L215 +debug: Terminated block@6: // for_footer_L215 +debug: Sealing block@7: // for_increment_L215 +debug: Terminated block@7: // for_increment_L215 +debug: Sealing block@4: // for_header_L215 +debug: Added range_item%1#0 to Phi node: let range_item%1#1: uint64 = φ(range_item%1#0 <- block@3) in block@3: // after_if_else_L210 +debug: Added range_item%1#3 to Phi node: let range_item%1#1: uint64 = φ(range_item%1#0 <- block@3, range_item%1#3 <- block@7) in block@7: // for_increment_L215 +debug: Sealing block@5: // for_body_L215 +debug: Added range_item%1#1 to Phi node: let range_item%1#2: uint64 = φ(range_item%1#1 <- block@4) in block@4: // for_header_L215 +debug: Replacing trivial Phi node: let range_item%1#2: uint64 = φ(range_item%1#1 <- block@4) (range_item%1#2) with range_item%1#1 +debug: Deleting Phi assignment: let range_item%1#2: uint64 = φ(range_item%1#1 <- block@4) +debug: Replaced trivial Phi node: let range_item%1#2: uint64 = φ(range_item%1#1 <- block@4) (range_item%1#2) with range_item%1#1 in current definition for 2 blocks +debug: Created Phi assignment: let tail_cursor#4: uint64 = undefined while trying to resolve 'tail_cursor' in block@4: // for_header_L215 +debug: Created Phi assignment: let tail_cursor#5: uint64 = undefined while trying to resolve 'tail_cursor' in block@3: // after_if_else_L210 +debug: Added tail_cursor#0 to Phi node: let tail_cursor#5: uint64 = φ(tail_cursor#0 <- block@1) in block@1: // if_body_L210 +debug: Added tail_cursor#1 to Phi node: let tail_cursor#5: uint64 = φ(tail_cursor#0 <- block@1, tail_cursor#1 <- block@2) in block@2: // else_body_L210 +debug: Added tail_cursor#5 to Phi node: let tail_cursor#4: uint64 = φ(tail_cursor#5 <- block@3) in block@3: // after_if_else_L210 +debug: Added tail_cursor#3 to Phi node: let tail_cursor#4: uint64 = φ(tail_cursor#5 <- block@3, tail_cursor#3 <- block@7) in block@7: // for_increment_L215 +debug: Added tail_cursor#4 to Phi node: let tail_cursor#2: uint64 = φ(tail_cursor#4 <- block@4) in block@4: // for_header_L215 +debug: Replacing trivial Phi node: let tail_cursor#2: uint64 = φ(tail_cursor#4 <- block@4) (tail_cursor#2) with tail_cursor#4 +debug: Deleting Phi assignment: let tail_cursor#2: uint64 = φ(tail_cursor#4 <- block@4) +debug: Replaced trivial Phi node: let tail_cursor#2: uint64 = φ(tail_cursor#4 <- block@4) (tail_cursor#2) with tail_cursor#4 in current definition for 0 blocks +debug: Created Phi assignment: let array_data#3: bytes = undefined while trying to resolve 'array_data' in block@4: // for_header_L215 +debug: Created Phi assignment: let array_data#4: bytes = undefined while trying to resolve 'array_data' in block@3: // after_if_else_L210 +debug: Added array_data#0 to Phi node: let array_data#4: bytes = φ(array_data#0 <- block@1) in block@1: // if_body_L210 +debug: Added array_data#0 to Phi node: let array_data#4: bytes = φ(array_data#0 <- block@1, array_data#0 <- block@2) in block@2: // else_body_L210 +debug: Replacing trivial Phi node: let array_data#4: bytes = φ(array_data#0 <- block@1, array_data#0 <- block@2) (array_data#4) with array_data#0 +debug: Deleting Phi assignment: let array_data#4: bytes = φ(array_data#0 <- block@1, array_data#0 <- block@2) +debug: Replaced trivial Phi node: let array_data#4: bytes = φ(array_data#0 <- block@1, array_data#0 <- block@2) (array_data#4) with array_data#0 in current definition for 1 blocks +debug: Added array_data#0 to Phi node: let array_data#3: bytes = φ(array_data#0 <- block@3) in block@3: // after_if_else_L210 +debug: Added array_data#2 to Phi node: let array_data#3: bytes = φ(array_data#0 <- block@3, array_data#2 <- block@7) in block@7: // for_increment_L215 +debug: Added array_data#3 to Phi node: let array_data#1: bytes = φ(array_data#3 <- block@4) in block@4: // for_header_L215 +debug: Replacing trivial Phi node: let array_data#1: bytes = φ(array_data#3 <- block@4) (array_data#1) with array_data#3 +debug: Deleting Phi assignment: let array_data#1: bytes = φ(array_data#3 <- block@4) +debug: Replaced trivial Phi node: let array_data#1: bytes = φ(array_data#3 <- block@4) (array_data#1) with array_data#3 in current definition for 0 blocks +debug: Created Phi assignment: let header_cursor#3: uint64 = undefined while trying to resolve 'header_cursor' in block@4: // for_header_L215 +debug: Created Phi assignment: let header_cursor#4: uint64 = undefined while trying to resolve 'header_cursor' in block@3: // after_if_else_L210 +debug: Added header_cursor#0 to Phi node: let header_cursor#4: uint64 = φ(header_cursor#0 <- block@1) in block@1: // if_body_L210 +debug: Added header_cursor#0 to Phi node: let header_cursor#4: uint64 = φ(header_cursor#0 <- block@1, header_cursor#0 <- block@2) in block@2: // else_body_L210 +debug: Replacing trivial Phi node: let header_cursor#4: uint64 = φ(header_cursor#0 <- block@1, header_cursor#0 <- block@2) (header_cursor#4) with header_cursor#0 +debug: Deleting Phi assignment: let header_cursor#4: uint64 = φ(header_cursor#0 <- block@1, header_cursor#0 <- block@2) +debug: Replaced trivial Phi node: let header_cursor#4: uint64 = φ(header_cursor#0 <- block@1, header_cursor#0 <- block@2) (header_cursor#4) with header_cursor#0 in current definition for 1 blocks +debug: Added header_cursor#0 to Phi node: let header_cursor#3: uint64 = φ(header_cursor#0 <- block@3) in block@3: // after_if_else_L210 +debug: Added header_cursor#2 to Phi node: let header_cursor#3: uint64 = φ(header_cursor#0 <- block@3, header_cursor#2 <- block@7) in block@7: // for_increment_L215 +debug: Added header_cursor#3 to Phi node: let header_cursor#1: uint64 = φ(header_cursor#3 <- block@4) in block@4: // for_header_L215 +debug: Replacing trivial Phi node: let header_cursor#1: uint64 = φ(header_cursor#3 <- block@4) (header_cursor#1) with header_cursor#3 +debug: Deleting Phi assignment: let header_cursor#1: uint64 = φ(header_cursor#3 <- block@4) +debug: Replaced trivial Phi node: let header_cursor#1: uint64 = φ(header_cursor#3 <- block@4) (header_cursor#1) with header_cursor#3 in current definition for 0 blocks +debug: Sealing block@None: // after_for_L215 +debug: Terminated block@8: // after_for_L215 +debug: Sealing block@0: // L4 +debug: Terminated block@0: // L4 +debug: Looking for 'start' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11 +debug: Created Phi assignment: let start#1: uint64 = undefined while trying to resolve 'start' in block@1: // while_top_L11 +debug: Looking for 'item' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11 +debug: Created Phi assignment: let item#1: bytes = undefined while trying to resolve 'item' in block@1: // while_top_L11 +debug: Looking for 'sequence' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11 +debug: Created Phi assignment: let sequence#1: bytes = undefined while trying to resolve 'sequence' in block@1: // while_top_L11 +debug: Terminated block@1: // while_top_L11 +debug: Sealing block@None: // while_body_L11 +debug: Terminated block@2: // while_body_L11 +debug: Sealing block@None: // if_body_L12 +debug: Sealing block@None: // else_body_L12 +debug: Terminated block@3: // if_body_L12 +debug: Sealing block@4: // after_if_else_L12 +debug: Terminated block@4: // after_if_else_L12 +debug: Sealing block@1: // while_top_L11 +debug: Added start#0 to Phi node: let start#1: uint64 = φ(start#0 <- block@0) in block@0: // L4 +debug: Added start#2 to Phi node: let start#1: uint64 = φ(start#0 <- block@0, start#2 <- block@4) in block@4: // after_if_else_L12 +debug: Added item#0 to Phi node: let item#1: bytes = φ(item#0 <- block@0) in block@0: // L4 +debug: Added item#1 to Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) in block@4: // after_if_else_L12 +debug: Replacing trivial Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) (item#1) with item#0 +debug: Deleting Phi assignment: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) +debug: Replaced trivial Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) (item#1) with item#0 in current definition for 3 blocks +debug: Added sequence#0 to Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0) in block@0: // L4 +debug: Added sequence#1 to Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) in block@4: // after_if_else_L12 +debug: Replacing trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0 +debug: Deleting Phi assignment: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) +debug: Replaced trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0 in current definition for 3 blocks +debug: Sealing block@None: // after_while_L11 +debug: Terminated block@5: // after_while_L11 +debug: Sealing block@0: // L11 +debug: Terminated block@0: // L11 +debug: Sealing block@0: // L5 +debug: Terminated block@0: // L5 +debug: Sealing block@0: // L4 +debug: Terminated block@0: // L4 +debug: Sealing block@None: // on_create_L5 +debug: Terminated block@1: // on_create_L5 +debug: Sealing block@2: // entrypoint_L5 +debug: Terminated block@2: // entrypoint_L5 +debug: Sealing block@None: // switch_case_default_L4 +debug: Sealing block@None: // create_route_L11 +debug: Terminated block@3: // create_route_L11 +debug: Terminated block@4: // switch_case_default_L4 +debug: Sealing block@5: // switch_case_next_L4 +debug: Terminated block@5: // switch_case_next_L4 +debug: Sealing block@0: // L4 +debug: Terminated block@0: // L4 +debug: Output IR to state_proxies/out/StateProxyContract.ssa.ir +info: Optimizing test_cases.state_proxies.contract.StateProxyContract at level 1 +debug: Begin optimization pass 1/100 +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.approval_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: adding block@2: // entrypoint_L5 as a predecessor of block@5: // switch_case_next_L4 due to inlining of block@4: // switch_case_default_L4 +debug: simplified terminator of block@2: // entrypoint_L5 from switch tmp%1#0 {method "create()void" => block@3, * => block@4} to switch tmp%1#0 {method "create()void" => block@3, * => block@5} +debug: simplified terminator of block@2: // entrypoint_L5 from switch tmp%1#0 {method "create()void" => block@3, * => block@5} to switch tmp%1#0 {method "create()void" => block@3, * => fail // reject transaction} +debug: Optimizer: Remove Linear Jump +debug: Merged linear block@5: // switch_case_next_L4 into block@4: // switch_case_default_L4 +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Removing unreachable blocks: block@4: // switch_case_default_L4 +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.create +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.__init__ +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.clear_state_program +debug: Splitting parallel copies prior to optimization +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Output IR to state_proxies/out/StateProxyContract.ssa.opt_pass_1.ir +debug: Begin optimization pass 2/100 +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.approval_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.create +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.__init__ +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: Optimizing subroutine test_cases.state_proxies.contract.StateProxyContract.clear_state_program +debug: Optimizer: Arithmetic Simplification +debug: Optimizer: Constant Replacer +debug: Optimizer: Copy Propagation +debug: Optimizer: Intrinsic Simplifier +debug: Optimizer: Remove Unused Variables +debug: Optimizer: Simplify Control Ops +debug: Optimizer: Remove Linear Jump +debug: Optimizer: Remove Empty Blocks +debug: Optimizer: Remove Unreachable Blocks +debug: Optimizer: Repeated Expression Elimination +debug: No optimizations performed in pass 2, ending loop +debug: Removing Phis from test_cases.state_proxies.contract.StateProxyContract.approval_program +debug: Removing Phis from test_cases.state_proxies.contract.StateProxyContract.create +debug: Removing Phis from test_cases.state_proxies.contract.StateProxyContract.__init__ +debug: Removing Phis from test_cases.state_proxies.contract.StateProxyContract.clear_state_program +debug: Coalescing local variables in test_cases.state_proxies.contract.StateProxyContract.approval_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.state_proxies.contract.StateProxyContract.create using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.state_proxies.contract.StateProxyContract.__init__ using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Coalescing local variables in test_cases.state_proxies.contract.StateProxyContract.clear_state_program using strategy RootOperandGrouping +debug: Coalescing resulted in 0 replacement/s +debug: Sequentializing parallel copies in test_cases.state_proxies.contract.StateProxyContract.approval_program +debug: Sequentializing parallel copies in test_cases.state_proxies.contract.StateProxyContract.create +debug: Sequentializing parallel copies in test_cases.state_proxies.contract.StateProxyContract.__init__ +debug: Sequentializing parallel copies in test_cases.state_proxies.contract.StateProxyContract.clear_state_program +debug: Performing post-SSA optimizations +debug: Output IR to state_proxies/out/StateProxyContract.destructured.ir +debug: Inserted main_block@0.ops[1]: 'store app_id%0#0 to l-stack (copy)' +debug: Replaced main_block@0.ops[3]: 'load app_id%0#0' with 'load app_id%0#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[1]: 'store tmp%1#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[4]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' +debug: Inserted main_create_route@3.ops[1]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced main_create_route@3.ops[3]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted main_create_route@3.ops[6]: 'store tmp%3#0 to l-stack (copy)' +debug: Replaced main_create_route@3.ops[8]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' +debug: Inserted main_create_route@3.ops[11]: 'store tmp%4#0 to l-stack (copy)' +debug: Replaced main_create_route@3.ops[13]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' +debug: Inserted main_create_route@3.ops[15]: 'store tmp%5#0 to l-stack (copy)' +debug: Replaced main_create_route@3.ops[17]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' +debug: Found 2 edge set/s for test_cases.state_proxies.contract.StateProxyContract.approval_program +debug: Inserted create_block@0.ops[4]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced create_block@0.ops[6]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' +debug: Inserted create_block@0.ops[11]: 'store tmp%1#0 to l-stack (copy)' +debug: Replaced create_block@0.ops[13]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' +info: Writing state_proxies/out/StateProxyContract.approval.teal +info: Writing state_proxies/out/StateProxyContract.clear.teal +info: Writing state_proxies/out/StateProxyContract.arc32.json \ No newline at end of file diff --git a/tests/test_arc32.py b/tests/test_arc32.py index d4a8a7d64b..1f134fd151 100644 --- a/tests/test_arc32.py +++ b/tests/test_arc32.py @@ -8,6 +8,7 @@ import pytest from algosdk import constants, transaction from algosdk.atomic_transaction_composer import AtomicTransactionComposer, TransactionWithSigner +from algosdk.transaction import OnComplete from algosdk.v2client.algod import AlgodClient from nacl.signing import SigningKey from puya.arc32 import create_arc32_json @@ -646,3 +647,14 @@ def test_inner_transactions_c2c(algod_client: AlgodClient, account: algokit_util transaction_parameters={"foreign_apps": [inner_app_id]}, ) assert decode_logs(result.tx_info["logs"], "b") == [b"HelloWorld returned: Hello, There"] + + +def test_state_proxies(algod_client: AlgodClient, account: algokit_utils.Account) -> None: + example = TEST_CASES_DIR / "state_proxies" / "contract.py" + + app_spec = algokit_utils.ApplicationSpecification.from_json(compile_arc32(example)) + app_client = algokit_utils.ApplicationClient(algod_client, app_spec, signer=account) + + app_client.create(transaction_parameters={"on_complete": OnComplete.OptInOC}) + assert app_client.get_global_state() == {"g1": 1, "g2": 0} + assert app_client.get_local_state(account.address) == {"l1": 2, "l2": 3} From d1141afb729138db427223febf93b1ef6d52b5f8 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 5 Mar 2024 11:59:54 +0800 Subject: [PATCH 36/40] - replace TODO comment with REFACTOR - remove unrequired `attrs.field()`'s - add auxiliary constructor to CheckedMaybe to build from tuple items --- src/puya/awst/nodes.py | 21 ++++++++-- src/puya/awst_build/eb/arc4/arrays.py | 8 ++-- src/puya/awst_build/eb/arc4/base.py | 11 ++---- .../awst_build/eb/temporary_assignment.py | 2 +- src/puya/awst_build/eb/transaction/group.py | 39 ++++++++----------- 5 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index 2de5cd219d..ffd26ae876 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -410,7 +410,7 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T: @attrs.frozen class ARC4ArrayEncode(Expression): - wtype: wtypes.ARC4StaticArray | wtypes.ARC4DynamicArray = attrs.field() + wtype: wtypes.ARC4StaticArray | wtypes.ARC4DynamicArray values: Sequence[Expression] = attrs.field(default=(), converter=tuple[Expression, ...]) def accept(self, visitor: ExpressionVisitor[T]) -> T: @@ -719,7 +719,7 @@ class CheckedMaybe(Expression): """Allows evaluating a maybe type i.e. tuple[_T, bool] as _T, but with the assertion that the 2nd bool element is true""" - expr: Expression = attrs.field() + expr: Expression comment: str | None def __init__(self, expr: Expression, comment: str | None = None) -> None: @@ -738,6 +738,21 @@ def __init__(self, expr: Expression, comment: str | None = None) -> None: wtype=wtype, ) + @classmethod + def from_tuple_items( + cls, + expr: Expression, + check: Expression, + source_location: SourceLocation, + comment: str | None = None, + ) -> CheckedMaybe: + if check.wtype != wtypes.bool_wtype: + raise InternalError( + "Check condition for CheckedMaybe should be a boolean", source_location + ) + tuple_expr = TupleExpression.from_items((expr, check), source_location) + return CheckedMaybe(expr=tuple_expr, comment=comment) + def accept(self, visitor: ExpressionVisitor[T]) -> T: return visitor.visit_checked_maybe(self) @@ -1484,7 +1499,7 @@ def accept(self, visitor: StatementVisitor[T]) -> T: @attrs.frozen class NewStruct(Expression): - args: tuple[CallArg, ...] = attrs.field() + args: tuple[CallArg, ...] wtype: wtypes.WStructType def accept(self, visitor: ExpressionVisitor[T]) -> T: diff --git a/src/puya/awst_build/eb/arc4/arrays.py b/src/puya/awst_build/eb/arc4/arrays.py index b40795707f..d0131df163 100644 --- a/src/puya/awst_build/eb/arc4/arrays.py +++ b/src/puya/awst_build/eb/arc4/arrays.py @@ -268,10 +268,10 @@ def call( expr=address_bytes_temp.read, source_location=location ), ) - address_bytes = CheckedMaybe( - expr=TupleExpression.from_items( - (address_bytes_temp.define, is_correct_length), location=location - ), + address_bytes = CheckedMaybe.from_tuple_items( + expr=address_bytes_temp.define, + check=is_correct_length, + source_location=location, comment="Address length is 32 bytes", ) case _: diff --git a/src/puya/awst_build/eb/arc4/base.py b/src/puya/awst_build/eb/arc4/base.py index 86c24aa282..c0b0e601ea 100644 --- a/src/puya/awst_build/eb/arc4/base.py +++ b/src/puya/awst_build/eb/arc4/base.py @@ -19,7 +19,6 @@ IntrinsicCall, Literal, ReinterpretCast, - TupleExpression, ) from puya.awst_build.eb.base import ( BuilderComparisonOp, @@ -144,12 +143,10 @@ def call( source_location=location, stack_args=[value_bytes], ) - checked_arc4_value = CheckedMaybe( - expr=TupleExpression( - items=(arc4_value, arc4_prefix_is_valid), - wtype=wtypes.WTuple.from_types((arc4_value.wtype, wtypes.bool_wtype)), - source_location=location, - ), + checked_arc4_value = CheckedMaybe.from_tuple_items( + expr=arc4_value, + check=arc4_prefix_is_valid, + source_location=location, comment="ARC4 prefix is valid", ) return var_expression( diff --git a/src/puya/awst_build/eb/temporary_assignment.py b/src/puya/awst_build/eb/temporary_assignment.py index 1498493696..88ff710f53 100644 --- a/src/puya/awst_build/eb/temporary_assignment.py +++ b/src/puya/awst_build/eb/temporary_assignment.py @@ -12,7 +12,7 @@ from puya.parse import SourceLocation -# TODO: this should probably extend ValueProxyExpressionBuilder +# REFACTOR: this could extend ValueProxyExpressionBuilder, with a few tweaks to said class class TemporaryAssignmentExpressionBuilder(ExpressionBuilder): def __init__(self, expr: Expression): super().__init__(expr.source_location) diff --git a/src/puya/awst_build/eb/transaction/group.py b/src/puya/awst_build/eb/transaction/group.py index ee04ebe876..742c2fe814 100644 --- a/src/puya/awst_build/eb/transaction/group.py +++ b/src/puya/awst_build/eb/transaction/group.py @@ -12,7 +12,6 @@ NumericComparison, NumericComparisonExpression, ReinterpretCast, - TupleExpression, TxnField, UInt64Constant, ) @@ -103,29 +102,25 @@ def check_transaction_type( return ReinterpretCast( source_location=location, wtype=expected_transaction_type, - expr=CheckedMaybe( - TupleExpression.from_items( - ( - transaction_index_tmp.define, - NumericComparisonExpression( - lhs=IntrinsicCall( - op_code="gtxns", - immediates=["TypeEnum"], - stack_args=[transaction_index_tmp.read], - wtype=wtypes.uint64_wtype, - source_location=location, - ), - operator=NumericComparison.eq, - rhs=UInt64Constant( - value=expected_transaction_type.transaction_type.value, - teal_alias=expected_transaction_type.transaction_type.name, - source_location=location, - ), - source_location=location, - ), + expr=CheckedMaybe.from_tuple_items( + transaction_index_tmp.define, + NumericComparisonExpression( + lhs=IntrinsicCall( + op_code="gtxns", + immediates=["TypeEnum"], + stack_args=[transaction_index_tmp.read], + wtype=wtypes.uint64_wtype, + source_location=location, + ), + operator=NumericComparison.eq, + rhs=UInt64Constant( + value=expected_transaction_type.transaction_type.value, + teal_alias=expected_transaction_type.transaction_type.name, + source_location=location, ), - location, + source_location=location, ), + location, comment=f"transaction type is {expected_transaction_type.transaction_type.name}", ), ) From 6e63cda80a75f761c31423fd77984aed76bbcddd Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 5 Mar 2024 12:05:06 +0800 Subject: [PATCH 37/40] ensure utils in ir/builder remains internal --- src/puya/ir/builder/{utils.py => _utils.py} | 5 +---- src/puya/ir/builder/arc4.py | 2 +- src/puya/ir/builder/assignment.py | 4 +--- src/puya/ir/builder/flow_control.py | 5 +---- src/puya/ir/builder/iteration.py | 8 +------- src/puya/ir/builder/itxn.py | 2 +- src/puya/ir/builder/main.py | 9 ++------- src/puya/ir/builder/state.py | 2 +- src/puya/ir/main.py | 2 +- src/puya/ir/utils.py | 4 ++++ 10 files changed, 14 insertions(+), 29 deletions(-) rename src/puya/ir/builder/{utils.py => _utils.py} (98%) diff --git a/src/puya/ir/builder/utils.py b/src/puya/ir/builder/_utils.py similarity index 98% rename from src/puya/ir/builder/utils.py rename to src/puya/ir/builder/_utils.py index ca757d0233..8cfbd978f2 100644 --- a/src/puya/ir/builder/utils.py +++ b/src/puya/ir/builder/_utils.py @@ -18,6 +18,7 @@ ValueProvider, ) from puya.ir.types_ import AVMBytesEncoding +from puya.ir.utils import format_tuple_index from puya.parse import SourceLocation @@ -115,10 +116,6 @@ def mktemp( return register -def format_tuple_index(var_name: str, index: int | str) -> str: - return f"{var_name}.{index}" - - def assign_intrinsic_op( context: IRFunctionBuildContext, *, diff --git a/src/puya/ir/builder/arc4.py b/src/puya/ir/builder/arc4.py index 5a69876f37..0166c0beeb 100644 --- a/src/puya/ir/builder/arc4.py +++ b/src/puya/ir/builder/arc4.py @@ -14,7 +14,7 @@ ) from puya.errors import CodeError, InternalError from puya.ir.avm_ops import AVMOp -from puya.ir.builder.utils import ( +from puya.ir.builder._utils import ( assert_value, assign, assign_intrinsic_op, diff --git a/src/puya/ir/builder/assignment.py b/src/puya/ir/builder/assignment.py index 64ca8ed427..c808f311e3 100644 --- a/src/puya/ir/builder/assignment.py +++ b/src/puya/ir/builder/assignment.py @@ -9,9 +9,7 @@ from puya.errors import CodeError, TodoError from puya.ir.avm_ops import AVMOp from puya.ir.builder import arc4 -from puya.ir.builder.utils import ( - assign, -) +from puya.ir.builder._utils import assign from puya.ir.context import IRFunctionBuildContext from puya.ir.models import ( BytesConstant, diff --git a/src/puya/ir/builder/flow_control.py b/src/puya/ir/builder/flow_control.py index 05a29460d3..c90c716911 100644 --- a/src/puya/ir/builder/flow_control.py +++ b/src/puya/ir/builder/flow_control.py @@ -5,10 +5,7 @@ wtypes, ) from puya.errors import InternalError -from puya.ir.builder.utils import ( - assign, - mkblocks, -) +from puya.ir.builder._utils import assign, mkblocks from puya.ir.context import IRFunctionBuildContext from puya.ir.models import ( BasicBlock, diff --git a/src/puya/ir/builder/iteration.py b/src/puya/ir/builder/iteration.py index 820d748c5d..4402ec8d08 100644 --- a/src/puya/ir/builder/iteration.py +++ b/src/puya/ir/builder/iteration.py @@ -14,14 +14,8 @@ from puya.errors import CodeError, InternalError from puya.ir.avm_ops import AVMOp from puya.ir.builder import arc4 +from puya.ir.builder._utils import assert_value, assign, assign_intrinsic_op, mkblocks, reassign from puya.ir.builder.assignment import handle_assignment -from puya.ir.builder.utils import ( - assert_value, - assign, - assign_intrinsic_op, - mkblocks, - reassign, -) from puya.ir.context import IRFunctionBuildContext from puya.ir.models import ( BasicBlock, diff --git a/src/puya/ir/builder/itxn.py b/src/puya/ir/builder/itxn.py index 20c346ecfb..bfab9f836e 100644 --- a/src/puya/ir/builder/itxn.py +++ b/src/puya/ir/builder/itxn.py @@ -10,8 +10,8 @@ ) from puya.errors import CodeError, InternalError from puya.ir.avm_ops import AVMOp +from puya.ir.builder._utils import assign, assign_intrinsic_op from puya.ir.builder.blocks import BlocksBuilder -from puya.ir.builder.utils import assign, assign_intrinsic_op from puya.ir.context import IRFunctionBuildContext from puya.ir.models import ( BasicBlock, diff --git a/src/puya/ir/builder/main.py b/src/puya/ir/builder/main.py index 1d05589841..fbe6a907bc 100644 --- a/src/puya/ir/builder/main.py +++ b/src/puya/ir/builder/main.py @@ -16,16 +16,10 @@ from puya.errors import CodeError, InternalError, TodoError from puya.ir.avm_ops import AVMOp from puya.ir.builder import arc4, flow_control, state +from puya.ir.builder._utils import assign, assign_targets, mkblocks, mktemp from puya.ir.builder.assignment import handle_assignment, handle_assignment_expr from puya.ir.builder.iteration import handle_for_in_loop from puya.ir.builder.itxn import InnerTransactionBuilder -from puya.ir.builder.utils import ( - assign, - assign_targets, - format_tuple_index, - mkblocks, - mktemp, -) from puya.ir.context import IRBuildContext, IRFunctionBuildContext from puya.ir.models import ( AddressConstant, @@ -50,6 +44,7 @@ bytes_enc_to_avm_bytes_enc, wtype_to_avm_type, ) +from puya.ir.utils import format_tuple_index from puya.parse import SourceLocation TExpression: typing.TypeAlias = ValueProvider | None diff --git a/src/puya/ir/builder/state.py b/src/puya/ir/builder/state.py index 8908932a89..e9173879d2 100644 --- a/src/puya/ir/builder/state.py +++ b/src/puya/ir/builder/state.py @@ -1,7 +1,7 @@ from puya.avm_type import AVMType from puya.awst import nodes as awst_nodes from puya.ir.avm_ops import AVMOp -from puya.ir.builder.utils import assign_targets, mktemp +from puya.ir.builder._utils import assign_targets, mktemp from puya.ir.context import IRFunctionBuildContext from puya.ir.models import BytesConstant, Intrinsic, UInt64Constant, Value, ValueProvider from puya.ir.types_ import bytes_enc_to_avm_bytes_enc, wtype_to_avm_type diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py index 700f213aea..e7c1229382 100644 --- a/src/puya/ir/main.py +++ b/src/puya/ir/main.py @@ -20,7 +20,6 @@ create_default_clear_state, ) from puya.ir.builder.main import FunctionIRBuilder -from puya.ir.builder.utils import format_tuple_index from puya.ir.context import IRBuildContext, IRBuildContextWithFallback from puya.ir.destructure.main import destructure_ssa from puya.ir.models import ( @@ -33,6 +32,7 @@ from puya.ir.optimize.main import optimize_contract_ir from puya.ir.to_text_visitor import output_contract_ir_to_path from puya.ir.types_ import wtype_to_avm_type +from puya.ir.utils import format_tuple_index from puya.models import ARC4Method, ARC4MethodConfig, ContractMetaData, ContractState from puya.parse import EMBEDDED_MODULES from puya.utils import StableSet, attrs_extend diff --git a/src/puya/ir/utils.py b/src/puya/ir/utils.py index f9b065c6a6..b79118cc4a 100644 --- a/src/puya/ir/utils.py +++ b/src/puya/ir/utils.py @@ -48,3 +48,7 @@ def format_bytes(b: bytes, encoding: AVMBytesEncoding) -> str: return base64.b64encode(b).decode("ascii") case AVMBytesEncoding.base16 | AVMBytesEncoding.unknown: return f"0x{b.hex()}" + + +def format_tuple_index(var_name: str, index: int | str) -> str: + return f"{var_name}.{index}" From dbb8f7d633700472330d8c5358e0a40c17995155 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 5 Mar 2024 12:29:30 +0800 Subject: [PATCH 38/40] refactoring --- .../amm/out/ConstantProductAMM.approval.mir | 2268 ++++++++--------- .../out/ConstantProductAMM.destructured.ir | 168 +- examples/amm/out/ConstantProductAMM.ssa.ir | 172 +- .../out/ConstantProductAMM.ssa.opt_pass_1.ir | 168 +- .../out_O2/ConstantProductAMM.destructured.ir | 168 +- .../ConstantProductAMM.destructured.ir | 172 +- examples/amm/puya.log | 234 +- examples/auction/out/Auction.approval.mir | 912 +++---- examples/auction/out/Auction.destructured.ir | 64 +- examples/auction/out/Auction.ssa.ir | 66 +- .../auction/out/Auction.ssa.opt_pass_1.ir | 64 +- .../auction/out_O2/Auction.destructured.ir | 64 +- .../out_unoptimized/Auction.destructured.ir | 66 +- examples/auction/puya.log | 100 +- .../out/AppStateContract.approval.mir | 58 +- .../out/AppStateContract.destructured.ir | 24 +- .../global_state/out/AppStateContract.ssa.ir | 24 +- .../out/AppStateContract.ssa.opt_pass_1.ir | 24 +- .../out_O2/AppStateContract.destructured.ir | 24 +- .../AppStateContract.destructured.ir | 24 +- examples/global_state/puya.log | 32 +- .../out/LocalStateContract.approval.mir | 372 +-- .../out/LocalStateContract.destructured.ir | 6 +- .../local_state/out/LocalStateContract.ssa.ir | 6 +- .../out/LocalStateContract.ssa.opt_pass_1.ir | 6 +- .../out/LocalStateContract.ssa.opt_pass_2.ir | 6 +- .../out/LocalStateWithOffsets.approval.mir | 370 +-- .../out/LocalStateWithOffsets.destructured.ir | 6 +- .../out/LocalStateWithOffsets.ssa.ir | 6 +- .../LocalStateWithOffsets.ssa.opt_pass_1.ir | 6 +- .../LocalStateWithOffsets.ssa.opt_pass_2.ir | 6 +- .../out_O2/LocalStateContract.destructured.ir | 6 +- .../LocalStateWithOffsets.destructured.ir | 6 +- .../LocalStateContract.destructured.ir | 6 +- .../LocalStateWithOffsets.destructured.ir | 6 +- examples/local_state/puya.log | 16 +- .../voting/out/VotingRoundApp.approval.mir | 2152 ++++++++-------- .../voting/out/VotingRoundApp.destructured.ir | 106 +- examples/voting/out/VotingRoundApp.ssa.ir | 106 +- .../out/VotingRoundApp.ssa.opt_pass_1.ir | 106 +- .../out/VotingRoundApp.ssa.opt_pass_2.ir | 106 +- .../out_O2/VotingRoundApp.destructured.ir | 106 +- .../VotingRoundApp.destructured.ir | 106 +- examples/voting/puya.log | 148 +- src/puya/ir/builder/state.py | 204 +- .../abi_routing/out/Reference.approval.mir | 2020 +++++++-------- .../abi_routing/out/Reference.destructured.ir | 12 +- test_cases/abi_routing/out/Reference.ssa.ir | 12 +- .../out/Reference.ssa.opt_pass_1.ir | 12 +- .../out/Reference.ssa.opt_pass_2.ir | 12 +- .../out/Reference.ssa.opt_pass_3.ir | 12 +- .../out/Reference.ssa.opt_pass_4.ir | 12 +- .../out_O2/Reference.destructured.ir | 12 +- .../out_unoptimized/Reference.destructured.ir | 12 +- test_cases/abi_routing/puya.log | 16 +- test_cases/asset/out/Reference.approval.mir | 502 ++-- .../asset/out/Reference.destructured.ir | 12 +- test_cases/asset/out/Reference.ssa.ir | 12 +- .../asset/out/Reference.ssa.opt_pass_1.ir | 12 +- .../asset/out_O2/Reference.destructured.ir | 12 +- .../out_unoptimized/Reference.destructured.ir | 12 +- test_cases/asset/puya.log | 16 +- .../out/Augmented.approval.mir | 230 +- .../out/Augmented.destructured.ir | 24 +- .../augmented_assignment/out/Augmented.ssa.ir | 24 +- .../out_O2/Augmented.destructured.ir | 24 +- .../out_unoptimized/Augmented.destructured.ir | 24 +- test_cases/augmented_assignment/puya.log | 32 +- .../ConditionalExecutionContract.approval.mir | 606 ++--- ...nditionalExecutionContract.destructured.ir | 84 +- .../out/ConditionalExecutionContract.ssa.ir | 84 +- ...itionalExecutionContract.ssa.opt_pass_1.ir | 84 +- ...itionalExecutionContract.ssa.opt_pass_2.ir | 84 +- ...nditionalExecutionContract.destructured.ir | 84 +- ...nditionalExecutionContract.destructured.ir | 84 +- test_cases/conditional_execution/puya.log | 112 +- .../everything/out/MyContract.approval.mir | 592 ++--- .../everything/out/MyContract.clear.mir | 48 +- .../everything/out/MyContract.destructured.ir | 18 +- test_cases/everything/out/MyContract.ssa.ir | 18 +- .../out/MyContract.ssa.opt_pass_1.ir | 18 +- .../out_O2/MyContract.destructured.ir | 18 +- .../MyContract.destructured.ir | 18 +- test_cases/everything/puya.log | 24 +- .../out/Greeter.approval.mir | 298 +-- .../out/Greeter.destructured.ir | 18 +- .../inner_transactions/out/Greeter.ssa.ir | 18 +- .../out/Greeter.ssa.opt_pass_1.ir | 18 +- .../out/MyContract.approval.mir | 94 +- .../out/MyContract.destructured.ir | 12 +- .../inner_transactions/out/MyContract.ssa.ir | 12 +- .../out/MyContract.ssa.opt_pass_1.ir | 12 +- .../out/MyContract.ssa.opt_pass_2.ir | 12 +- .../out_O2/Greeter.destructured.ir | 18 +- .../out_O2/MyContract.destructured.ir | 12 +- .../out_unoptimized/Greeter.destructured.ir | 18 +- .../MyContract.destructured.ir | 12 +- test_cases/inner_transactions/puya.log | 52 +- test_cases/match/out/MyContract.approval.mir | 214 +- .../match/out/MyContract.destructured.ir | 10 +- test_cases/match/out/MyContract.ssa.ir | 10 +- .../match/out/MyContract.ssa.opt_pass_1.ir | 10 +- .../match/out_O2/MyContract.destructured.ir | 10 +- .../MyContract.destructured.ir | 10 +- test_cases/match/puya.log | 16 +- test_cases/simplish/out/Simplish.approval.mir | 710 +++--- .../simplish/out/Simplish.destructured.ir | 12 +- test_cases/simplish/out/Simplish.ssa.ir | 12 +- .../simplish/out/Simplish.ssa.opt_pass_1.ir | 12 +- .../simplish/out/Simplish.ssa.opt_pass_2.ir | 12 +- .../simplish/out_O2/Simplish.destructured.ir | 12 +- .../out_unoptimized/Simplish.destructured.ir | 12 +- test_cases/simplish/puya.log | 16 +- 113 files changed, 7756 insertions(+), 7838 deletions(-) diff --git a/examples/amm/out/ConstantProductAMM.approval.mir b/examples/amm/out/ConstantProductAMM.approval.mir index 4528a97ba0..9c87e3931d 100644 --- a/examples/amm/out/ConstantProductAMM.approval.mir +++ b/examples/amm/out/ConstantProductAMM.approval.mir @@ -1,10 +1,10 @@ -// Op // Op Description Stack (out) Live (out) X stack Source code Source line +// Op // Op Description Stack (out) Live (out) X stack Source code Source line #pragma version 10 // examples.amm.contract.ConstantProductAMM.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} + txn ApplicationID // {txn} // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // @@ -15,1306 +15,1306 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txn NumAppArgs // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - bz main_bare_routing@11 // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // Implicit fall through to main_abi_routing@3 // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txn NumAppArgs // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + bz main_bare_routing@11 // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // Implicit fall through to main_abi_routing@3 // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 main_abi_routing@3: - txna ApplicationArgs 0 // {txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - method "set_governor(account)void" // tmp%2#0,method<"set_governor(account)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - method "bootstrap(pay,asset,asset)uint64" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - method "mint(axfer,axfer,asset,asset,asset)void" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - method "burn(axfer,asset,asset,asset)void" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void">,method<"burn(axfer,asset,asset,asset)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - method "swap(axfer,asset,asset)void" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void">,method<"burn(axfer,asset,asset,asset)void">,method<"swap(axfer,asset,asset)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 5 // load tmp%2#0 from l-stack (no copy) method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void">,method<"burn(axfer,asset,asset,asset)void">,method<"swap(axfer,asset,asset)void">,tmp%2#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - match main_set_governor_route@4 main_bootstrap_route@5 main_mint_route@6 main_burn_route@7 main_swap_route@8 // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - err // reject transaction // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 0 // {txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + method "set_governor(account)void" // tmp%2#0,method<"set_governor(account)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + method "bootstrap(pay,asset,asset)uint64" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + method "mint(axfer,axfer,asset,asset,asset)void" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + method "burn(axfer,asset,asset,asset)void" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void">,method<"burn(axfer,asset,asset,asset)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + method "swap(axfer,asset,asset)void" // tmp%2#0,method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void">,method<"burn(axfer,asset,asset,asset)void">,method<"swap(axfer,asset,asset)void"> class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 5 // load tmp%2#0 from l-stack (no copy) method<"set_governor(account)void">,method<"bootstrap(pay,asset,asset)uint64">,method<"mint(axfer,axfer,asset,asset,asset)void">,method<"burn(axfer,asset,asset,asset)void">,method<"swap(axfer,asset,asset)void">,tmp%2#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + match main_set_governor_route@4 main_bootstrap_route@5 main_mint_route@6 main_burn_route@7 main_swap_route@8 // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + err // reject transaction // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 main_set_governor_route@4: - txn OnCompletion // {txn} arc4.abimethod() amm/contract.py:43 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod() amm/contract.py:43 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod() amm/contract.py:43 - ! // {!} arc4.abimethod() amm/contract.py:43 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod() amm/contract.py:43 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod() amm/contract.py:43 - assert // OnCompletion is NoOp // arc4.abimethod() amm/contract.py:43 - txn ApplicationID // {txn} arc4.abimethod() amm/contract.py:43 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod() amm/contract.py:43 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod() amm/contract.py:43 - assert // is not creating // arc4.abimethod() amm/contract.py:43 - txna ApplicationArgs 1 // {txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // {btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Accounts // {txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod() amm/contract.py:43 - callsub set_governor // arc4.abimethod() amm/contract.py:43 - int 1 // 1 arc4.abimethod() amm/contract.py:43 - return // arc4.abimethod() amm/contract.py:43 + txn OnCompletion // {txn} arc4.abimethod() amm/contract.py:43 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod() amm/contract.py:43 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod() amm/contract.py:43 + ! // {!} arc4.abimethod() amm/contract.py:43 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod() amm/contract.py:43 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod() amm/contract.py:43 + assert // OnCompletion is NoOp // arc4.abimethod() amm/contract.py:43 + txn ApplicationID // {txn} arc4.abimethod() amm/contract.py:43 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod() amm/contract.py:43 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod() amm/contract.py:43 + assert // is not creating // arc4.abimethod() amm/contract.py:43 + txna ApplicationArgs 1 // {txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // {btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Accounts // {txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod() amm/contract.py:43 + callsub set_governor // arc4.abimethod() amm/contract.py:43 + int 1 // 1 arc4.abimethod() amm/contract.py:43 + return // arc4.abimethod() amm/contract.py:43 main_bootstrap_route@5: - txn OnCompletion // {txn} arc4.abimethod() amm/contract.py:49 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 arc4.abimethod() amm/contract.py:49 - // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod() amm/contract.py:49 - ! // {!} arc4.abimethod() amm/contract.py:49 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod() amm/contract.py:49 - // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 arc4.abimethod() amm/contract.py:49 - assert // OnCompletion is NoOp // arc4.abimethod() amm/contract.py:49 - txn ApplicationID // {txn} arc4.abimethod() amm/contract.py:49 - // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod() amm/contract.py:49 - // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod() amm/contract.py:49 - assert // is not creating // arc4.abimethod() amm/contract.py:49 - txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // tmp%14#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%16#0 to l-stack (no copy) awst_tmp%15#0,tmp%16#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%16#0 from l-stack (no copy) awst_tmp%15#0,tmp%16#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int pay // awst_tmp%15#0,tmp%16#0,pay class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%17#0 to l-stack (no copy) awst_tmp%15#0,tmp%17#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%17#0 from l-stack (no copy) awst_tmp%15#0,tmp%17#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is pay // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%18#0 to l-stack (no copy) awst_tmp%15#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%18#0 from l-stack (no copy) awst_tmp%15#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%19#0 to l-stack (no copy) awst_tmp%15#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%19#0 from l-stack (no copy) awst_tmp%15#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%20#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%15#0,tmp%20#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%21#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%21#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%20#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%22#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%22#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%20#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%23#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%23#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 2 // load awst_tmp%15#0 from l-stack (no copy) tmp%20#0,tmp%23#0,awst_tmp%15#0 arc4.abimethod() amm/contract.py:49 - uncover 2 // load tmp%20#0 from l-stack (no copy) tmp%23#0,awst_tmp%15#0,tmp%20#0 arc4.abimethod() amm/contract.py:49 - uncover 2 // load tmp%23#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%23#0 arc4.abimethod() amm/contract.py:49 - callsub bootstrap // {bootstrap} arc4.abimethod() amm/contract.py:49 - // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 arc4.abimethod() amm/contract.py:49 - byte 0x151f7c75 // tmp%24#0,0x151f7c75 arc4.abimethod() amm/contract.py:49 - swap // load tmp%24#0 from l-stack (no copy) 0x151f7c75,tmp%24#0 arc4.abimethod() amm/contract.py:49 - concat // {concat} arc4.abimethod() amm/contract.py:49 - // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 arc4.abimethod() amm/contract.py:49 - // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 arc4.abimethod() amm/contract.py:49 - log // arc4.abimethod() amm/contract.py:49 - int 1 // 1 arc4.abimethod() amm/contract.py:49 - return // arc4.abimethod() amm/contract.py:49 + txn OnCompletion // {txn} arc4.abimethod() amm/contract.py:49 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 arc4.abimethod() amm/contract.py:49 + // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod() amm/contract.py:49 + ! // {!} arc4.abimethod() amm/contract.py:49 + // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod() amm/contract.py:49 + // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 arc4.abimethod() amm/contract.py:49 + assert // OnCompletion is NoOp // arc4.abimethod() amm/contract.py:49 + txn ApplicationID // {txn} arc4.abimethod() amm/contract.py:49 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod() amm/contract.py:49 + // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod() amm/contract.py:49 + assert // is not creating // arc4.abimethod() amm/contract.py:49 + txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // tmp%14#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%16#0 to l-stack (no copy) awst_tmp%15#0,tmp%16#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%16#0 from l-stack (no copy) awst_tmp%15#0,tmp%16#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int pay // awst_tmp%15#0,tmp%16#0,pay class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%17#0 to l-stack (no copy) awst_tmp%15#0,tmp%17#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%17#0 from l-stack (no copy) awst_tmp%15#0,tmp%17#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is pay // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%18#0 to l-stack (no copy) awst_tmp%15#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%18#0 from l-stack (no copy) awst_tmp%15#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%19#0 to l-stack (no copy) awst_tmp%15#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%19#0 from l-stack (no copy) awst_tmp%15#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%20#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%15#0,tmp%20#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%21#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%21#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%15#0,tmp%20#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%22#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%22#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%15#0,tmp%20#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%23#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%23#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 2 // load awst_tmp%15#0 from l-stack (no copy) tmp%20#0,tmp%23#0,awst_tmp%15#0 arc4.abimethod() amm/contract.py:49 + uncover 2 // load tmp%20#0 from l-stack (no copy) tmp%23#0,awst_tmp%15#0,tmp%20#0 arc4.abimethod() amm/contract.py:49 + uncover 2 // load tmp%23#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%23#0 arc4.abimethod() amm/contract.py:49 + callsub bootstrap // {bootstrap} arc4.abimethod() amm/contract.py:49 + // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 arc4.abimethod() amm/contract.py:49 + byte 0x151f7c75 // tmp%24#0,0x151f7c75 arc4.abimethod() amm/contract.py:49 + swap // load tmp%24#0 from l-stack (no copy) 0x151f7c75,tmp%24#0 arc4.abimethod() amm/contract.py:49 + concat // {concat} arc4.abimethod() amm/contract.py:49 + // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 arc4.abimethod() amm/contract.py:49 + // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 arc4.abimethod() amm/contract.py:49 + log // arc4.abimethod() amm/contract.py:49 + int 1 // 1 arc4.abimethod() amm/contract.py:49 + return // arc4.abimethod() amm/contract.py:49 main_mint_route@6: - txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - ! // {!} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - // virtual: store tmp%27#0 to l-stack (no copy) tmp%27#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - // virtual: load tmp%27#0 from l-stack (no copy) tmp%27#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - assert // is not creating // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%31#0 to l-stack (no copy) tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%31#0 from l-stack (no copy) tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 2 // tmp%31#0,2 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%32#0 to l-stack (no copy) awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%32#0 from l-stack (copy) awst_tmp%32#0,awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%32#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%33#0 to l-stack (no copy) awst_tmp%32#0,tmp%33#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%33#0 from l-stack (no copy) awst_tmp%32#0,tmp%33#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%32#0,tmp%33#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%32#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%34#0 to l-stack (no copy) awst_tmp%32#0,tmp%34#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%34#0 from l-stack (no copy) awst_tmp%32#0,tmp%34#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txn GroupIndex // awst_tmp%32#0,{txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%37#0 to l-stack (no copy) awst_tmp%32#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%37#0 from l-stack (no copy) awst_tmp%32#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // awst_tmp%32#0,tmp%37#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - - // awst_tmp%32#0,{-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%32#0,awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%32#0,awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%38#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%38#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%38#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%38#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%32#0,awst_tmp%15#0,tmp%38#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%32#0,awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%39#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%39#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%39#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%39#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%32#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%32#0,awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%40#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%40#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%32#0,awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%41#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%41#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%32#0,awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 3 // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%46#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%47#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%47#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%48#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 4 // load awst_tmp%32#0 from l-stack (no copy) awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%32#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load awst_tmp%15#0 from l-stack (no copy) tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%32#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load tmp%42#0 from l-stack (no copy) tmp%45#0,tmp%48#0,awst_tmp%32#0,awst_tmp%15#0,tmp%42#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load tmp%45#0 from l-stack (no copy) tmp%48#0,awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load tmp%48#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - callsub mint // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - int 1 // 1 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - return // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + ! // {!} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + // virtual: store tmp%27#0 to l-stack (no copy) tmp%27#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + // virtual: load tmp%27#0 from l-stack (no copy) tmp%27#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + assert // is not creating // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%31#0 to l-stack (no copy) tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%31#0 from l-stack (no copy) tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 2 // tmp%31#0,2 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store awst_tmp%32#0 to l-stack (no copy) awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%32#0 from l-stack (copy) awst_tmp%32#0,awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%32#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%33#0 to l-stack (no copy) awst_tmp%32#0,tmp%33#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%33#0 from l-stack (no copy) awst_tmp%32#0,tmp%33#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%32#0,tmp%33#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%32#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%34#0 to l-stack (no copy) awst_tmp%32#0,tmp%34#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%34#0 from l-stack (no copy) awst_tmp%32#0,tmp%34#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txn GroupIndex // awst_tmp%32#0,{txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%37#0 to l-stack (no copy) awst_tmp%32#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%37#0 from l-stack (no copy) awst_tmp%32#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // awst_tmp%32#0,tmp%37#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + - // awst_tmp%32#0,{-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%32#0,awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%32#0,awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%38#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%38#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%38#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%38#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%32#0,awst_tmp%15#0,tmp%38#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%32#0,awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%39#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%39#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%39#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%39#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%32#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%32#0,awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%40#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%40#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%32#0,awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%41#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%41#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%32#0,awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 3 // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%46#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%47#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%47#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%48#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 4 // load awst_tmp%32#0 from l-stack (no copy) awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%32#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load awst_tmp%15#0 from l-stack (no copy) tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%32#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load tmp%42#0 from l-stack (no copy) tmp%45#0,tmp%48#0,awst_tmp%32#0,awst_tmp%15#0,tmp%42#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load tmp%45#0 from l-stack (no copy) tmp%48#0,awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load tmp%48#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + callsub mint // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + int 1 // 1 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + return // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 main_burn_route@7: - txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - // virtual: store tmp%49#0 to l-stack (no copy) tmp%49#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - // virtual: load tmp%49#0 from l-stack (no copy) tmp%49#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - ! // {!} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - // virtual: store tmp%50#0 to l-stack (no copy) tmp%50#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - // virtual: load tmp%50#0 from l-stack (no copy) tmp%50#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - // virtual: store tmp%51#0 to l-stack (no copy) tmp%51#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - // virtual: load tmp%51#0 from l-stack (no copy) tmp%51#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - assert // is not creating // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%54#0 to l-stack (no copy) tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%54#0 from l-stack (no copy) tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // tmp%54#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%55#0 to l-stack (no copy) awst_tmp%15#0,tmp%55#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%55#0 from l-stack (no copy) awst_tmp%15#0,tmp%55#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%15#0,tmp%55#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%56#0 to l-stack (no copy) awst_tmp%15#0,tmp%56#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%56#0 from l-stack (no copy) awst_tmp%15#0,tmp%56#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%57#0 to l-stack (no copy) awst_tmp%15#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%57#0 from l-stack (no copy) awst_tmp%15#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%58#0 to l-stack (no copy) awst_tmp%15#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%58#0 from l-stack (no copy) awst_tmp%15#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%59#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%15#0,tmp%59#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%60#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%60#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%59#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%61#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%61#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%59#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%62#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 3 // awst_tmp%15#0,tmp%59#0,tmp%62#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%63#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%63#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%59#0,tmp%62#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%64#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%64#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%59#0,tmp%62#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%65#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%65#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 3 // load awst_tmp%15#0 from l-stack (no copy) tmp%59#0,tmp%62#0,tmp%65#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - uncover 3 // load tmp%59#0 from l-stack (no copy) tmp%62#0,tmp%65#0,awst_tmp%15#0,tmp%59#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - uncover 3 // load tmp%62#0 from l-stack (no copy) tmp%65#0,awst_tmp%15#0,tmp%59#0,tmp%62#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - uncover 3 // load tmp%65#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%65#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - callsub burn // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - int 1 // 1 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - return // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + // virtual: store tmp%49#0 to l-stack (no copy) tmp%49#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + // virtual: load tmp%49#0 from l-stack (no copy) tmp%49#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + ! // {!} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + // virtual: store tmp%50#0 to l-stack (no copy) tmp%50#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + // virtual: load tmp%50#0 from l-stack (no copy) tmp%50#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + // virtual: store tmp%51#0 to l-stack (no copy) tmp%51#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + // virtual: load tmp%51#0 from l-stack (no copy) tmp%51#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + assert // is not creating // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%54#0 to l-stack (no copy) tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%54#0 from l-stack (no copy) tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // tmp%54#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%55#0 to l-stack (no copy) awst_tmp%15#0,tmp%55#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%55#0 from l-stack (no copy) awst_tmp%15#0,tmp%55#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%15#0,tmp%55#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%56#0 to l-stack (no copy) awst_tmp%15#0,tmp%56#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%56#0 from l-stack (no copy) awst_tmp%15#0,tmp%56#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%57#0 to l-stack (no copy) awst_tmp%15#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%57#0 from l-stack (no copy) awst_tmp%15#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%58#0 to l-stack (no copy) awst_tmp%15#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%58#0 from l-stack (no copy) awst_tmp%15#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%59#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%15#0,tmp%59#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%60#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%60#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%15#0,tmp%59#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%61#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%61#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%15#0,tmp%59#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%62#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 3 // awst_tmp%15#0,tmp%59#0,tmp%62#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%63#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%63#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%15#0,tmp%59#0,tmp%62#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%64#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%64#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%15#0,tmp%59#0,tmp%62#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%65#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%65#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 3 // load awst_tmp%15#0 from l-stack (no copy) tmp%59#0,tmp%62#0,tmp%65#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + uncover 3 // load tmp%59#0 from l-stack (no copy) tmp%62#0,tmp%65#0,awst_tmp%15#0,tmp%59#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + uncover 3 // load tmp%62#0 from l-stack (no copy) tmp%65#0,awst_tmp%15#0,tmp%59#0,tmp%62#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + uncover 3 // load tmp%65#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%65#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + callsub burn // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + int 1 // 1 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + return // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 main_swap_route@8: - txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - // virtual: store tmp%66#0 to l-stack (no copy) tmp%66#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - // virtual: load tmp%66#0 from l-stack (no copy) tmp%66#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - ! // {!} arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - // virtual: store tmp%67#0 to l-stack (no copy) tmp%67#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - // virtual: load tmp%67#0 from l-stack (no copy) tmp%67#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - // virtual: store tmp%68#0 to l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - // virtual: load tmp%68#0 from l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - assert // is not creating // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%71#0 to l-stack (no copy) tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%71#0 from l-stack (no copy) tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // tmp%71#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%72#0 to l-stack (no copy) awst_tmp%15#0,tmp%72#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%72#0 from l-stack (no copy) awst_tmp%15#0,tmp%72#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%15#0,tmp%72#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%73#0 to l-stack (no copy) awst_tmp%15#0,tmp%73#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%73#0 from l-stack (no copy) awst_tmp%15#0,tmp%73#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%74#0 to l-stack (no copy) awst_tmp%15#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%74#0 from l-stack (no copy) awst_tmp%15#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%75#0 to l-stack (no copy) awst_tmp%15#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%75#0 from l-stack (no copy) awst_tmp%15#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%76#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%15#0,tmp%76#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%77#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%77#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%76#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%78#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%78#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%76#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%79#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%79#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 2 // load awst_tmp%15#0 from l-stack (no copy) tmp%76#0,tmp%79#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - uncover 2 // load tmp%76#0 from l-stack (no copy) tmp%79#0,awst_tmp%15#0,tmp%76#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - uncover 2 // load tmp%79#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%79#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - callsub swap // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - int 1 // 1 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - return // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + // virtual: store tmp%66#0 to l-stack (no copy) tmp%66#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + // virtual: load tmp%66#0 from l-stack (no copy) tmp%66#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + ! // {!} arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + // virtual: store tmp%67#0 to l-stack (no copy) tmp%67#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + // virtual: load tmp%67#0 from l-stack (no copy) tmp%67#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + // virtual: store tmp%68#0 to l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + // virtual: load tmp%68#0 from l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + assert // is not creating // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%71#0 to l-stack (no copy) tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%71#0 from l-stack (no copy) tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // tmp%71#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%72#0 to l-stack (no copy) awst_tmp%15#0,tmp%72#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%72#0 from l-stack (no copy) awst_tmp%15#0,tmp%72#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%15#0,tmp%72#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%73#0 to l-stack (no copy) awst_tmp%15#0,tmp%73#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%73#0 from l-stack (no copy) awst_tmp%15#0,tmp%73#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%74#0 to l-stack (no copy) awst_tmp%15#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%74#0 from l-stack (no copy) awst_tmp%15#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%75#0 to l-stack (no copy) awst_tmp%15#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%75#0 from l-stack (no copy) awst_tmp%15#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%76#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%15#0,tmp%76#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%77#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%77#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%15#0,tmp%76#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%78#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%78#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%15#0,tmp%76#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%79#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%79#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 2 // load awst_tmp%15#0 from l-stack (no copy) tmp%76#0,tmp%79#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + uncover 2 // load tmp%76#0 from l-stack (no copy) tmp%79#0,awst_tmp%15#0,tmp%76#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + uncover 2 // load tmp%79#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%79#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + callsub swap // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + int 1 // 1 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + return // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 main_bare_routing@11: - txn OnCompletion // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%80#0 to l-stack (no copy) tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%80#0 from l-stack (no copy) tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - ! // {!} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store not%tmp%80#0 to l-stack (no copy) not%tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load not%tmp%80#0 from l-stack (no copy) not%tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // reject transaction // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txn ApplicationID // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%81#0 to l-stack (no copy) tmp%81#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%81#0 from l-stack (no copy) tmp%81#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - ! // {!} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%82#0 to l-stack (no copy) tmp%82#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%82#0 from l-stack (no copy) tmp%82#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // is creating // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // 1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - return // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txn OnCompletion // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%80#0 to l-stack (no copy) tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%80#0 from l-stack (no copy) tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + ! // {!} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store not%tmp%80#0 to l-stack (no copy) not%tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load not%tmp%80#0 from l-stack (no copy) not%tmp%80#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // reject transaction // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txn ApplicationID // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%81#0 to l-stack (no copy) tmp%81#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%81#0 from l-stack (no copy) tmp%81#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + ! // {!} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%82#0 to l-stack (no copy) tmp%82#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%82#0 from l-stack (no copy) tmp%82#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // is creating // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // 1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + return // class ConstantProductAMM(ARC4Contract): amm/contract.py:27 // examples.amm.contract.ConstantProductAMM.set_governor(new_governor: bytes) -> void: set_governor: - proto 1 0 // (𝕡) new_governor#0 | @arc4.abimethod()\ndef set_governor(self, new_governor: Account) -> None: amm/contract.py:43-44 + proto 1 0 // (𝕡) new_governor#0 | @arc4.abimethod()\ndef set_governor(self, new_governor: Account) -> None: amm/contract.py:43-44 set_governor_block@0: - callsub _check_is_governor // (𝕡) new_governor#0 | self._check_is_governor() amm/contract.py:46 - byte "governor" // (𝕡) new_governor#0 | "governor" self.governor amm/contract.py:47 - frame_dig -1 // load new_governor#0 from parameters (𝕡) new_governor#0 | "governor",new_governor#0 self.governor = new_governor amm/contract.py:47 - app_global_put // (𝕡) new_governor#0 | self.governor = new_governor amm/contract.py:47 + callsub _check_is_governor // (𝕡) new_governor#0 | self._check_is_governor() amm/contract.py:46 + byte "governor" // (𝕡) new_governor#0 | "governor" self.governor amm/contract.py:47 + frame_dig -1 // load new_governor#0 from parameters (𝕡) new_governor#0 | "governor",new_governor#0 self.governor = new_governor amm/contract.py:47 + app_global_put // (𝕡) new_governor#0 | self.governor = new_governor amm/contract.py:47 retsub // // examples.amm.contract.ConstantProductAMM._check_is_governor() -> void: _check_is_governor: - proto 0 0 // @subroutine\ndef _check_is_governor(self) -> None: amm/contract.py:264-265 + proto 0 0 // @subroutine\ndef _check_is_governor(self) -> None: amm/contract.py:264-265 _check_is_governor_block@0: - txn Sender // {txn} Txn.sender amm/contract.py:267 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender amm/contract.py:267 - int 0 // tmp%0#0,0 self.governor amm/contract.py:267 - byte "governor" // tmp%0#0,0,"governor" self.governor amm/contract.py:267 - app_global_get_ex // tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.governor amm/contract.py:267 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.governor amm/contract.py:267 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.governor amm/contract.py:267 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.governor amm/contract.py:267 - assert // check governor exists // tmp%0#0,app_global_get_ex_value%1#0 self.governor amm/contract.py:267 - // virtual: load tmp%0#0 from l-stack (no copy) app_global_get_ex_value%1#0,tmp%0#0 Txn.sender == self.governor amm/contract.py:267 - // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) tmp%0#0,app_global_get_ex_value%1#0 Txn.sender == self.governor amm/contract.py:267 - == // {==} Txn.sender == self.governor amm/contract.py:267 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 Txn.sender == self.governor amm/contract.py:267 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 assert (\nTxn.sender == self.governor\n), "Only the account set in global_state.governor may call... amm/contract.py:266-268 - assert // Only the account set in global_state.governor may call this method // assert (\nTxn.sender == self.governor\n), "Only the account set in global_state.governor may call... amm/contract.py:266-268 + txn Sender // {txn} Txn.sender amm/contract.py:267 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender amm/contract.py:267 + int 0 // tmp%0#0,0 self.governor amm/contract.py:267 + byte "governor" // tmp%0#0,0,"governor" self.governor amm/contract.py:267 + app_global_get_ex // tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.governor amm/contract.py:267 + // virtual: store governor_exists%2#0 to l-stack (no copy) tmp%0#0,governor_exists%2#0,{app_global_get_ex}.0 self.governor amm/contract.py:267 + // virtual: store governor_value%1#0 to l-stack (no copy) tmp%0#0,governor_value%1#0,governor_exists%2#0 self.governor amm/contract.py:267 + // virtual: load governor_exists%2#0 from l-stack (no copy) tmp%0#0,governor_value%1#0,governor_exists%2#0 self.governor amm/contract.py:267 + assert // check governor exists // tmp%0#0,governor_value%1#0 self.governor amm/contract.py:267 + // virtual: load tmp%0#0 from l-stack (no copy) governor_value%1#0,tmp%0#0 Txn.sender == self.governor amm/contract.py:267 + // virtual: load governor_value%1#0 from l-stack (no copy) tmp%0#0,governor_value%1#0 Txn.sender == self.governor amm/contract.py:267 + == // {==} Txn.sender == self.governor amm/contract.py:267 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 Txn.sender == self.governor amm/contract.py:267 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 assert (\nTxn.sender == self.governor\n), "Only the account set in global_state.governor may call... amm/contract.py:266-268 + assert // Only the account set in global_state.governor may call this method // assert (\nTxn.sender == self.governor\n), "Only the account set in global_state.governor may call... amm/contract.py:266-268 retsub // // examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: bootstrap: - proto 3 1 // (𝕡) seed#0,a_asset#0,b_asset#0 | @arc4.abimethod()\ndef bootstrap(\nself, seed: gtxn.PaymentTransaction, a_asset: Asset, b_asset: ... amm/contract.py:49-52 + proto 3 1 // (𝕡) seed#0,a_asset#0,b_asset#0 | @arc4.abimethod()\ndef bootstrap(\nself, seed: gtxn.PaymentTransaction, a_asset: Asset, b_asset: ... amm/contract.py:49-52 bootstrap_block@0: - int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.pool_token amm/contract.py:68 - byte "pool_token" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"pool_token" self.pool_token amm/contract.py:68 - app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:68 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:68 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:68 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:68 - assert // check pool_token exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 self.pool_token amm/contract.py:68 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 not self.pool_token amm/contract.py:68 - ! // (𝕡) seed#0,a_asset#0,b_asset#0 | {!} not self.pool_token amm/contract.py:68 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%2#0 not self.pool_token amm/contract.py:68 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%2#0 assert not self.pool_token, "application has already been bootstrapped" amm/contract.py:68 - assert // application has already been bootstrapped // (𝕡) seed#0,a_asset#0,b_asset#0 | assert not self.pool_token, "application has already been bootstrapped" amm/contract.py:68 - callsub _check_is_governor // (𝕡) seed#0,a_asset#0,b_asset#0 | self._check_is_governor() amm/contract.py:69 - global GroupSize // (𝕡) seed#0,a_asset#0,b_asset#0 | {global} Global.group_size amm/contract.py:70 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%3#0 Global.group_size amm/contract.py:70 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%3#0 Global.group_size == 2, "group size not 2" amm/contract.py:70 - int 2 // (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%3#0,2 2 amm/contract.py:70 - == // (𝕡) seed#0,a_asset#0,b_asset#0 | {==} Global.group_size == 2, "group size not 2" amm/contract.py:70 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%4#0 Global.group_size == 2, "group size not 2" amm/contract.py:70 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%4#0 assert Global.group_size == 2, "group size not 2" amm/contract.py:70 - assert // group size not 2 // (𝕡) seed#0,a_asset#0,b_asset#0 | assert Global.group_size == 2, "group size not 2" amm/contract.py:70 - frame_dig -3 // load seed#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | seed#0 seed.receiver amm/contract.py:71 - gtxns Receiver // (𝕡) seed#0,a_asset#0,b_asset#0 | {gtxns} seed.receiver amm/contract.py:71 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0 seed.receiver amm/contract.py:71 - global CurrentApplicationAddress // (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0,{global} Global.current_application_address amm/contract.py:71 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0,tmp%6#0 Global.current_application_address amm/contract.py:71 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%6#0,tmp%5#0 seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0,tmp%6#0 seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 - == // (𝕡) seed#0,a_asset#0,b_asset#0 | {==} seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%7#0 seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%7#0 assert seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 - assert // receiver not app address // (𝕡) seed#0,a_asset#0,b_asset#0 | assert seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 - frame_dig -3 // load seed#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | seed#0 seed.amount amm/contract.py:73 - gtxns Amount // (𝕡) seed#0,a_asset#0,b_asset#0 | {gtxns} seed.amount amm/contract.py:73 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%8#0 seed.amount amm/contract.py:73 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%8#0 seed.amount >= 300_000, "amount minimum not met" # 0.3 Algos amm/contract.py:73 - int 300000 // (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%8#0,300000 300_000 amm/contract.py:73 - >= // (𝕡) seed#0,a_asset#0,b_asset#0 | {>=} seed.amount >= 300_000, "amount minimum not met" # 0.3 Algos amm/contract.py:73 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%9#0 seed.amount >= 300_000, "amount minimum not met" # 0.3 Algos amm/contract.py:73 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%9#0 assert seed.amount >= 300_000, "amount minimum not met" amm/contract.py:73 - assert // amount minimum not met // (𝕡) seed#0,a_asset#0,b_asset#0 | assert seed.amount >= 300_000, "amount minimum not met" amm/contract.py:73 - frame_dig -2 // load a_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | a_asset#0 a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 - frame_dig -1 // load b_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | a_asset#0,b_asset#0 a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 - < // (𝕡) seed#0,a_asset#0,b_asset#0 | {<} a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%10#0 a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%10#0 assert a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 - assert // asset a must be less than asset b // (𝕡) seed#0,a_asset#0,b_asset#0 | assert a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 - byte "asset_a" // (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_a" self.asset_a amm/contract.py:75 - frame_dig -2 // load a_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_a",a_asset#0 self.asset_a = a_asset amm/contract.py:75 - app_global_put // (𝕡) seed#0,a_asset#0,b_asset#0 | self.asset_a = a_asset amm/contract.py:75 - byte "asset_b" // (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_b" self.asset_b amm/contract.py:76 - frame_dig -1 // load b_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_b",b_asset#0 self.asset_b = b_asset amm/contract.py:76 - app_global_put // (𝕡) seed#0,a_asset#0,b_asset#0 | self.asset_b = b_asset amm/contract.py:76 - callsub _create_pool_token // (𝕡) seed#0,a_asset#0,b_asset#0 | {_create_pool_token} self._create_pool_token() amm/contract.py:77 - // virtual: store new_state_value%11#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | new_state_value%11#0 self._create_pool_token() amm/contract.py:77 - byte "pool_token" // (𝕡) seed#0,a_asset#0,b_asset#0 | new_state_value%11#0,"pool_token" self.pool_token amm/contract.py:77 - swap // load new_state_value%11#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | "pool_token",new_state_value%11#0 self.pool_token = self._create_pool_token() amm/contract.py:77 - app_global_put // (𝕡) seed#0,a_asset#0,b_asset#0 | self.pool_token = self._create_pool_token() amm/contract.py:77 - int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.asset_a amm/contract.py:79 - byte "asset_a" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:79 - app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:79 - // virtual: store app_global_get_ex_did_exist%13#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%13#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:79 - // virtual: store app_global_get_ex_value%12#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.asset_a amm/contract.py:79 - // virtual: load app_global_get_ex_did_exist%13#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.asset_a amm/contract.py:79 - assert // check asset_a exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0 self.asset_a amm/contract.py:79 - // virtual: load app_global_get_ex_value%12#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%12#0 self._do_opt_in(self.asset_a) amm/contract.py:79 - callsub _do_opt_in // (𝕡) seed#0,a_asset#0,b_asset#0 | self._do_opt_in(self.asset_a) amm/contract.py:79 - int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.asset_b amm/contract.py:80 - byte "asset_b" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:80 - app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:80 - // virtual: store app_global_get_ex_did_exist%15#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%15#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:80 - // virtual: store app_global_get_ex_value%14#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.asset_b amm/contract.py:80 - // virtual: load app_global_get_ex_did_exist%15#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.asset_b amm/contract.py:80 - assert // check asset_b exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0 self.asset_b amm/contract.py:80 - // virtual: load app_global_get_ex_value%14#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%14#0 self._do_opt_in(self.asset_b) amm/contract.py:80 - callsub _do_opt_in // (𝕡) seed#0,a_asset#0,b_asset#0 | self._do_opt_in(self.asset_b) amm/contract.py:80 - int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.pool_token amm/contract.py:81 - byte "pool_token" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"pool_token" self.pool_token amm/contract.py:81 - app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:81 - // virtual: store app_global_get_ex_did_exist%17#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%17#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:81 - // virtual: store app_global_get_ex_value%16#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.pool_token amm/contract.py:81 - // virtual: load app_global_get_ex_did_exist%17#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.pool_token amm/contract.py:81 - assert // check pool_token exists // (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0 self.pool_token amm/contract.py:81 - // virtual: load app_global_get_ex_value%16#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | app_global_get_ex_value%16#0 arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 - itob // (𝕡) seed#0,a_asset#0,b_asset#0 | {itob} arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 - // virtual: store val_as_bytes%18#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | val_as_bytes%18#0 arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 - // virtual: load val_as_bytes%18#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | val_as_bytes%18#0 return arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 - retsub // val_as_bytes%18#0 return arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 + int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.pool_token amm/contract.py:68 + byte "pool_token" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"pool_token" self.pool_token amm/contract.py:68 + app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:68 + // virtual: store pool_token_exists%1#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_exists%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:68 + // virtual: store pool_token_value%0#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_token_exists%1#0 self.pool_token amm/contract.py:68 + // virtual: load pool_token_exists%1#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_token_exists%1#0 self.pool_token amm/contract.py:68 + assert // check pool_token exists // (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%0#0 self.pool_token amm/contract.py:68 + // virtual: load pool_token_value%0#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%0#0 not self.pool_token amm/contract.py:68 + ! // (𝕡) seed#0,a_asset#0,b_asset#0 | {!} not self.pool_token amm/contract.py:68 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%2#0 not self.pool_token amm/contract.py:68 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%2#0 assert not self.pool_token, "application has already been bootstrapped" amm/contract.py:68 + assert // application has already been bootstrapped // (𝕡) seed#0,a_asset#0,b_asset#0 | assert not self.pool_token, "application has already been bootstrapped" amm/contract.py:68 + callsub _check_is_governor // (𝕡) seed#0,a_asset#0,b_asset#0 | self._check_is_governor() amm/contract.py:69 + global GroupSize // (𝕡) seed#0,a_asset#0,b_asset#0 | {global} Global.group_size amm/contract.py:70 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%3#0 Global.group_size amm/contract.py:70 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%3#0 Global.group_size == 2, "group size not 2" amm/contract.py:70 + int 2 // (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%3#0,2 2 amm/contract.py:70 + == // (𝕡) seed#0,a_asset#0,b_asset#0 | {==} Global.group_size == 2, "group size not 2" amm/contract.py:70 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%4#0 Global.group_size == 2, "group size not 2" amm/contract.py:70 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%4#0 assert Global.group_size == 2, "group size not 2" amm/contract.py:70 + assert // group size not 2 // (𝕡) seed#0,a_asset#0,b_asset#0 | assert Global.group_size == 2, "group size not 2" amm/contract.py:70 + frame_dig -3 // load seed#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | seed#0 seed.receiver amm/contract.py:71 + gtxns Receiver // (𝕡) seed#0,a_asset#0,b_asset#0 | {gtxns} seed.receiver amm/contract.py:71 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0 seed.receiver amm/contract.py:71 + global CurrentApplicationAddress // (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0,{global} Global.current_application_address amm/contract.py:71 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0,tmp%6#0 Global.current_application_address amm/contract.py:71 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%6#0,tmp%5#0 seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%5#0,tmp%6#0 seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 + == // (𝕡) seed#0,a_asset#0,b_asset#0 | {==} seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%7#0 seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%7#0 assert seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 + assert // receiver not app address // (𝕡) seed#0,a_asset#0,b_asset#0 | assert seed.receiver == Global.current_application_address, "receiver not app address" amm/contract.py:71 + frame_dig -3 // load seed#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | seed#0 seed.amount amm/contract.py:73 + gtxns Amount // (𝕡) seed#0,a_asset#0,b_asset#0 | {gtxns} seed.amount amm/contract.py:73 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%8#0 seed.amount amm/contract.py:73 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%8#0 seed.amount >= 300_000, "amount minimum not met" # 0.3 Algos amm/contract.py:73 + int 300000 // (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%8#0,300000 300_000 amm/contract.py:73 + >= // (𝕡) seed#0,a_asset#0,b_asset#0 | {>=} seed.amount >= 300_000, "amount minimum not met" # 0.3 Algos amm/contract.py:73 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%9#0 seed.amount >= 300_000, "amount minimum not met" # 0.3 Algos amm/contract.py:73 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%9#0 assert seed.amount >= 300_000, "amount minimum not met" amm/contract.py:73 + assert // amount minimum not met // (𝕡) seed#0,a_asset#0,b_asset#0 | assert seed.amount >= 300_000, "amount minimum not met" amm/contract.py:73 + frame_dig -2 // load a_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | a_asset#0 a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 + frame_dig -1 // load b_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | a_asset#0,b_asset#0 a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 + < // (𝕡) seed#0,a_asset#0,b_asset#0 | {<} a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%10#0 a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | tmp%10#0 assert a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 + assert // asset a must be less than asset b // (𝕡) seed#0,a_asset#0,b_asset#0 | assert a_asset.asset_id < b_asset.asset_id, "asset a must be less than asset b" amm/contract.py:74 + byte "asset_a" // (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_a" self.asset_a amm/contract.py:75 + frame_dig -2 // load a_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_a",a_asset#0 self.asset_a = a_asset amm/contract.py:75 + app_global_put // (𝕡) seed#0,a_asset#0,b_asset#0 | self.asset_a = a_asset amm/contract.py:75 + byte "asset_b" // (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_b" self.asset_b amm/contract.py:76 + frame_dig -1 // load b_asset#0 from parameters (𝕡) seed#0,a_asset#0,b_asset#0 | "asset_b",b_asset#0 self.asset_b = b_asset amm/contract.py:76 + app_global_put // (𝕡) seed#0,a_asset#0,b_asset#0 | self.asset_b = b_asset amm/contract.py:76 + callsub _create_pool_token // (𝕡) seed#0,a_asset#0,b_asset#0 | {_create_pool_token} self._create_pool_token() amm/contract.py:77 + // virtual: store new_state_value%11#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | new_state_value%11#0 self._create_pool_token() amm/contract.py:77 + byte "pool_token" // (𝕡) seed#0,a_asset#0,b_asset#0 | new_state_value%11#0,"pool_token" self.pool_token amm/contract.py:77 + swap // load new_state_value%11#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | "pool_token",new_state_value%11#0 self.pool_token = self._create_pool_token() amm/contract.py:77 + app_global_put // (𝕡) seed#0,a_asset#0,b_asset#0 | self.pool_token = self._create_pool_token() amm/contract.py:77 + int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.asset_a amm/contract.py:79 + byte "asset_a" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:79 + app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:79 + // virtual: store asset_a_exists%13#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_a_exists%13#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:79 + // virtual: store asset_a_value%12#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_a_value%12#0,asset_a_exists%13#0 self.asset_a amm/contract.py:79 + // virtual: load asset_a_exists%13#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_a_value%12#0,asset_a_exists%13#0 self.asset_a amm/contract.py:79 + assert // check asset_a exists // (𝕡) seed#0,a_asset#0,b_asset#0 | asset_a_value%12#0 self.asset_a amm/contract.py:79 + // virtual: load asset_a_value%12#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_a_value%12#0 self._do_opt_in(self.asset_a) amm/contract.py:79 + callsub _do_opt_in // (𝕡) seed#0,a_asset#0,b_asset#0 | self._do_opt_in(self.asset_a) amm/contract.py:79 + int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.asset_b amm/contract.py:80 + byte "asset_b" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:80 + app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:80 + // virtual: store asset_b_exists%15#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_b_exists%15#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:80 + // virtual: store asset_b_value%14#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_b_value%14#0,asset_b_exists%15#0 self.asset_b amm/contract.py:80 + // virtual: load asset_b_exists%15#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_b_value%14#0,asset_b_exists%15#0 self.asset_b amm/contract.py:80 + assert // check asset_b exists // (𝕡) seed#0,a_asset#0,b_asset#0 | asset_b_value%14#0 self.asset_b amm/contract.py:80 + // virtual: load asset_b_value%14#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | asset_b_value%14#0 self._do_opt_in(self.asset_b) amm/contract.py:80 + callsub _do_opt_in // (𝕡) seed#0,a_asset#0,b_asset#0 | self._do_opt_in(self.asset_b) amm/contract.py:80 + int 0 // (𝕡) seed#0,a_asset#0,b_asset#0 | 0 self.pool_token amm/contract.py:81 + byte "pool_token" // (𝕡) seed#0,a_asset#0,b_asset#0 | 0,"pool_token" self.pool_token amm/contract.py:81 + app_global_get_ex // (𝕡) seed#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:81 + // virtual: store pool_token_exists%17#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_exists%17#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:81 + // virtual: store pool_token_value%16#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%16#0,pool_token_exists%17#0 self.pool_token amm/contract.py:81 + // virtual: load pool_token_exists%17#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%16#0,pool_token_exists%17#0 self.pool_token amm/contract.py:81 + assert // check pool_token exists // (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%16#0 self.pool_token amm/contract.py:81 + // virtual: load pool_token_value%16#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | pool_token_value%16#0 arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 + itob // (𝕡) seed#0,a_asset#0,b_asset#0 | {itob} arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 + // virtual: store val_as_bytes%18#0 to l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | val_as_bytes%18#0 arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 + // virtual: load val_as_bytes%18#0 from l-stack (no copy) (𝕡) seed#0,a_asset#0,b_asset#0 | val_as_bytes%18#0 return arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 + retsub // val_as_bytes%18#0 return arc4.UInt64(self.pool_token.asset_id) amm/contract.py:81 // examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: _create_pool_token: - proto 0 1 // @subroutine\ndef _create_pool_token(self) -> Asset: amm/contract.py:270-271 + proto 0 1 // @subroutine\ndef _create_pool_token(self) -> Asset: amm/contract.py:270-271 _create_pool_token_block@0: - itxn_begin // itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 - int 0 // 0 self.asset_a amm/contract.py:274 - byte "asset_a" // 0,"asset_a" self.asset_a amm/contract.py:274 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:274 - // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:274 - // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.asset_a amm/contract.py:274 - // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.asset_a amm/contract.py:274 - assert // check asset_a exists // app_global_get_ex_value%4#0 self.asset_a amm/contract.py:274 - // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) app_global_get_ex_value%4#0 self.asset_a.unit_name amm/contract.py:274 - asset_params_get AssetUnitName // {asset_params_get}.0,{asset_params_get}.1 self.asset_a.unit_name amm/contract.py:274 - // virtual: store maybe_value_did_exist%3#0 to l-stack (no copy) maybe_value_did_exist%3#0,{asset_params_get}.0 self.asset_a.unit_name amm/contract.py:274 - // virtual: store maybe_value%2#0 to l-stack (no copy) maybe_value%2#0,maybe_value_did_exist%3#0 self.asset_a.unit_name amm/contract.py:274 - // virtual: load maybe_value_did_exist%3#0 from l-stack (no copy) maybe_value%2#0,maybe_value_did_exist%3#0 self.asset_a.unit_name amm/contract.py:274 - assert // asset exists // maybe_value%2#0 self.asset_a.unit_name amm/contract.py:274 - byte "DPT-" // maybe_value%2#0,"DPT-" b"DPT-" amm/contract.py:274 - swap // load maybe_value%2#0 from l-stack (no copy) "DPT-",maybe_value%2#0 b"DPT-" + self.asset_a.unit_name amm/contract.py:274 - concat // {concat} b"DPT-" + self.asset_a.unit_name amm/contract.py:274 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 b"DPT-" + self.asset_a.unit_name amm/contract.py:274 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 b"DPT-" + self.asset_a.unit_name + b"-" amm/contract.py:274 - byte "-" // tmp%6#0,"-" b"-" amm/contract.py:274 - concat // {concat} b"DPT-" + self.asset_a.unit_name + b"-" amm/contract.py:274 - // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 b"DPT-" + self.asset_a.unit_name + b"-" amm/contract.py:274 - int 0 // tmp%7#0,0 self.asset_b amm/contract.py:274 - byte "asset_b" // tmp%7#0,0,"asset_b" self.asset_b amm/contract.py:274 - app_global_get_ex // tmp%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:274 - // virtual: store app_global_get_ex_did_exist%11#0 to l-stack (no copy) tmp%7#0,app_global_get_ex_did_exist%11#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:274 - // virtual: store app_global_get_ex_value%10#0 to l-stack (no copy) tmp%7#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.asset_b amm/contract.py:274 - // virtual: load app_global_get_ex_did_exist%11#0 from l-stack (no copy) tmp%7#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.asset_b amm/contract.py:274 - assert // check asset_b exists // tmp%7#0,app_global_get_ex_value%10#0 self.asset_b amm/contract.py:274 - // virtual: load app_global_get_ex_value%10#0 from l-stack (no copy) tmp%7#0,app_global_get_ex_value%10#0 self.asset_b.unit_name amm/contract.py:274 - asset_params_get AssetUnitName // tmp%7#0,{asset_params_get}.0,{asset_params_get}.1 self.asset_b.unit_name amm/contract.py:274 - // virtual: store maybe_value_did_exist%9#0 to l-stack (no copy) tmp%7#0,maybe_value_did_exist%9#0,{asset_params_get}.0 self.asset_b.unit_name amm/contract.py:274 - // virtual: store maybe_value%8#0 to l-stack (no copy) tmp%7#0,maybe_value%8#0,maybe_value_did_exist%9#0 self.asset_b.unit_name amm/contract.py:274 - // virtual: load maybe_value_did_exist%9#0 from l-stack (no copy) tmp%7#0,maybe_value%8#0,maybe_value_did_exist%9#0 self.asset_b.unit_name amm/contract.py:274 - assert // asset exists // tmp%7#0,maybe_value%8#0 self.asset_b.unit_name amm/contract.py:274 - // virtual: load tmp%7#0 from l-stack (no copy) maybe_value%8#0,tmp%7#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 - // virtual: load maybe_value%8#0 from l-stack (no copy) tmp%7#0,maybe_value%8#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 - concat // {concat} b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 - // virtual: store inner_txn_params%1%%param_ConfigAssetName_idx_0#0 to l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 - global CurrentApplicationAddress // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,{global} Global.current_application_address amm/contract.py:278 - // virtual: store inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 to l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 Global.current_application_address amm/contract.py:278 - global CurrentApplicationAddress // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,{global} Global.current_application_address amm/contract.py:279 - // virtual: store inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 to l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 Global.current_application_address amm/contract.py:279 - byte "dbt" // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0,"dbt" b"dbt" amm/contract.py:275 - itxn_field ConfigAssetUnitName // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 - int acfg // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0,acfg itxn.AssetConfig amm/contract.py:273 - itxn_field TypeEnum // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 - int 10000000000 // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0,10000000000 TOTAL_SUPPLY amm/contract.py:276 - itxn_field ConfigAssetTotal // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 + itxn_begin // itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 + int 0 // 0 self.asset_a amm/contract.py:274 + byte "asset_a" // 0,"asset_a" self.asset_a amm/contract.py:274 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:274 + // virtual: store asset_a_exists%5#0 to l-stack (no copy) asset_a_exists%5#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:274 + // virtual: store asset_a_value%4#0 to l-stack (no copy) asset_a_value%4#0,asset_a_exists%5#0 self.asset_a amm/contract.py:274 + // virtual: load asset_a_exists%5#0 from l-stack (no copy) asset_a_value%4#0,asset_a_exists%5#0 self.asset_a amm/contract.py:274 + assert // check asset_a exists // asset_a_value%4#0 self.asset_a amm/contract.py:274 + // virtual: load asset_a_value%4#0 from l-stack (no copy) asset_a_value%4#0 self.asset_a.unit_name amm/contract.py:274 + asset_params_get AssetUnitName // {asset_params_get}.0,{asset_params_get}.1 self.asset_a.unit_name amm/contract.py:274 + // virtual: store maybe_value_did_exist%3#0 to l-stack (no copy) maybe_value_did_exist%3#0,{asset_params_get}.0 self.asset_a.unit_name amm/contract.py:274 + // virtual: store maybe_value%2#0 to l-stack (no copy) maybe_value%2#0,maybe_value_did_exist%3#0 self.asset_a.unit_name amm/contract.py:274 + // virtual: load maybe_value_did_exist%3#0 from l-stack (no copy) maybe_value%2#0,maybe_value_did_exist%3#0 self.asset_a.unit_name amm/contract.py:274 + assert // asset exists // maybe_value%2#0 self.asset_a.unit_name amm/contract.py:274 + byte "DPT-" // maybe_value%2#0,"DPT-" b"DPT-" amm/contract.py:274 + swap // load maybe_value%2#0 from l-stack (no copy) "DPT-",maybe_value%2#0 b"DPT-" + self.asset_a.unit_name amm/contract.py:274 + concat // {concat} b"DPT-" + self.asset_a.unit_name amm/contract.py:274 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 b"DPT-" + self.asset_a.unit_name amm/contract.py:274 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 b"DPT-" + self.asset_a.unit_name + b"-" amm/contract.py:274 + byte "-" // tmp%6#0,"-" b"-" amm/contract.py:274 + concat // {concat} b"DPT-" + self.asset_a.unit_name + b"-" amm/contract.py:274 + // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 b"DPT-" + self.asset_a.unit_name + b"-" amm/contract.py:274 + int 0 // tmp%7#0,0 self.asset_b amm/contract.py:274 + byte "asset_b" // tmp%7#0,0,"asset_b" self.asset_b amm/contract.py:274 + app_global_get_ex // tmp%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:274 + // virtual: store asset_b_exists%11#0 to l-stack (no copy) tmp%7#0,asset_b_exists%11#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:274 + // virtual: store asset_b_value%10#0 to l-stack (no copy) tmp%7#0,asset_b_value%10#0,asset_b_exists%11#0 self.asset_b amm/contract.py:274 + // virtual: load asset_b_exists%11#0 from l-stack (no copy) tmp%7#0,asset_b_value%10#0,asset_b_exists%11#0 self.asset_b amm/contract.py:274 + assert // check asset_b exists // tmp%7#0,asset_b_value%10#0 self.asset_b amm/contract.py:274 + // virtual: load asset_b_value%10#0 from l-stack (no copy) tmp%7#0,asset_b_value%10#0 self.asset_b.unit_name amm/contract.py:274 + asset_params_get AssetUnitName // tmp%7#0,{asset_params_get}.0,{asset_params_get}.1 self.asset_b.unit_name amm/contract.py:274 + // virtual: store maybe_value_did_exist%9#0 to l-stack (no copy) tmp%7#0,maybe_value_did_exist%9#0,{asset_params_get}.0 self.asset_b.unit_name amm/contract.py:274 + // virtual: store maybe_value%8#0 to l-stack (no copy) tmp%7#0,maybe_value%8#0,maybe_value_did_exist%9#0 self.asset_b.unit_name amm/contract.py:274 + // virtual: load maybe_value_did_exist%9#0 from l-stack (no copy) tmp%7#0,maybe_value%8#0,maybe_value_did_exist%9#0 self.asset_b.unit_name amm/contract.py:274 + assert // asset exists // tmp%7#0,maybe_value%8#0 self.asset_b.unit_name amm/contract.py:274 + // virtual: load tmp%7#0 from l-stack (no copy) maybe_value%8#0,tmp%7#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 + // virtual: load maybe_value%8#0 from l-stack (no copy) tmp%7#0,maybe_value%8#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 + concat // {concat} b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 + // virtual: store inner_txn_params%1%%param_ConfigAssetName_idx_0#0 to l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 + global CurrentApplicationAddress // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,{global} Global.current_application_address amm/contract.py:278 + // virtual: store inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 to l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 Global.current_application_address amm/contract.py:278 + global CurrentApplicationAddress // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,{global} Global.current_application_address amm/contract.py:279 + // virtual: store inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 to l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 Global.current_application_address amm/contract.py:279 + byte "dbt" // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0,"dbt" b"dbt" amm/contract.py:275 + itxn_field ConfigAssetUnitName // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 + int acfg // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0,acfg itxn.AssetConfig amm/contract.py:273 + itxn_field TypeEnum // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 + int 10000000000 // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0,10000000000 TOTAL_SUPPLY amm/contract.py:276 + itxn_field ConfigAssetTotal // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 // virtual: load inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 from l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0,inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 - itxn_field ConfigAssetReserve // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 + itxn_field ConfigAssetReserve // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 // virtual: load inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 from l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0,inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 - itxn_field ConfigAssetManager // inner_txn_params%1%%param_ConfigAssetName_idx_0#0 - int 0 // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,0 0 amm/contract.py:280 - itxn_field Fee // inner_txn_params%1%%param_ConfigAssetName_idx_0#0 - int 3 // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,3 3 amm/contract.py:277 - itxn_field ConfigAssetDecimals // inner_txn_params%1%%param_ConfigAssetName_idx_0#0 + itxn_field ConfigAssetManager // inner_txn_params%1%%param_ConfigAssetName_idx_0#0 + int 0 // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,0 0 amm/contract.py:280 + itxn_field Fee // inner_txn_params%1%%param_ConfigAssetName_idx_0#0 + int 3 // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,3 3 amm/contract.py:277 + itxn_field ConfigAssetDecimals // inner_txn_params%1%%param_ConfigAssetName_idx_0#0 // virtual: load inner_txn_params%1%%param_ConfigAssetName_idx_0#0 from l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0 itxn_field ConfigAssetName // - itxn_submit // itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 - itxn CreatedAssetID // {itxn} itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 - // virtual: store submit_result_0%0%%CreatedAssetID#0 to l-stack (no copy) submit_result_0%0%%CreatedAssetID#0 itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 - // virtual: load submit_result_0%0%%CreatedAssetID#0 from l-stack (no copy) submit_result_0%0%%CreatedAssetID#0 return (\nitxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.un... amm/contract.py:272-284 - retsub // submit_result_0%0%%CreatedAssetID#0 return (\nitxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.un... amm/contract.py:272-284 + itxn_submit // itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 + itxn CreatedAssetID // {itxn} itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 + // virtual: store submit_result_0%0%%CreatedAssetID#0 to l-stack (no copy) submit_result_0%0%%CreatedAssetID#0 itxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name,\n... amm/contract.py:273-282 + // virtual: load submit_result_0%0%%CreatedAssetID#0 from l-stack (no copy) submit_result_0%0%%CreatedAssetID#0 return (\nitxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.un... amm/contract.py:272-284 + retsub // submit_result_0%0%%CreatedAssetID#0 return (\nitxn.AssetConfig(\nasset_name=b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.un... amm/contract.py:272-284 // examples.amm.contract.ConstantProductAMM._do_opt_in(asset: uint64) -> void: _do_opt_in: - proto 1 0 // (𝕡) asset#0 | @subroutine\ndef _do_opt_in(self, asset: Asset) -> None: amm/contract.py:286-287 + proto 1 0 // (𝕡) asset#0 | @subroutine\ndef _do_opt_in(self, asset: Asset) -> None: amm/contract.py:286-287 _do_opt_in_block@0: - global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address amm/contract.py:289 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 Global.current_application_address amm/contract.py:289 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0 do_asset_transfer(\nreceiver=Global.current_application_address,\nasset=asset,\namount=UInt64(0),\n) amm/contract.py:288-292 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | tmp%0#0,asset#0 do_asset_transfer(\nreceiver=Global.current_application_address,\nasset=asset,\namount=UInt64(0),\n) amm/contract.py:288-292 - int 0 // (𝕡) asset#0 | tmp%0#0,asset#0,0 0 amm/contract.py:291 - callsub do_asset_transfer // (𝕡) asset#0 | do_asset_transfer(\nreceiver=Global.current_application_address,\nasset=asset,\namount=UInt64(0),\n) amm/contract.py:288-292 + global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address amm/contract.py:289 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 Global.current_application_address amm/contract.py:289 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0 do_asset_transfer(\nreceiver=Global.current_application_address,\nasset=asset,\namount=UInt64(0),\n) amm/contract.py:288-292 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | tmp%0#0,asset#0 do_asset_transfer(\nreceiver=Global.current_application_address,\nasset=asset,\namount=UInt64(0),\n) amm/contract.py:288-292 + int 0 // (𝕡) asset#0 | tmp%0#0,asset#0,0 0 amm/contract.py:291 + callsub do_asset_transfer // (𝕡) asset#0 | do_asset_transfer(\nreceiver=Global.current_application_address,\nasset=asset,\namount=UInt64(0),\n) amm/contract.py:288-292 retsub // // examples.amm.contract.do_asset_transfer(receiver: bytes, asset: uint64, amount: uint64) -> void: do_asset_transfer: - proto 3 0 // (𝕡) receiver#0,asset#0,amount#0 | @subroutine\ndef do_asset_transfer(*, receiver: Account, asset: Asset, amount: UInt64) -> None: amm/contract.py:359-360 + proto 3 0 // (𝕡) receiver#0,asset#0,amount#0 | @subroutine\ndef do_asset_transfer(*, receiver: Account, asset: Asset, amount: UInt64) -> None: amm/contract.py:359-360 do_asset_transfer_block@0: - itxn_begin // (𝕡) receiver#0,asset#0,amount#0 | itxn.AssetTransfer(\nxfer_asset=asset,\nasset_amount=amount,\nasset_receiver=receiver,\nfee=0,\n)... amm/contract.py:361-366 - frame_dig -2 // load asset#0 from parameters (𝕡) receiver#0,asset#0,amount#0 | asset#0 - itxn_field XferAsset // (𝕡) receiver#0,asset#0,amount#0 | - int axfer // (𝕡) receiver#0,asset#0,amount#0 | axfer itxn.AssetTransfer amm/contract.py:361 - itxn_field TypeEnum // (𝕡) receiver#0,asset#0,amount#0 | - int 0 // (𝕡) receiver#0,asset#0,amount#0 | 0 0 amm/contract.py:365 - itxn_field Fee // (𝕡) receiver#0,asset#0,amount#0 | - frame_dig -3 // load receiver#0 from parameters (𝕡) receiver#0,asset#0,amount#0 | receiver#0 - itxn_field AssetReceiver // (𝕡) receiver#0,asset#0,amount#0 | - frame_dig -1 // load amount#0 from parameters (𝕡) receiver#0,asset#0,amount#0 | amount#0 - itxn_field AssetAmount // (𝕡) receiver#0,asset#0,amount#0 | - itxn_submit // (𝕡) receiver#0,asset#0,amount#0 | itxn.AssetTransfer(\nxfer_asset=asset,\nasset_amount=amount,\nasset_receiver=receiver,\nfee=0,\n)... amm/contract.py:361-366 + itxn_begin // (𝕡) receiver#0,asset#0,amount#0 | itxn.AssetTransfer(\nxfer_asset=asset,\nasset_amount=amount,\nasset_receiver=receiver,\nfee=0,\n)... amm/contract.py:361-366 + frame_dig -2 // load asset#0 from parameters (𝕡) receiver#0,asset#0,amount#0 | asset#0 + itxn_field XferAsset // (𝕡) receiver#0,asset#0,amount#0 | + int axfer // (𝕡) receiver#0,asset#0,amount#0 | axfer itxn.AssetTransfer amm/contract.py:361 + itxn_field TypeEnum // (𝕡) receiver#0,asset#0,amount#0 | + int 0 // (𝕡) receiver#0,asset#0,amount#0 | 0 0 amm/contract.py:365 + itxn_field Fee // (𝕡) receiver#0,asset#0,amount#0 | + frame_dig -3 // load receiver#0 from parameters (𝕡) receiver#0,asset#0,amount#0 | receiver#0 + itxn_field AssetReceiver // (𝕡) receiver#0,asset#0,amount#0 | + frame_dig -1 // load amount#0 from parameters (𝕡) receiver#0,asset#0,amount#0 | amount#0 + itxn_field AssetAmount // (𝕡) receiver#0,asset#0,amount#0 | + itxn_submit // (𝕡) receiver#0,asset#0,amount#0 | itxn.AssetTransfer(\nxfer_asset=asset,\nasset_amount=amount,\nasset_receiver=receiver,\nfee=0,\n)... amm/contract.py:361-366 retsub // // examples.amm.contract.ConstantProductAMM.mint(a_xfer: uint64, b_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: mint: - proto 5 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | @arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": ... amm/contract.py:83-97 + proto 5 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | @arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": ... amm/contract.py:83-97 mint_block@0: - callsub _check_bootstrapped // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._check_bootstrapped() amm/contract.py:113 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 - byte "pool_token" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"pool_token" \nassert pool_asset == self.pool_token amm/contract.py:115-116 - app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 \nassert pool_asset == self.pool_token amm/contract.py:115-116 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 - assert // check pool_token exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 - frame_dig -3 // load pool_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,pool_asset#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 - swap // load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_asset#0,app_global_get_ex_value%0#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 # well-formed mint\nassert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:115-116 - assert // asset pool incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # well-formed mint\nassert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:115-116 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_a amm/contract.py:117 - byte "asset_a" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:117 - app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:117 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:117 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:117 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:117 - assert // check asset_a exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0 self.asset_a amm/contract.py:117 - frame_dig -2 // load a_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 - swap // load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_asset#0,app_global_get_ex_value%3#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 - assert // asset a incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_b amm/contract.py:118 - byte "asset_b" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:118 - app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:118 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:118 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:118 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:118 - assert // check asset_b exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0 self.asset_b amm/contract.py:118 - frame_dig -1 // load b_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 - swap // load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_asset#0,app_global_get_ex_value%6#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 - assert // asset b incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 - frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.sender amm/contract.py:119 - gtxns Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.sender amm/contract.py:119 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0 a_xfer.sender amm/contract.py:119 - txn Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,{txn} Txn.sender amm/contract.py:119 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 Txn.sender amm/contract.py:119 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%10#0,tmp%9#0 a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 assert a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 - assert // sender invalid // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 - frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_xfer#0 b_xfer.sender amm/contract.py:120 - gtxns Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} b_xfer.sender amm/contract.py:120 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 b_xfer.sender amm/contract.py:120 - txn Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{txn} Txn.sender amm/contract.py:120 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 Txn.sender amm/contract.py:120 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%13#0,tmp%12#0 b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%14#0 b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%14#0 assert b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 - assert // sender invalid // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 - frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.asset_receiver amm/contract.py:124 - gtxns AssetReceiver // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.asset_receiver amm/contract.py:124 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0 a_xfer.asset_receiver amm/contract.py:124 - global CurrentApplicationAddress // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0,{global} Global.current_application_address amm/contract.py:124 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0,tmp%16#0 Global.current_application_address amm/contract.py:124 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%16#0,tmp%15#0 a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0,tmp%16#0 a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%17#0 a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%17#0 # valid asset a xfer\nassert (\na_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:122-125 - assert // receiver not app address // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # valid asset a xfer\nassert (\na_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:122-125 - frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.xfer_asset amm/contract.py:126 - gtxns XferAsset // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.xfer_asset amm/contract.py:126 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0 a_xfer.xfer_asset amm/contract.py:126 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,0 self.asset_a amm/contract.py:126 - byte "asset_a" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,0,"asset_a" self.asset_a amm/contract.py:126 - app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:126 - // virtual: store app_global_get_ex_did_exist%20#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_did_exist%20#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:126 - // virtual: store app_global_get_ex_value%19#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0,app_global_get_ex_did_exist%20#0 self.asset_a amm/contract.py:126 - // virtual: load app_global_get_ex_did_exist%20#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0,app_global_get_ex_did_exist%20#0 self.asset_a amm/contract.py:126 - assert // check asset_a exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0 self.asset_a amm/contract.py:126 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%19#0,tmp%18#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 - // virtual: load app_global_get_ex_value%19#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,app_global_get_ex_value%19#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%21#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%21#0 assert a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 - assert // asset a incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 - frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.asset_amount amm/contract.py:127 - gtxns AssetAmount // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.asset_amount amm/contract.py:127 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 a_xfer.asset_amount amm/contract.py:127 - dup // load tmp%22#0 from l-stack (copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%22#0 a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%22#0,0 0 amm/contract.py:127 - > // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{>} a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%23#0 a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%23#0 assert a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 - assert // amount minimum not met // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 assert a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 - frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,b_xfer#0 b_xfer.asset_receiver amm/contract.py:131 - gtxns AssetReceiver // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{gtxns} b_xfer.asset_receiver amm/contract.py:131 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0 b_xfer.asset_receiver amm/contract.py:131 - global CurrentApplicationAddress // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0,{global} Global.current_application_address amm/contract.py:131 - // virtual: store tmp%25#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0,tmp%25#0 Global.current_application_address amm/contract.py:131 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%25#0,tmp%24#0 b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 - // virtual: load tmp%25#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0,tmp%25#0 b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{==} b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 - // virtual: store tmp%26#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%26#0 b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 - // virtual: load tmp%26#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%26#0 # valid asset b xfer\nassert (\nb_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:129-132 - assert // receiver not app address // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 # valid asset b xfer\nassert (\nb_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:129-132 - frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,b_xfer#0 b_xfer.xfer_asset amm/contract.py:133 - gtxns XferAsset // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{gtxns} b_xfer.xfer_asset amm/contract.py:133 - // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0 b_xfer.xfer_asset amm/contract.py:133 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,0 self.asset_b amm/contract.py:133 - byte "asset_b" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,0,"asset_b" self.asset_b amm/contract.py:133 - app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:133 - // virtual: store app_global_get_ex_did_exist%29#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_did_exist%29#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:133 - // virtual: store app_global_get_ex_value%28#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.asset_b amm/contract.py:133 - // virtual: load app_global_get_ex_did_exist%29#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.asset_b amm/contract.py:133 - assert // check asset_b exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0 self.asset_b amm/contract.py:133 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,app_global_get_ex_value%28#0,tmp%27#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 - // virtual: load app_global_get_ex_value%28#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,app_global_get_ex_value%28#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 - == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{==} b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 - // virtual: store tmp%30#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%30#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 - // virtual: load tmp%30#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%30#0 assert b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 - assert // asset b incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 assert b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 - frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,b_xfer#0 b_xfer.asset_amount amm/contract.py:134 - gtxns AssetAmount // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{gtxns} b_xfer.asset_amount amm/contract.py:134 - // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0 b_xfer.asset_amount amm/contract.py:134 - dup // load tmp%31#0 from l-stack (copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%31#0 b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%31#0,0 0 amm/contract.py:134 - > // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,{>} b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 - // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%32#0 b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 - // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%32#0 assert b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 - assert // amount minimum not met // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0 assert b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 - callsub _current_pool_balance // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,{_current_pool_balance} self._current_pool_balance() amm/contract.py:137 - // virtual: store tmp%33#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0 self._current_pool_balance() amm/contract.py:137 - callsub _current_a_balance // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,{_current_a_balance} self._current_a_balance() amm/contract.py:138 - // virtual: store tmp%34#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0 self._current_a_balance() amm/contract.py:138 - callsub _current_b_balance // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0,{_current_b_balance} self._current_b_balance() amm/contract.py:139 - // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0,tmp%35#0 self._current_b_balance() amm/contract.py:139 - uncover 2 // load tmp%33#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%34#0,tmp%35#0,tmp%33#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 - uncover 2 // load tmp%34#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%35#0,tmp%33#0,tmp%34#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 - uncover 2 // load tmp%35#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0,tmp%35#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 - uncover 4 // load tmp%22#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%31#0,tmp%33#0,tmp%34#0,tmp%35#0,tmp%22#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 - uncover 4 // load tmp%31#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%33#0,tmp%34#0,tmp%35#0,tmp%22#0,tmp%31#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 - callsub tokens_to_mint // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {tokens_to_mint} tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_balance(),... amm/contract.py:136-142 - // virtual: store to_mint#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 - dup // load to_mint#0 from l-stack (copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,to_mint#0 to_mint > 0, "send amount too low" amm/contract.py:143 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,to_mint#0,0 0 amm/contract.py:143 - > // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,{>} to_mint > 0, "send amount too low" amm/contract.py:143 - // virtual: store tmp%38#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%38#0 to_mint > 0, "send amount too low" amm/contract.py:143 - // virtual: load tmp%38#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%38#0 assert to_mint > 0, "send amount too low" amm/contract.py:143 - assert // send amount too low // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0 assert to_mint > 0, "send amount too low" amm/contract.py:143 - txn Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,{txn} \ndo_asset_transfer(receiver=Txn.sender amm/contract.py:145-146 - // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0 \ndo_asset_transfer(receiver=Txn.sender amm/contract.py:145-146 - int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - byte "pool_token" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,0,"pool_token" \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - // virtual: store app_global_get_ex_did_exist%41#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_did_exist%41#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - // virtual: store app_global_get_ex_value%40#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0,app_global_get_ex_did_exist%41#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - // virtual: load app_global_get_ex_did_exist%41#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0,app_global_get_ex_did_exist%41#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - assert // check pool_token exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 - // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,app_global_get_ex_value%40#0,tmp%39#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 - // virtual: load app_global_get_ex_value%40#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,app_global_get_ex_value%40#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 - uncover 2 // load to_mint#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%39#0,app_global_get_ex_value%40#0,to_mint#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 - callsub do_asset_transfer // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 - callsub _update_ratio // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._update_ratio() amm/contract.py:147 + callsub _check_bootstrapped // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._check_bootstrapped() amm/contract.py:113 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 + byte "pool_token" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"pool_token" \nassert pool_asset == self.pool_token amm/contract.py:115-116 + app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 \nassert pool_asset == self.pool_token amm/contract.py:115-116 + // virtual: store pool_token_exists%1#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_exists%1#0,{app_global_get_ex}.0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 + // virtual: store pool_token_value%0#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_token_exists%1#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 + // virtual: load pool_token_exists%1#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_token_exists%1#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 + assert // check pool_token exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0 \nassert pool_asset == self.pool_token amm/contract.py:115-116 + frame_dig -3 // load pool_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_asset#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 + swap // load pool_token_value%0#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_asset#0,pool_token_value%0#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 formed mint\nassert pool_asset == self.pool_token amm/contract.py:115-116 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 # well-formed mint\nassert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:115-116 + assert // asset pool incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # well-formed mint\nassert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:115-116 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_a amm/contract.py:117 + byte "asset_a" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:117 + app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:117 + // virtual: store asset_a_exists%4#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_exists%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:117 + // virtual: store asset_a_value%3#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:117 + // virtual: load asset_a_exists%4#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:117 + assert // check asset_a exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0 self.asset_a amm/contract.py:117 + frame_dig -2 // load a_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 + swap // load asset_a_value%3#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_asset#0,asset_a_value%3#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 + assert // asset a incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:117 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_b amm/contract.py:118 + byte "asset_b" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:118 + app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:118 + // virtual: store asset_b_exists%7#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_exists%7#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:118 + // virtual: store asset_b_value%6#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0,asset_b_exists%7#0 self.asset_b amm/contract.py:118 + // virtual: load asset_b_exists%7#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0,asset_b_exists%7#0 self.asset_b amm/contract.py:118 + assert // check asset_b exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0 self.asset_b amm/contract.py:118 + frame_dig -1 // load b_asset#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 + swap // load asset_b_value%6#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_asset#0,asset_b_value%6#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 + assert // asset b incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:118 + frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.sender amm/contract.py:119 + gtxns Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.sender amm/contract.py:119 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0 a_xfer.sender amm/contract.py:119 + txn Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,{txn} Txn.sender amm/contract.py:119 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 Txn.sender amm/contract.py:119 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%10#0,tmp%9#0 a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 assert a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 + assert // sender invalid // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:119 + frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_xfer#0 b_xfer.sender amm/contract.py:120 + gtxns Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} b_xfer.sender amm/contract.py:120 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 b_xfer.sender amm/contract.py:120 + txn Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{txn} Txn.sender amm/contract.py:120 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 Txn.sender amm/contract.py:120 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%13#0,tmp%12#0 b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%14#0 b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%14#0 assert b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 + assert // sender invalid // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert b_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:120 + frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.asset_receiver amm/contract.py:124 + gtxns AssetReceiver // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.asset_receiver amm/contract.py:124 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0 a_xfer.asset_receiver amm/contract.py:124 + global CurrentApplicationAddress // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0,{global} Global.current_application_address amm/contract.py:124 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0,tmp%16#0 Global.current_application_address amm/contract.py:124 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%16#0,tmp%15#0 a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%15#0,tmp%16#0 a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%17#0 a_xfer.asset_receiver == Global.current_application_address amm/contract.py:124 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%17#0 # valid asset a xfer\nassert (\na_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:122-125 + assert // receiver not app address // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # valid asset a xfer\nassert (\na_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:122-125 + frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.xfer_asset amm/contract.py:126 + gtxns XferAsset // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.xfer_asset amm/contract.py:126 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0 a_xfer.xfer_asset amm/contract.py:126 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,0 self.asset_a amm/contract.py:126 + byte "asset_a" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,0,"asset_a" self.asset_a amm/contract.py:126 + app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:126 + // virtual: store asset_a_exists%20#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,asset_a_exists%20#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:126 + // virtual: store asset_a_value%19#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,asset_a_value%19#0,asset_a_exists%20#0 self.asset_a amm/contract.py:126 + // virtual: load asset_a_exists%20#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,asset_a_value%19#0,asset_a_exists%20#0 self.asset_a amm/contract.py:126 + assert // check asset_a exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,asset_a_value%19#0 self.asset_a amm/contract.py:126 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%19#0,tmp%18#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 + // virtual: load asset_a_value%19#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%18#0,asset_a_value%19#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%21#0 a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%21#0 assert a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 + assert // asset a incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_xfer.xfer_asset == self.asset_a, "asset a incorrect" amm/contract.py:126 + frame_dig -5 // load a_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_xfer#0 a_xfer.asset_amount amm/contract.py:127 + gtxns AssetAmount // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} a_xfer.asset_amount amm/contract.py:127 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 a_xfer.asset_amount amm/contract.py:127 + dup // load tmp%22#0 from l-stack (copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%22#0 a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%22#0,0 0 amm/contract.py:127 + > // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{>} a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%23#0 a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%23#0 assert a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 + assert // amount minimum not met // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 assert a_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:127 + frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,b_xfer#0 b_xfer.asset_receiver amm/contract.py:131 + gtxns AssetReceiver // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{gtxns} b_xfer.asset_receiver amm/contract.py:131 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0 b_xfer.asset_receiver amm/contract.py:131 + global CurrentApplicationAddress // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0,{global} Global.current_application_address amm/contract.py:131 + // virtual: store tmp%25#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0,tmp%25#0 Global.current_application_address amm/contract.py:131 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%25#0,tmp%24#0 b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 + // virtual: load tmp%25#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%24#0,tmp%25#0 b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{==} b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 + // virtual: store tmp%26#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%26#0 b_xfer.asset_receiver == Global.current_application_address amm/contract.py:131 + // virtual: load tmp%26#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%26#0 # valid asset b xfer\nassert (\nb_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:129-132 + assert // receiver not app address // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 # valid asset b xfer\nassert (\nb_xfer.asset_receiver == Global.current_application_address\n), "... amm/contract.py:129-132 + frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,b_xfer#0 b_xfer.xfer_asset amm/contract.py:133 + gtxns XferAsset // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{gtxns} b_xfer.xfer_asset amm/contract.py:133 + // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0 b_xfer.xfer_asset amm/contract.py:133 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,0 self.asset_b amm/contract.py:133 + byte "asset_b" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,0,"asset_b" self.asset_b amm/contract.py:133 + app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:133 + // virtual: store asset_b_exists%29#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,asset_b_exists%29#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:133 + // virtual: store asset_b_value%28#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,asset_b_value%28#0,asset_b_exists%29#0 self.asset_b amm/contract.py:133 + // virtual: load asset_b_exists%29#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,asset_b_value%28#0,asset_b_exists%29#0 self.asset_b amm/contract.py:133 + assert // check asset_b exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,asset_b_value%28#0 self.asset_b amm/contract.py:133 + // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,asset_b_value%28#0,tmp%27#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 + // virtual: load asset_b_value%28#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%27#0,asset_b_value%28#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 + == // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{==} b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 + // virtual: store tmp%30#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%30#0 b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 + // virtual: load tmp%30#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%30#0 assert b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 + assert // asset b incorrect // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0 assert b_xfer.xfer_asset == self.asset_b, "asset b incorrect" amm/contract.py:133 + frame_dig -4 // load b_xfer#0 from parameters (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,b_xfer#0 b_xfer.asset_amount amm/contract.py:134 + gtxns AssetAmount // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,{gtxns} b_xfer.asset_amount amm/contract.py:134 + // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0 b_xfer.asset_amount amm/contract.py:134 + dup // load tmp%31#0 from l-stack (copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%31#0 b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%31#0,0 0 amm/contract.py:134 + > // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,{>} b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 + // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%32#0 b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 + // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%32#0 assert b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 + assert // amount minimum not met // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0 assert b_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:134 + callsub _current_pool_balance // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,{_current_pool_balance} self._current_pool_balance() amm/contract.py:137 + // virtual: store tmp%33#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0 self._current_pool_balance() amm/contract.py:137 + callsub _current_a_balance // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,{_current_a_balance} self._current_a_balance() amm/contract.py:138 + // virtual: store tmp%34#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0 self._current_a_balance() amm/contract.py:138 + callsub _current_b_balance // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0,{_current_b_balance} self._current_b_balance() amm/contract.py:139 + // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0,tmp%35#0 self._current_b_balance() amm/contract.py:139 + uncover 2 // load tmp%33#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%34#0,tmp%35#0,tmp%33#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 + uncover 2 // load tmp%34#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%35#0,tmp%33#0,tmp%34#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 + uncover 2 // load tmp%35#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%22#0,tmp%31#0,tmp%33#0,tmp%34#0,tmp%35#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 + uncover 4 // load tmp%22#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%31#0,tmp%33#0,tmp%34#0,tmp%35#0,tmp%22#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 + uncover 4 // load tmp%31#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%33#0,tmp%34#0,tmp%35#0,tmp%22#0,tmp%31#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 + callsub tokens_to_mint // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {tokens_to_mint} tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_balance(),... amm/contract.py:136-142 + // virtual: store to_mint#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0 to_mint = tokens_to_mint(\npool_balance=self._current_pool_balance(),\na_balance=self._current_a_... amm/contract.py:136-142 + dup // load to_mint#0 from l-stack (copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,to_mint#0 to_mint > 0, "send amount too low" amm/contract.py:143 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,to_mint#0,0 0 amm/contract.py:143 + > // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,{>} to_mint > 0, "send amount too low" amm/contract.py:143 + // virtual: store tmp%38#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%38#0 to_mint > 0, "send amount too low" amm/contract.py:143 + // virtual: load tmp%38#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%38#0 assert to_mint > 0, "send amount too low" amm/contract.py:143 + assert // send amount too low // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0 assert to_mint > 0, "send amount too low" amm/contract.py:143 + txn Sender // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,{txn} \ndo_asset_transfer(receiver=Txn.sender amm/contract.py:145-146 + // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0 \ndo_asset_transfer(receiver=Txn.sender amm/contract.py:145-146 + int 0 // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + byte "pool_token" // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,0,"pool_token" \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + app_global_get_ex // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + // virtual: store pool_token_exists%41#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,pool_token_exists%41#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + // virtual: store pool_token_value%40#0 to l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,pool_token_value%40#0,pool_token_exists%41#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + // virtual: load pool_token_exists%41#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,pool_token_value%40#0,pool_token_exists%41#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + assert // check pool_token exists // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,pool_token_value%40#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token amm/contract.py:145-146 + // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,pool_token_value%40#0,tmp%39#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 + // virtual: load pool_token_value%40#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | to_mint#0,tmp%39#0,pool_token_value%40#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 + uncover 2 // load to_mint#0 from l-stack (no copy) (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%39#0,pool_token_value%40#0,to_mint#0 # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 + callsub do_asset_transfer // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # mint tokens\ndo_asset_transfer(receiver=Txn.sender, asset=self.pool_token, amount=to_mint) amm/contract.py:145-146 + callsub _update_ratio // (𝕡) a_xfer#0,b_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._update_ratio() amm/contract.py:147 retsub // // examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: _check_bootstrapped: - proto 0 0 // @subroutine\ndef _check_bootstrapped(self) -> None: amm/contract.py:253-254 + proto 0 0 // @subroutine\ndef _check_bootstrapped(self) -> None: amm/contract.py:253-254 _check_bootstrapped_block@0: - int 0 // 0 self.pool_token amm/contract.py:255 - byte "pool_token" // 0,"pool_token" self.pool_token amm/contract.py:255 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:255 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:255 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:255 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:255 - assert // check pool_token exists // app_global_get_ex_value%0#0 self.pool_token amm/contract.py:255 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) app_global_get_ex_value%0#0 assert self.pool_token, "bootstrap method needs to be called first" amm/contract.py:255 - assert // bootstrap method needs to be called first // assert self.pool_token, "bootstrap method needs to be called first" amm/contract.py:255 + int 0 // 0 self.pool_token amm/contract.py:255 + byte "pool_token" // 0,"pool_token" self.pool_token amm/contract.py:255 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:255 + // virtual: store pool_token_exists%1#0 to l-stack (no copy) pool_token_exists%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:255 + // virtual: store pool_token_value%0#0 to l-stack (no copy) pool_token_value%0#0,pool_token_exists%1#0 self.pool_token amm/contract.py:255 + // virtual: load pool_token_exists%1#0 from l-stack (no copy) pool_token_value%0#0,pool_token_exists%1#0 self.pool_token amm/contract.py:255 + assert // check pool_token exists // pool_token_value%0#0 self.pool_token amm/contract.py:255 + // virtual: load pool_token_value%0#0 from l-stack (no copy) pool_token_value%0#0 assert self.pool_token, "bootstrap method needs to be called first" amm/contract.py:255 + assert // bootstrap method needs to be called first // assert self.pool_token, "bootstrap method needs to be called first" amm/contract.py:255 retsub // // examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: _current_pool_balance: - proto 0 1 // @subroutine\ndef _current_pool_balance(self) -> UInt64: amm/contract.py:294-295 + proto 0 1 // @subroutine\ndef _current_pool_balance(self) -> UInt64: amm/contract.py:294-295 _current_pool_balance_block@0: - global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:296 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:296 - int 0 // tmp%2#0,0 self.pool_token amm/contract.py:296 - byte "pool_token" // tmp%2#0,0,"pool_token" self.pool_token amm/contract.py:296 - app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:296 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:296 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.pool_token amm/contract.py:296 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.pool_token amm/contract.py:296 - assert // check pool_token exists // tmp%2#0,app_global_get_ex_value%3#0 self.pool_token amm/contract.py:296 - // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%3#0,tmp%2#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - assert // account opted into asset // maybe_value%0#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - retsub // maybe_value%0#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:296 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:296 + int 0 // tmp%2#0,0 self.pool_token amm/contract.py:296 + byte "pool_token" // tmp%2#0,0,"pool_token" self.pool_token amm/contract.py:296 + app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:296 + // virtual: store pool_token_exists%4#0 to l-stack (no copy) tmp%2#0,pool_token_exists%4#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:296 + // virtual: store pool_token_value%3#0 to l-stack (no copy) tmp%2#0,pool_token_value%3#0,pool_token_exists%4#0 self.pool_token amm/contract.py:296 + // virtual: load pool_token_exists%4#0 from l-stack (no copy) tmp%2#0,pool_token_value%3#0,pool_token_exists%4#0 self.pool_token amm/contract.py:296 + assert // check pool_token exists // tmp%2#0,pool_token_value%3#0 self.pool_token amm/contract.py:296 + // virtual: load tmp%2#0 from l-stack (no copy) pool_token_value%3#0,tmp%2#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: load pool_token_value%3#0 from l-stack (no copy) tmp%2#0,pool_token_value%3#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + assert // account opted into asset // maybe_value%0#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + retsub // maybe_value%0#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 // examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: _current_a_balance: - proto 0 1 // @subroutine\ndef _current_a_balance(self) -> UInt64: amm/contract.py:298-299 + proto 0 1 // @subroutine\ndef _current_a_balance(self) -> UInt64: amm/contract.py:298-299 _current_a_balance_block@0: - global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:300 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:300 - int 0 // tmp%2#0,0 self.asset_a amm/contract.py:300 - byte "asset_a" // tmp%2#0,0,"asset_a" self.asset_a amm/contract.py:300 - app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:300 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:300 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:300 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:300 - assert // check asset_a exists // tmp%2#0,app_global_get_ex_value%3#0 self.asset_a amm/contract.py:300 - // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%3#0,tmp%2#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - assert // account opted into asset // maybe_value%0#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - retsub // maybe_value%0#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:300 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:300 + int 0 // tmp%2#0,0 self.asset_a amm/contract.py:300 + byte "asset_a" // tmp%2#0,0,"asset_a" self.asset_a amm/contract.py:300 + app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:300 + // virtual: store asset_a_exists%4#0 to l-stack (no copy) tmp%2#0,asset_a_exists%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:300 + // virtual: store asset_a_value%3#0 to l-stack (no copy) tmp%2#0,asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:300 + // virtual: load asset_a_exists%4#0 from l-stack (no copy) tmp%2#0,asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:300 + assert // check asset_a exists // tmp%2#0,asset_a_value%3#0 self.asset_a amm/contract.py:300 + // virtual: load tmp%2#0 from l-stack (no copy) asset_a_value%3#0,tmp%2#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: load asset_a_value%3#0 from l-stack (no copy) tmp%2#0,asset_a_value%3#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + assert // account opted into asset // maybe_value%0#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + retsub // maybe_value%0#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 // examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: _current_b_balance: - proto 0 1 // @subroutine\ndef _current_b_balance(self) -> UInt64: amm/contract.py:302-303 + proto 0 1 // @subroutine\ndef _current_b_balance(self) -> UInt64: amm/contract.py:302-303 _current_b_balance_block@0: - global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:304 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:304 - int 0 // tmp%2#0,0 self.asset_b amm/contract.py:304 - byte "asset_b" // tmp%2#0,0,"asset_b" self.asset_b amm/contract.py:304 - app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:304 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:304 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:304 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:304 - assert // check asset_b exists // tmp%2#0,app_global_get_ex_value%3#0 self.asset_b amm/contract.py:304 - // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%3#0,tmp%2#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%3#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - assert // account opted into asset // maybe_value%0#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - retsub // maybe_value%0#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:304 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:304 + int 0 // tmp%2#0,0 self.asset_b amm/contract.py:304 + byte "asset_b" // tmp%2#0,0,"asset_b" self.asset_b amm/contract.py:304 + app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:304 + // virtual: store asset_b_exists%4#0 to l-stack (no copy) tmp%2#0,asset_b_exists%4#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:304 + // virtual: store asset_b_value%3#0 to l-stack (no copy) tmp%2#0,asset_b_value%3#0,asset_b_exists%4#0 self.asset_b amm/contract.py:304 + // virtual: load asset_b_exists%4#0 from l-stack (no copy) tmp%2#0,asset_b_value%3#0,asset_b_exists%4#0 self.asset_b amm/contract.py:304 + assert // check asset_b exists // tmp%2#0,asset_b_value%3#0 self.asset_b amm/contract.py:304 + // virtual: load tmp%2#0 from l-stack (no copy) asset_b_value%3#0,tmp%2#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: load asset_b_value%3#0 from l-stack (no copy) tmp%2#0,asset_b_value%3#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + assert // account opted into asset // maybe_value%0#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + retsub // maybe_value%0#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 // examples.amm.contract.tokens_to_mint(pool_balance: uint64, a_balance: uint64, b_balance: uint64, a_amount: uint64, b_amount: uint64) -> uint64: tokens_to_mint: - proto 5 1 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | @subroutine\ndef tokens_to_mint(\n*,\npool_balance: UInt64,\na_balance: UInt64,\nb_balance: UInt6... amm/contract.py:325-333 + proto 5 1 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | @subroutine\ndef tokens_to_mint(\n*,\npool_balance: UInt64,\na_balance: UInt64,\nb_balance: UInt6... amm/contract.py:325-333 byte "" - dup // allocate 2 to stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | + dup // allocate 2 to stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tokens_to_mint_block@0: - frame_dig -4 // load a_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance#0,a_amount#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - == // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {==} a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%0#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%0#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - bz tokens_to_mint_bool_false@3 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - // Implicit fall through to tokens_to_mint_and_contd@1 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + frame_dig -4 // load a_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance#0,a_amount#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + == // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {==} a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%0#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%0#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + bz tokens_to_mint_bool_false@3 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + // Implicit fall through to tokens_to_mint_and_contd@1 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 tokens_to_mint_and_contd@1: - frame_dig -3 // load b_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | b_balance#0 b_balance == b_amount amm/contract.py:334 - frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | b_balance#0,b_amount#0 b_balance == b_amount amm/contract.py:334 - == // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {==} b_balance == b_amount amm/contract.py:334 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%1#0 b_balance == b_amount amm/contract.py:334 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%1#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - bz tokens_to_mint_bool_false@3 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 - // Implicit fall through to tokens_to_mint_bool_true@2 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + frame_dig -3 // load b_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | b_balance#0 b_balance == b_amount amm/contract.py:334 + frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | b_balance#0,b_amount#0 b_balance == b_amount amm/contract.py:334 + == // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {==} b_balance == b_amount amm/contract.py:334 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%1#0 b_balance == b_amount amm/contract.py:334 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%1#0 a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + bz tokens_to_mint_bool_false@3 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 + // Implicit fall through to tokens_to_mint_bool_true@2 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_balance == a_amount and b_balance == b_amount amm/contract.py:334 tokens_to_mint_bool_true@2: - int 1 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 1 + int 1 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 1 // virtual: store and_result%2#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | and_result%2#0 // virtual: load and_result%2#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | and_result%2#0 // virtual: store is_initial_mint#0 to x-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) is_initial_mint#0 | - b tokens_to_mint_bool_merge@4 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) is_initial_mint#0 | is_initial_mint#0 + b tokens_to_mint_bool_merge@4 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) is_initial_mint#0 | is_initial_mint#0 tokens_to_mint_bool_false@3: - int 0 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 0 + int 0 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 0 // virtual: store and_result%2#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | and_result%2#0 // virtual: load and_result%2#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | and_result%2#0 // virtual: store is_initial_mint#0 to x-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) is_initial_mint#0 | - // Implicit fall through to tokens_to_mint_bool_merge@4 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) is_initial_mint#0 | is_initial_mint#0 + // Implicit fall through to tokens_to_mint_bool_merge@4 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) is_initial_mint#0 | is_initial_mint#0 tokens_to_mint_bool_merge@4: - // virtual: load is_initial_mint#0 from x-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | is_initial_mint#0 is_initial_mint#0 if is_initial_mint: amm/contract.py:335 - bz tokens_to_mint_after_if_else@6 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | if is_initial_mint: amm/contract.py:335 - // Implicit fall through to tokens_to_mint_if_body@5 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | if is_initial_mint: amm/contract.py:335 + // virtual: load is_initial_mint#0 from x-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | is_initial_mint#0 is_initial_mint#0 if is_initial_mint: amm/contract.py:335 + bz tokens_to_mint_after_if_else@6 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | if is_initial_mint: amm/contract.py:335 + // Implicit fall through to tokens_to_mint_if_body@5 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | if is_initial_mint: amm/contract.py:335 tokens_to_mint_if_body@5: - frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_amount#0 a_amount * b_amount amm/contract.py:336 - frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_amount#0,b_amount#0 a_amount * b_amount amm/contract.py:336 - * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {*} a_amount * b_amount amm/contract.py:336 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%3#0 a_amount * b_amount amm/contract.py:336 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%3#0 op.sqrt(a_amount * b_amount) amm/contract.py:336 - sqrt // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {sqrt} op.sqrt(a_amount * b_amount) amm/contract.py:336 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%4#0 op.sqrt(a_amount * b_amount) amm/contract.py:336 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%4#0 op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 - int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%4#0,1000 SCALE amm/contract.py:336 - - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {-} op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%5#0 op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%5#0 return op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 + frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_amount#0 a_amount * b_amount amm/contract.py:336 + frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_amount#0,b_amount#0 a_amount * b_amount amm/contract.py:336 + * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {*} a_amount * b_amount amm/contract.py:336 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%3#0 a_amount * b_amount amm/contract.py:336 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%3#0 op.sqrt(a_amount * b_amount) amm/contract.py:336 + sqrt // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {sqrt} op.sqrt(a_amount * b_amount) amm/contract.py:336 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%4#0 op.sqrt(a_amount * b_amount) amm/contract.py:336 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%4#0 op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 + int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%4#0,1000 SCALE amm/contract.py:336 + - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {-} op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%5#0 op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%5#0 return op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 frame_bury 0 - retsub // tmp%5#0 return op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 + retsub // tmp%5#0 return op.sqrt(a_amount * b_amount) - SCALE amm/contract.py:336 tokens_to_mint_after_if_else@6: - int 10000000000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 10000000000 TOTAL_SUPPLY amm/contract.py:337 - frame_dig -5 // load pool_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 10000000000,pool_balance#0 issued = TOTAL_SUPPLY - pool_balance amm/contract.py:337 - - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {-} TOTAL_SUPPLY - pool_balance amm/contract.py:337 - // virtual: store issued#0 to x-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | issued = TOTAL_SUPPLY - pool_balance amm/contract.py:337 - int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | 1000 SCALE amm/contract.py:338 - frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | 1000,a_amount#0 SCALE * a_amount amm/contract.py:338 - * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | {*} SCALE * a_amount amm/contract.py:338 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0 SCALE * a_amount amm/contract.py:338 - frame_dig -4 // load a_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,a_balance#0 a_balance - a_amount amm/contract.py:338 - frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,a_balance#0,a_amount#0 a_balance - a_amount amm/contract.py:338 - - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,{-} a_balance - a_amount amm/contract.py:338 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,tmp%7#0 a_balance - a_amount amm/contract.py:338 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%7#0,tmp%6#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,tmp%7#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 - / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | {/} SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 - dup // store a_ratio#0 to l-stack (copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,a_ratio#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 - frame_bury 0 // store a_ratio#0 to f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 - int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,1000 SCALE amm/contract.py:339 - frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,1000,b_amount#0 SCALE * b_amount amm/contract.py:339 - * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,{*} SCALE * b_amount amm/contract.py:339 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0 SCALE * b_amount amm/contract.py:339 - frame_dig -3 // load b_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,b_balance#0 b_balance - b_amount amm/contract.py:339 - frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,b_balance#0,b_amount#0 b_balance - b_amount amm/contract.py:339 - - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,{-} b_balance - b_amount amm/contract.py:339 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,tmp%9#0 b_balance - b_amount amm/contract.py:339 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%9#0,tmp%8#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,tmp%9#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 - / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,{/} SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 - dup // store b_ratio#0 to l-stack (copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,b_ratio#0,b_ratio#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 - frame_bury 1 // store b_ratio#0 to f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,b_ratio#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 - // virtual: load a_ratio#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | b_ratio#0,a_ratio#0 a_ratio < b_ratio: amm/contract.py:340 - // virtual: load b_ratio#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,b_ratio#0 a_ratio < b_ratio: amm/contract.py:340 - < // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | {<} a_ratio < b_ratio: amm/contract.py:340 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%10#0 a_ratio < b_ratio: amm/contract.py:340 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%10#0 if a_ratio < b_ratio: amm/contract.py:340 - bz tokens_to_mint_else_body@8 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | if a_ratio < b_ratio: amm/contract.py:340 - // Implicit fall through to tokens_to_mint_if_body@7 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | issued#0 if a_ratio < b_ratio: amm/contract.py:340 + int 10000000000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 10000000000 TOTAL_SUPPLY amm/contract.py:337 + frame_dig -5 // load pool_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | 10000000000,pool_balance#0 issued = TOTAL_SUPPLY - pool_balance amm/contract.py:337 + - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {-} TOTAL_SUPPLY - pool_balance amm/contract.py:337 + // virtual: store issued#0 to x-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | issued = TOTAL_SUPPLY - pool_balance amm/contract.py:337 + int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | 1000 SCALE amm/contract.py:338 + frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | 1000,a_amount#0 SCALE * a_amount amm/contract.py:338 + * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | {*} SCALE * a_amount amm/contract.py:338 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0 SCALE * a_amount amm/contract.py:338 + frame_dig -4 // load a_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,a_balance#0 a_balance - a_amount amm/contract.py:338 + frame_dig -2 // load a_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,a_balance#0,a_amount#0 a_balance - a_amount amm/contract.py:338 + - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,{-} a_balance - a_amount amm/contract.py:338 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,tmp%7#0 a_balance - a_amount amm/contract.py:338 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%7#0,tmp%6#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%6#0,tmp%7#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 + / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | {/} SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 + dup // store a_ratio#0 to l-stack (copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,a_ratio#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 + frame_bury 0 // store a_ratio#0 to f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0 a_ratio = SCALE * a_amount // (a_balance - a_amount) amm/contract.py:338 + int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,1000 SCALE amm/contract.py:339 + frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,1000,b_amount#0 SCALE * b_amount amm/contract.py:339 + * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,{*} SCALE * b_amount amm/contract.py:339 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0 SCALE * b_amount amm/contract.py:339 + frame_dig -3 // load b_balance#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,b_balance#0 b_balance - b_amount amm/contract.py:339 + frame_dig -1 // load b_amount#0 from parameters (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,b_balance#0,b_amount#0 b_balance - b_amount amm/contract.py:339 + - // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,{-} b_balance - b_amount amm/contract.py:339 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,tmp%9#0 b_balance - b_amount amm/contract.py:339 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%9#0,tmp%8#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,tmp%8#0,tmp%9#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 + / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,{/} SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 + dup // store b_ratio#0 to l-stack (copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,b_ratio#0,b_ratio#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 + frame_bury 1 // store b_ratio#0 to f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,b_ratio#0 b_ratio = SCALE * b_amount // (b_balance - b_amount) amm/contract.py:339 + // virtual: load a_ratio#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | b_ratio#0,a_ratio#0 a_ratio < b_ratio: amm/contract.py:340 + // virtual: load b_ratio#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0,b_ratio#0 a_ratio < b_ratio: amm/contract.py:340 + < // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | {<} a_ratio < b_ratio: amm/contract.py:340 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%10#0 a_ratio < b_ratio: amm/contract.py:340 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | tmp%10#0 if a_ratio < b_ratio: amm/contract.py:340 + bz tokens_to_mint_else_body@8 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | if a_ratio < b_ratio: amm/contract.py:340 + // Implicit fall through to tokens_to_mint_if_body@7 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | issued#0 if a_ratio < b_ratio: amm/contract.py:340 tokens_to_mint_if_body@7: - frame_dig 0 // load a_ratio#0 from f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0 issued#0 a_ratio * issued amm/contract.py:341 - swap // load issued#0 from x-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_ratio#0,issued#0 a_ratio * issued amm/contract.py:341 - * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {*} a_ratio * issued amm/contract.py:341 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%11#0 a_ratio * issued amm/contract.py:341 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%11#0 a_ratio * issued // SCALE amm/contract.py:341 - int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%11#0,1000 SCALE amm/contract.py:341 - / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {/} a_ratio * issued // SCALE amm/contract.py:341 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%12#0 a_ratio * issued // SCALE amm/contract.py:341 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%12#0 return a_ratio * issued // SCALE amm/contract.py:341 + frame_dig 0 // load a_ratio#0 from f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | a_ratio#0 issued#0 a_ratio * issued amm/contract.py:341 + swap // load issued#0 from x-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | a_ratio#0,issued#0 a_ratio * issued amm/contract.py:341 + * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {*} a_ratio * issued amm/contract.py:341 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%11#0 a_ratio * issued amm/contract.py:341 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%11#0 a_ratio * issued // SCALE amm/contract.py:341 + int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%11#0,1000 SCALE amm/contract.py:341 + / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {/} a_ratio * issued // SCALE amm/contract.py:341 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%12#0 a_ratio * issued // SCALE amm/contract.py:341 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%12#0 return a_ratio * issued // SCALE amm/contract.py:341 frame_bury 0 - retsub // tmp%12#0 return a_ratio * issued // SCALE amm/contract.py:341 + retsub // tmp%12#0 return a_ratio * issued // SCALE amm/contract.py:341 tokens_to_mint_else_body@8: - frame_dig 1 // load b_ratio#0 from f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | b_ratio#0 issued#0 b_ratio * issued amm/contract.py:343 - swap // load issued#0 from x-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | b_ratio#0,issued#0 b_ratio * issued amm/contract.py:343 - * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {*} b_ratio * issued amm/contract.py:343 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%13#0 b_ratio * issued amm/contract.py:343 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%13#0 b_ratio * issued // SCALE amm/contract.py:343 - int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%13#0,1000 SCALE amm/contract.py:343 - / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {/} b_ratio * issued // SCALE amm/contract.py:343 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%14#0 b_ratio * issued // SCALE amm/contract.py:343 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%14#0 return b_ratio * issued // SCALE amm/contract.py:343 + frame_dig 1 // load b_ratio#0 from f-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | (𝕏) issued#0 | b_ratio#0 issued#0 b_ratio * issued amm/contract.py:343 + swap // load issued#0 from x-stack (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | b_ratio#0,issued#0 b_ratio * issued amm/contract.py:343 + * // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {*} b_ratio * issued amm/contract.py:343 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%13#0 b_ratio * issued amm/contract.py:343 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%13#0 b_ratio * issued // SCALE amm/contract.py:343 + int 1000 // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%13#0,1000 SCALE amm/contract.py:343 + / // (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | {/} b_ratio * issued // SCALE amm/contract.py:343 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%14#0 b_ratio * issued // SCALE amm/contract.py:343 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pool_balance#0,a_balance#0,b_balance#0,a_amount#0,b_amount#0 | (𝕗) a_ratio#0,b_ratio#0 | tmp%14#0 return b_ratio * issued // SCALE amm/contract.py:343 frame_bury 0 - retsub // tmp%14#0 return b_ratio * issued // SCALE amm/contract.py:343 + retsub // tmp%14#0 return b_ratio * issued // SCALE amm/contract.py:343 // examples.amm.contract.ConstantProductAMM._update_ratio() -> void: _update_ratio: - proto 0 0 // @subroutine\ndef _update_ratio(self) -> None: amm/contract.py:257-258 + proto 0 0 // @subroutine\ndef _update_ratio(self) -> None: amm/contract.py:257-258 _update_ratio_block@0: - callsub _current_a_balance // {_current_a_balance} self._current_a_balance() amm/contract.py:259 - // virtual: store a_balance#0 to l-stack (no copy) a_balance#0 a_balance = self._current_a_balance() amm/contract.py:259 - callsub _current_b_balance // a_balance#0,{_current_b_balance} self._current_b_balance() amm/contract.py:260 - swap // store b_balance#0 to l-stack (no copy) b_balance#0,a_balance#0 b_balance = self._current_b_balance() amm/contract.py:260 - // virtual: load a_balance#0 from l-stack (no copy) b_balance#0,a_balance#0 a_balance * SCALE amm/contract.py:262 - int 1000 // b_balance#0,a_balance#0,1000 SCALE amm/contract.py:262 - * // b_balance#0,{*} a_balance * SCALE amm/contract.py:262 - // virtual: store tmp%0#0 to l-stack (no copy) b_balance#0,tmp%0#0 a_balance * SCALE amm/contract.py:262 - // virtual: load tmp%0#0 from l-stack (no copy) b_balance#0,tmp%0#0 a_balance * SCALE // b_balance amm/contract.py:262 - swap // load b_balance#0 from l-stack (no copy) tmp%0#0,b_balance#0 a_balance * SCALE // b_balance amm/contract.py:262 - / // {/} a_balance * SCALE // b_balance amm/contract.py:262 - // virtual: store new_state_value%1#0 to l-stack (no copy) new_state_value%1#0 a_balance * SCALE // b_balance amm/contract.py:262 - byte "ratio" // new_state_value%1#0,"ratio" self.ratio amm/contract.py:262 - swap // load new_state_value%1#0 from l-stack (no copy) "ratio",new_state_value%1#0 self.ratio = a_balance * SCALE // b_balance amm/contract.py:262 - app_global_put // self.ratio = a_balance * SCALE // b_balance amm/contract.py:262 + callsub _current_a_balance // {_current_a_balance} self._current_a_balance() amm/contract.py:259 + // virtual: store a_balance#0 to l-stack (no copy) a_balance#0 a_balance = self._current_a_balance() amm/contract.py:259 + callsub _current_b_balance // a_balance#0,{_current_b_balance} self._current_b_balance() amm/contract.py:260 + swap // store b_balance#0 to l-stack (no copy) b_balance#0,a_balance#0 b_balance = self._current_b_balance() amm/contract.py:260 + // virtual: load a_balance#0 from l-stack (no copy) b_balance#0,a_balance#0 a_balance * SCALE amm/contract.py:262 + int 1000 // b_balance#0,a_balance#0,1000 SCALE amm/contract.py:262 + * // b_balance#0,{*} a_balance * SCALE amm/contract.py:262 + // virtual: store tmp%0#0 to l-stack (no copy) b_balance#0,tmp%0#0 a_balance * SCALE amm/contract.py:262 + // virtual: load tmp%0#0 from l-stack (no copy) b_balance#0,tmp%0#0 a_balance * SCALE // b_balance amm/contract.py:262 + swap // load b_balance#0 from l-stack (no copy) tmp%0#0,b_balance#0 a_balance * SCALE // b_balance amm/contract.py:262 + / // {/} a_balance * SCALE // b_balance amm/contract.py:262 + // virtual: store new_state_value%1#0 to l-stack (no copy) new_state_value%1#0 a_balance * SCALE // b_balance amm/contract.py:262 + byte "ratio" // new_state_value%1#0,"ratio" self.ratio amm/contract.py:262 + swap // load new_state_value%1#0 from l-stack (no copy) "ratio",new_state_value%1#0 self.ratio = a_balance * SCALE // b_balance amm/contract.py:262 + app_global_put // self.ratio = a_balance * SCALE // b_balance amm/contract.py:262 retsub // // examples.amm.contract.ConstantProductAMM.burn(pool_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: burn: - proto 4 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | @arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": ... amm/contract.py:149-162 + proto 4 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | @arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": ... amm/contract.py:149-162 burn_block@0: - callsub _check_bootstrapped // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._check_bootstrapped() amm/contract.py:172 - int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.pool_token amm/contract.py:174 - byte "pool_token" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"pool_token" self.pool_token amm/contract.py:174 - app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:174 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:174 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:174 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.pool_token amm/contract.py:174 - assert // check pool_token exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0 self.pool_token amm/contract.py:174 - frame_dig -3 // load pool_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%0#0,pool_asset#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 - swap // load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_asset#0,app_global_get_ex_value%0#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 - == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 assert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 - assert // asset pool incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 - int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_a amm/contract.py:175 - byte "asset_a" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:175 - app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:175 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:175 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:175 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_a amm/contract.py:175 - assert // check asset_a exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0 self.asset_a amm/contract.py:175 - frame_dig -2 // load a_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%3#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 - swap // load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_asset#0,app_global_get_ex_value%3#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 - == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 - assert // asset a incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 - int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_b amm/contract.py:176 - byte "asset_b" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:176 - app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:176 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:176 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:176 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asset_b amm/contract.py:176 - assert // check asset_b exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0 self.asset_b amm/contract.py:176 - frame_dig -1 // load b_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | app_global_get_ex_value%6#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 - swap // load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_asset#0,app_global_get_ex_value%6#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 - == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 - assert // asset b incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 - frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_xfer#0 pool_xfer.asset_receiver amm/contract.py:179 - gtxns AssetReceiver // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} pool_xfer.asset_receiver amm/contract.py:179 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0 pool_xfer.asset_receiver amm/contract.py:179 - global CurrentApplicationAddress // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,{global} Global.current_application_address amm/contract.py:179 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 Global.current_application_address amm/contract.py:179 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%10#0,tmp%9#0 pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 - == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 assert (\npool_xfer.asset_receiver == Global.current_application_address\n), "receiver not app ad... amm/contract.py:178-180 - assert // receiver not app address // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert (\npool_xfer.asset_receiver == Global.current_application_address\n), "receiver not app ad... amm/contract.py:178-180 - frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_xfer#0 pool_xfer.asset_amount amm/contract.py:181 - gtxns AssetAmount // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} pool_xfer.asset_amount amm/contract.py:181 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 pool_xfer.asset_amount amm/contract.py:181 - dup // load tmp%12#0 from l-stack (copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%12#0 pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 - int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%12#0,0 0 amm/contract.py:181 - > // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{>} pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 assert pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 - assert // amount minimum not met // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 assert pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 - frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_xfer#0 pool_xfer.xfer_asset amm/contract.py:182 - gtxns XferAsset // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{gtxns} pool_xfer.xfer_asset amm/contract.py:182 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0 pool_xfer.xfer_asset amm/contract.py:182 - int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,0 self.pool_token amm/contract.py:182 - byte "pool_token" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,0,"pool_token" self.pool_token amm/contract.py:182 - app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:182 - // virtual: store app_global_get_ex_did_exist%16#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_did_exist%16#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:182 - // virtual: store app_global_get_ex_value%15#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.pool_token amm/contract.py:182 - // virtual: load app_global_get_ex_did_exist%16#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.pool_token amm/contract.py:182 - assert // check pool_token exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0 self.pool_token amm/contract.py:182 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,app_global_get_ex_value%15#0,tmp%14#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 - // virtual: load app_global_get_ex_value%15#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,app_global_get_ex_value%15#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 - == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{==} pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%17#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%17#0 assert pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 - assert // asset pool incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 assert pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 - frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_xfer#0 pool_xfer.sender amm/contract.py:183 - gtxns Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{gtxns} pool_xfer.sender amm/contract.py:183 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0 pool_xfer.sender amm/contract.py:183 - txn Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0,{txn} Txn.sender amm/contract.py:183 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0,tmp%19#0 Txn.sender amm/contract.py:183 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%19#0,tmp%18#0 pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0,tmp%19#0 pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 - == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{==} pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%20#0 pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%20#0 assert pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 - assert // sender invalid // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 assert pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 - callsub _current_pool_balance // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{_current_pool_balance} number of tokens issued\n# !important: this happens prior to receiving the current axfer of pool ... amm/contract.py:185-187 - // virtual: store pool_balance#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0 # Get the total number of tokens issued\n# !important: this happens prior to receiving the curren... amm/contract.py:185-187 - callsub _current_a_balance // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,{_current_a_balance} self._current_a_balance() amm/contract.py:190 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,tmp%21#0 self._current_a_balance() amm/contract.py:190 - dig 1 // load pool_balance#0 from l-stack (copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,tmp%21#0,pool_balance#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 - swap // load tmp%21#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,pool_balance#0,tmp%21#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 - dig 3 // load tmp%12#0 from l-stack (copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,pool_balance#0,tmp%21#0,tmp%12#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 - callsub tokens_to_burn // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,{tokens_to_burn} tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=pool_xfer.... amm/contract.py:188-192 - cover 2 // store a_amt#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 - callsub _current_b_balance // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0,{_current_b_balance} self._current_b_balance() amm/contract.py:195 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0,tmp%23#0 self._current_b_balance() amm/contract.py:195 - // virtual: load pool_balance#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,tmp%23#0,pool_balance#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0,tmp%23#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 - uncover 2 // load tmp%12#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,pool_balance#0,tmp%23#0,tmp%12#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 - callsub tokens_to_burn // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,{tokens_to_burn} tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=pool_xfer.... amm/contract.py:193-197 - swap // store b_amt#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 - txn Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,{txn} t of a\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:199-200 - // virtual: store tmp%25#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0 t of a\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:199-200 - int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - byte "asset_a" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,0,"asset_a" \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - // virtual: store app_global_get_ex_did_exist%27#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_did_exist%27#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - // virtual: store app_global_get_ex_value%26#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0,app_global_get_ex_did_exist%27#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - // virtual: load app_global_get_ex_did_exist%27#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0,app_global_get_ex_did_exist%27#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - assert // check asset_a exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 - // virtual: load tmp%25#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,app_global_get_ex_value%26#0,tmp%25#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 - // virtual: load app_global_get_ex_value%26#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,app_global_get_ex_value%26#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 - uncover 2 // load a_amt#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%25#0,app_global_get_ex_value%26#0,a_amt#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 - callsub do_asset_transfer // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 - txn Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,{txn} t of b\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:202-203 - // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0 t of b\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:202-203 - int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - byte "asset_b" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,0,"asset_b" \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - // virtual: store app_global_get_ex_did_exist%30#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_did_exist%30#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - // virtual: store app_global_get_ex_value%29#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0,app_global_get_ex_did_exist%30#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - // virtual: load app_global_get_ex_did_exist%30#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0,app_global_get_ex_did_exist%30#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - assert // check asset_b exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 - // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,app_global_get_ex_value%29#0,tmp%28#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 - // virtual: load app_global_get_ex_value%29#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,app_global_get_ex_value%29#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 - uncover 2 // load b_amt#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%28#0,app_global_get_ex_value%29#0,b_amt#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 - callsub do_asset_transfer // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 - callsub _update_ratio // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._update_ratio() amm/contract.py:204 + callsub _check_bootstrapped // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._check_bootstrapped() amm/contract.py:172 + int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.pool_token amm/contract.py:174 + byte "pool_token" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"pool_token" self.pool_token amm/contract.py:174 + app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:174 + // virtual: store pool_token_exists%1#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_exists%1#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:174 + // virtual: store pool_token_value%0#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_token_exists%1#0 self.pool_token amm/contract.py:174 + // virtual: load pool_token_exists%1#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_token_exists%1#0 self.pool_token amm/contract.py:174 + assert // check pool_token exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0 self.pool_token amm/contract.py:174 + frame_dig -3 // load pool_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_token_value%0#0,pool_asset#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 + swap // load pool_token_value%0#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_asset#0,pool_token_value%0#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 + == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%2#0 assert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 + assert // asset pool incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert pool_asset == self.pool_token, "asset pool incorrect" amm/contract.py:174 + int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_a amm/contract.py:175 + byte "asset_a" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:175 + app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:175 + // virtual: store asset_a_exists%4#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_exists%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:175 + // virtual: store asset_a_value%3#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:175 + // virtual: load asset_a_exists%4#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:175 + assert // check asset_a exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0 self.asset_a amm/contract.py:175 + frame_dig -2 // load a_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_a_value%3#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 + swap // load asset_a_value%3#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_asset#0,asset_a_value%3#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 + == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%5#0 assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 + assert // asset a incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:175 + int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0 self.asset_b amm/contract.py:176 + byte "asset_b" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:176 + app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:176 + // virtual: store asset_b_exists%7#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_exists%7#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:176 + // virtual: store asset_b_value%6#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0,asset_b_exists%7#0 self.asset_b amm/contract.py:176 + // virtual: load asset_b_exists%7#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0,asset_b_exists%7#0 self.asset_b amm/contract.py:176 + assert // check asset_b exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0 self.asset_b amm/contract.py:176 + frame_dig -1 // load b_asset#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | asset_b_value%6#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 + swap // load asset_b_value%6#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_asset#0,asset_b_value%6#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 + == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%8#0 assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 + assert // asset b incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:176 + frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_xfer#0 pool_xfer.asset_receiver amm/contract.py:179 + gtxns AssetReceiver // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} pool_xfer.asset_receiver amm/contract.py:179 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0 pool_xfer.asset_receiver amm/contract.py:179 + global CurrentApplicationAddress // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,{global} Global.current_application_address amm/contract.py:179 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 Global.current_application_address amm/contract.py:179 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%10#0,tmp%9#0 pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%9#0,tmp%10#0 pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 + == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {==} pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 pool_xfer.asset_receiver == Global.current_application_address amm/contract.py:179 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%11#0 assert (\npool_xfer.asset_receiver == Global.current_application_address\n), "receiver not app ad... amm/contract.py:178-180 + assert // receiver not app address // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | assert (\npool_xfer.asset_receiver == Global.current_application_address\n), "receiver not app ad... amm/contract.py:178-180 + frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | pool_xfer#0 pool_xfer.asset_amount amm/contract.py:181 + gtxns AssetAmount // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | {gtxns} pool_xfer.asset_amount amm/contract.py:181 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 pool_xfer.asset_amount amm/contract.py:181 + dup // load tmp%12#0 from l-stack (copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%12#0 pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 + int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%12#0,0 0 amm/contract.py:181 + > // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{>} pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%13#0 assert pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 + assert // amount minimum not met // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 assert pool_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:181 + frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_xfer#0 pool_xfer.xfer_asset amm/contract.py:182 + gtxns XferAsset // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{gtxns} pool_xfer.xfer_asset amm/contract.py:182 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0 pool_xfer.xfer_asset amm/contract.py:182 + int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,0 self.pool_token amm/contract.py:182 + byte "pool_token" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,0,"pool_token" self.pool_token amm/contract.py:182 + app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:182 + // virtual: store pool_token_exists%16#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,pool_token_exists%16#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:182 + // virtual: store pool_token_value%15#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,pool_token_value%15#0,pool_token_exists%16#0 self.pool_token amm/contract.py:182 + // virtual: load pool_token_exists%16#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,pool_token_value%15#0,pool_token_exists%16#0 self.pool_token amm/contract.py:182 + assert // check pool_token exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,pool_token_value%15#0 self.pool_token amm/contract.py:182 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_token_value%15#0,tmp%14#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 + // virtual: load pool_token_value%15#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%14#0,pool_token_value%15#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 + == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{==} pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%17#0 pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%17#0 assert pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 + assert // asset pool incorrect // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 assert pool_xfer.xfer_asset == self.pool_token, "asset pool incorrect" amm/contract.py:182 + frame_dig -4 // load pool_xfer#0 from parameters (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_xfer#0 pool_xfer.sender amm/contract.py:183 + gtxns Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{gtxns} pool_xfer.sender amm/contract.py:183 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0 pool_xfer.sender amm/contract.py:183 + txn Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0,{txn} Txn.sender amm/contract.py:183 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0,tmp%19#0 Txn.sender amm/contract.py:183 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%19#0,tmp%18#0 pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%18#0,tmp%19#0 pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 + == // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{==} pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%20#0 pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,tmp%20#0 assert pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 + assert // sender invalid // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0 assert pool_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:183 + callsub _current_pool_balance // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,{_current_pool_balance} number of tokens issued\n# !important: this happens prior to receiving the current axfer of pool ... amm/contract.py:185-187 + // virtual: store pool_balance#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0 # Get the total number of tokens issued\n# !important: this happens prior to receiving the curren... amm/contract.py:185-187 + callsub _current_a_balance // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,{_current_a_balance} self._current_a_balance() amm/contract.py:190 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,tmp%21#0 self._current_a_balance() amm/contract.py:190 + dig 1 // load pool_balance#0 from l-stack (copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,tmp%21#0,pool_balance#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 + swap // load tmp%21#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,pool_balance#0,tmp%21#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 + dig 3 // load tmp%12#0 from l-stack (copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,pool_balance#0,tmp%21#0,tmp%12#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 + callsub tokens_to_burn // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%12#0,pool_balance#0,{tokens_to_burn} tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=pool_xfer.... amm/contract.py:188-192 + cover 2 // store a_amt#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0 a_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_a_balance(),\namount=po... amm/contract.py:188-192 + callsub _current_b_balance // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0,{_current_b_balance} self._current_b_balance() amm/contract.py:195 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0,tmp%23#0 self._current_b_balance() amm/contract.py:195 + // virtual: load pool_balance#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,tmp%23#0,pool_balance#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,tmp%12#0,pool_balance#0,tmp%23#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 + uncover 2 // load tmp%12#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,pool_balance#0,tmp%23#0,tmp%12#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 + callsub tokens_to_burn // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | a_amt#0,{tokens_to_burn} tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=pool_xfer.... amm/contract.py:193-197 + swap // store b_amt#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0 b_amt = tokens_to_burn(\npool_balance=pool_balance,\nsupply=self._current_b_balance(),\namount=po... amm/contract.py:193-197 + txn Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,{txn} t of a\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:199-200 + // virtual: store tmp%25#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0 t of a\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:199-200 + int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + byte "asset_a" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,0,"asset_a" \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + // virtual: store asset_a_exists%27#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,asset_a_exists%27#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + // virtual: store asset_a_value%26#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,asset_a_value%26#0,asset_a_exists%27#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + // virtual: load asset_a_exists%27#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,asset_a_value%26#0,asset_a_exists%27#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + assert // check asset_a exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,asset_a_value%26#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a amm/contract.py:199-200 + // virtual: load tmp%25#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,asset_a_value%26#0,tmp%25#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 + // virtual: load asset_a_value%26#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,a_amt#0,tmp%25#0,asset_a_value%26#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 + uncover 2 // load a_amt#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%25#0,asset_a_value%26#0,a_amt#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 + callsub do_asset_transfer // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0 # Send back commensurate amt of a\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_a, amo... amm/contract.py:199-200 + txn Sender // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,{txn} t of b\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:202-203 + // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0 t of b\ndo_asset_transfer(receiver=Txn.sender amm/contract.py:202-203 + int 0 // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + byte "asset_b" // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,0,"asset_b" \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + app_global_get_ex // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + // virtual: store asset_b_exists%30#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,asset_b_exists%30#0,{app_global_get_ex}.0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + // virtual: store asset_b_value%29#0 to l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,asset_b_value%29#0,asset_b_exists%30#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + // virtual: load asset_b_exists%30#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,asset_b_value%29#0,asset_b_exists%30#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + assert // check asset_b exists // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,asset_b_value%29#0 \ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b amm/contract.py:202-203 + // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,asset_b_value%29#0,tmp%28#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 + // virtual: load asset_b_value%29#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | b_amt#0,tmp%28#0,asset_b_value%29#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 + uncover 2 // load b_amt#0 from l-stack (no copy) (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | tmp%28#0,asset_b_value%29#0,b_amt#0 # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 + callsub do_asset_transfer // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | # Send back commensurate amt of b\ndo_asset_transfer(receiver=Txn.sender, asset=self.asset_b, amo... amm/contract.py:202-203 + callsub _update_ratio // (𝕡) pool_xfer#0,pool_asset#0,a_asset#0,b_asset#0 | self._update_ratio() amm/contract.py:204 retsub // // examples.amm.contract.tokens_to_burn(pool_balance: uint64, supply: uint64, amount: uint64) -> uint64: tokens_to_burn: - proto 3 1 // (𝕡) pool_balance#0,supply#0,amount#0 | @subroutine\ndef tokens_to_burn(*, pool_balance: UInt64, supply: UInt64, amount: UInt64) -> UInt64: amm/contract.py:346-347 + proto 3 1 // (𝕡) pool_balance#0,supply#0,amount#0 | @subroutine\ndef tokens_to_burn(*, pool_balance: UInt64, supply: UInt64, amount: UInt64) -> UInt64: amm/contract.py:346-347 tokens_to_burn_block@0: - int 10000000000 // (𝕡) pool_balance#0,supply#0,amount#0 | 10000000000 TOTAL_SUPPLY amm/contract.py:348 - frame_dig -3 // load pool_balance#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | 10000000000,pool_balance#0 TOTAL_SUPPLY - pool_balance amm/contract.py:348 - - // (𝕡) pool_balance#0,supply#0,amount#0 | {-} TOTAL_SUPPLY - pool_balance amm/contract.py:348 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%0#0 TOTAL_SUPPLY - pool_balance amm/contract.py:348 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%0#0 issued = TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 - frame_dig -1 // load amount#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | tmp%0#0,amount#0 issued = TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 - - // (𝕡) pool_balance#0,supply#0,amount#0 | {-} TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 - // virtual: store issued#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | issued#0 issued = TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 - frame_dig -2 // load supply#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,supply#0 supply * amount amm/contract.py:349 - frame_dig -1 // load amount#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,supply#0,amount#0 supply * amount amm/contract.py:349 - * // (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,{*} supply * amount amm/contract.py:349 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,tmp%1#0 supply * amount amm/contract.py:349 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,tmp%1#0 supply * amount // issued amm/contract.py:349 - swap // load issued#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%1#0,issued#0 supply * amount // issued amm/contract.py:349 - / // (𝕡) pool_balance#0,supply#0,amount#0 | {/} supply * amount // issued amm/contract.py:349 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%2#0 supply * amount // issued amm/contract.py:349 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%2#0 return supply * amount // issued amm/contract.py:349 - retsub // tmp%2#0 return supply * amount // issued amm/contract.py:349 + int 10000000000 // (𝕡) pool_balance#0,supply#0,amount#0 | 10000000000 TOTAL_SUPPLY amm/contract.py:348 + frame_dig -3 // load pool_balance#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | 10000000000,pool_balance#0 TOTAL_SUPPLY - pool_balance amm/contract.py:348 + - // (𝕡) pool_balance#0,supply#0,amount#0 | {-} TOTAL_SUPPLY - pool_balance amm/contract.py:348 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%0#0 TOTAL_SUPPLY - pool_balance amm/contract.py:348 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%0#0 issued = TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 + frame_dig -1 // load amount#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | tmp%0#0,amount#0 issued = TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 + - // (𝕡) pool_balance#0,supply#0,amount#0 | {-} TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 + // virtual: store issued#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | issued#0 issued = TOTAL_SUPPLY - pool_balance - amount amm/contract.py:348 + frame_dig -2 // load supply#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,supply#0 supply * amount amm/contract.py:349 + frame_dig -1 // load amount#0 from parameters (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,supply#0,amount#0 supply * amount amm/contract.py:349 + * // (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,{*} supply * amount amm/contract.py:349 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,tmp%1#0 supply * amount amm/contract.py:349 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | issued#0,tmp%1#0 supply * amount // issued amm/contract.py:349 + swap // load issued#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%1#0,issued#0 supply * amount // issued amm/contract.py:349 + / // (𝕡) pool_balance#0,supply#0,amount#0 | {/} supply * amount // issued amm/contract.py:349 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%2#0 supply * amount // issued amm/contract.py:349 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) pool_balance#0,supply#0,amount#0 | tmp%2#0 return supply * amount // issued amm/contract.py:349 + retsub // tmp%2#0 return supply * amount // issued amm/contract.py:349 // examples.amm.contract.ConstantProductAMM.swap(swap_xfer: uint64, a_asset: uint64, b_asset: uint64) -> void: swap: - proto 3 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | @arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n)\ndef swap(\... amm/contract.py:206-217 + proto 3 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | @arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n)\ndef swap(\... amm/contract.py:206-217 byte "" - dup // allocate 2 to stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | + dup // allocate 2 to stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | swap_block@0: - callsub _check_bootstrapped // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | self._check_bootstrapped() amm/contract.py:225 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0 self.asset_a amm/contract.py:227 - byte "asset_a" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:227 - app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:227 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:227 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asset_a amm/contract.py:227 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asset_a amm/contract.py:227 - assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0 self.asset_a amm/contract.py:227 - frame_dig -2 // load a_asset#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%0#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 - swap // load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | a_asset#0,app_global_get_ex_value%0#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 - == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%2#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%2#0 assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 - assert // asset a incorrect // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0 self.asset_b amm/contract.py:228 - byte "asset_b" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:228 - app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:228 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:228 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:228 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 self.asset_b amm/contract.py:228 - assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0 self.asset_b amm/contract.py:228 - frame_dig -1 // load b_asset#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | app_global_get_ex_value%3#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 - swap // load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | b_asset#0,app_global_get_ex_value%3#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 - == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%5#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%5#0 assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 - assert // asset b incorrect // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 - frame_dig -3 // load swap_xfer#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | swap_xfer#0 swap_xfer.asset_amount amm/contract.py:230 - gtxns AssetAmount // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {gtxns} swap_xfer.asset_amount amm/contract.py:230 - dup // store tmp%6#0 to l-stack (copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%6#0,tmp%6#0 swap_xfer.asset_amount amm/contract.py:230 - swap // store tmp%6#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0 swap_xfer.asset_amount amm/contract.py:230 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0 swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0,0 0 amm/contract.py:230 - > // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {>} swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%7#0 swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%7#0 assert swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 - assert // amount minimum not met // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | assert swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 - frame_dig -3 // load swap_xfer#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | swap_xfer#0 swap_xfer.sender amm/contract.py:231 - gtxns Sender // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {gtxns} swap_xfer.sender amm/contract.py:231 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0 swap_xfer.sender amm/contract.py:231 - txn Sender // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0,{txn} Txn.sender amm/contract.py:231 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0,tmp%9#0 Txn.sender amm/contract.py:231 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%9#0,tmp%8#0 swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0,tmp%9#0 swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 - == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {==} swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%10#0 swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%10#0 assert swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 - assert // sender invalid // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | assert swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | 0 self.asset_a amm/contract.py:234 - byte "asset_a" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | 0,"asset_a" self.asset_a amm/contract.py:234 - app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:234 - // virtual: store app_global_get_ex_did_exist%12#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_did_exist%12#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:234 - // virtual: store app_global_get_ex_value%11#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 self.asset_a amm/contract.py:234 - // virtual: load app_global_get_ex_did_exist%12#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 self.asset_a amm/contract.py:234 - assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0 self.asset_a amm/contract.py:234 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,0 self.asset_b amm/contract.py:238 - byte "asset_b" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,0,"asset_b" self.asset_b amm/contract.py:238 - app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:238 - // virtual: store app_global_get_ex_did_exist%14#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_did_exist%14#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:238 - // virtual: store app_global_get_ex_value%13#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,app_global_get_ex_did_exist%14#0 self.asset_b amm/contract.py:238 - // virtual: load app_global_get_ex_did_exist%14#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,app_global_get_ex_did_exist%14#0 self.asset_b amm/contract.py:238 - assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0 self.asset_b amm/contract.py:238 - frame_dig -3 // load swap_xfer#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,swap_xfer#0 swap_xfer.xfer_asset amm/contract.py:233 - gtxns XferAsset // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,{gtxns} swap_xfer.xfer_asset amm/contract.py:233 - // virtual: store awst_tmp%15#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,awst_tmp%15#0 swap_xfer.xfer_asset amm/contract.py:233 - uncover 2 // load app_global_get_ex_value%11#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%13#0,awst_tmp%15#0,app_global_get_ex_value%11#0 match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 - uncover 2 // load app_global_get_ex_value%13#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | awst_tmp%15#0,app_global_get_ex_value%11#0,app_global_get_ex_value%13#0 match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 - uncover 2 // load awst_tmp%15#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | app_global_get_ex_value%11#0,app_global_get_ex_value%13#0,awst_tmp%15#0 match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 - match swap_switch_case_0@1 swap_switch_case_1@2 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 - err // asset id incorrect // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | assert False, "asset id incorrect" amm/contract.py:243 + callsub _check_bootstrapped // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | self._check_bootstrapped() amm/contract.py:225 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0 self.asset_a amm/contract.py:227 + byte "asset_a" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0,"asset_a" self.asset_a amm/contract.py:227 + app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:227 + // virtual: store asset_a_exists%1#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_a_exists%1#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:227 + // virtual: store asset_a_value%0#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_a_value%0#0,asset_a_exists%1#0 self.asset_a amm/contract.py:227 + // virtual: load asset_a_exists%1#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_a_value%0#0,asset_a_exists%1#0 self.asset_a amm/contract.py:227 + assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_a_value%0#0 self.asset_a amm/contract.py:227 + frame_dig -2 // load a_asset#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_a_value%0#0,a_asset#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 + swap // load asset_a_value%0#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | a_asset#0,asset_a_value%0#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 + == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {==} a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%2#0 a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%2#0 assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 + assert // asset a incorrect // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | assert a_asset == self.asset_a, "asset a incorrect" amm/contract.py:227 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0 self.asset_b amm/contract.py:228 + byte "asset_b" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | 0,"asset_b" self.asset_b amm/contract.py:228 + app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:228 + // virtual: store asset_b_exists%4#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_b_exists%4#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:228 + // virtual: store asset_b_value%3#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_b_value%3#0,asset_b_exists%4#0 self.asset_b amm/contract.py:228 + // virtual: load asset_b_exists%4#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_b_value%3#0,asset_b_exists%4#0 self.asset_b amm/contract.py:228 + assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_b_value%3#0 self.asset_b amm/contract.py:228 + frame_dig -1 // load b_asset#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | asset_b_value%3#0,b_asset#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 + swap // load asset_b_value%3#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | b_asset#0,asset_b_value%3#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 + == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {==} b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%5#0 b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%5#0 assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 + assert // asset b incorrect // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | assert b_asset == self.asset_b, "asset b incorrect" amm/contract.py:228 + frame_dig -3 // load swap_xfer#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | swap_xfer#0 swap_xfer.asset_amount amm/contract.py:230 + gtxns AssetAmount // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | {gtxns} swap_xfer.asset_amount amm/contract.py:230 + dup // store tmp%6#0 to l-stack (copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0 | tmp%6#0,tmp%6#0 swap_xfer.asset_amount amm/contract.py:230 + swap // store tmp%6#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0 swap_xfer.asset_amount amm/contract.py:230 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0 swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0,0 0 amm/contract.py:230 + > // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {>} swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%7#0 swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%7#0 assert swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 + assert // amount minimum not met // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | assert swap_xfer.asset_amount > 0, "amount minimum not met" amm/contract.py:230 + frame_dig -3 // load swap_xfer#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | swap_xfer#0 swap_xfer.sender amm/contract.py:231 + gtxns Sender // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {gtxns} swap_xfer.sender amm/contract.py:231 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0 swap_xfer.sender amm/contract.py:231 + txn Sender // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0,{txn} Txn.sender amm/contract.py:231 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0,tmp%9#0 Txn.sender amm/contract.py:231 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%9#0,tmp%8#0 swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%8#0,tmp%9#0 swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 + == // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {==} swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%10#0 swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%10#0 assert swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 + assert // sender invalid // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | assert swap_xfer.sender == Txn.sender, "sender invalid" amm/contract.py:231 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | 0 self.asset_a amm/contract.py:234 + byte "asset_a" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | 0,"asset_a" self.asset_a amm/contract.py:234 + app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:234 + // virtual: store asset_a_exists%12#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_exists%12#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:234 + // virtual: store asset_a_value%11#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_a_exists%12#0 self.asset_a amm/contract.py:234 + // virtual: load asset_a_exists%12#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_a_exists%12#0 self.asset_a amm/contract.py:234 + assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0 self.asset_a amm/contract.py:234 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,0 self.asset_b amm/contract.py:238 + byte "asset_b" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,0,"asset_b" self.asset_b amm/contract.py:238 + app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:238 + // virtual: store asset_b_exists%14#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_exists%14#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:238 + // virtual: store asset_b_value%13#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_value%13#0,asset_b_exists%14#0 self.asset_b amm/contract.py:238 + // virtual: load asset_b_exists%14#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_value%13#0,asset_b_exists%14#0 self.asset_b amm/contract.py:238 + assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_value%13#0 self.asset_b amm/contract.py:238 + frame_dig -3 // load swap_xfer#0 from parameters (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_value%13#0,swap_xfer#0 swap_xfer.xfer_asset amm/contract.py:233 + gtxns XferAsset // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_value%13#0,{gtxns} swap_xfer.xfer_asset amm/contract.py:233 + // virtual: store awst_tmp%15#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_value%13#0,awst_tmp%15#0 swap_xfer.xfer_asset amm/contract.py:233 + uncover 2 // load asset_a_value%11#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_b_value%13#0,awst_tmp%15#0,asset_a_value%11#0 match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 + uncover 2 // load asset_b_value%13#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | awst_tmp%15#0,asset_a_value%11#0,asset_b_value%13#0 match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 + uncover 2 // load awst_tmp%15#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | asset_a_value%11#0,asset_b_value%13#0,awst_tmp%15#0 match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 + match swap_switch_case_0@1 swap_switch_case_1@2 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | match swap_xfer.xfer_asset:\ncase self.asset_a:\nin_supply = self._current_b_balance()\nout_suppl... amm/contract.py:233-243 + err // asset id incorrect // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | assert False, "asset id incorrect" amm/contract.py:243 swap_switch_case_0@1: - callsub _current_b_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_b_balance} self._current_b_balance() amm/contract.py:235 - frame_bury 0 // store in_supply#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | in_supply = self._current_b_balance() amm/contract.py:235 - callsub _current_a_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_a_balance} self._current_a_balance() amm/contract.py:236 - // virtual: store out_supply#0 to x-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply = self._current_a_balance() amm/contract.py:236 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0 self.asset_a amm/contract.py:237 - byte "asset_a" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0,"asset_a" self.asset_a amm/contract.py:237 - app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:237 - swap // store app_global_get_ex_did_exist%17#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%17#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:237 - frame_bury 1 // store out_asset#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%17#0 self.asset_a amm/contract.py:237 - // virtual: load app_global_get_ex_did_exist%17#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%17#0 self.asset_a amm/contract.py:237 - assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_a amm/contract.py:237 - b swap_switch_case_next@4 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply#0 + callsub _current_b_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_b_balance} self._current_b_balance() amm/contract.py:235 + frame_bury 0 // store in_supply#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | in_supply = self._current_b_balance() amm/contract.py:235 + callsub _current_a_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_a_balance} self._current_a_balance() amm/contract.py:236 + // virtual: store out_supply#0 to x-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply = self._current_a_balance() amm/contract.py:236 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0 self.asset_a amm/contract.py:237 + byte "asset_a" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0,"asset_a" self.asset_a amm/contract.py:237 + app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:237 + swap // store asset_a_exists%17#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | asset_a_exists%17#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:237 + frame_bury 1 // store out_asset#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | asset_a_exists%17#0 self.asset_a amm/contract.py:237 + // virtual: load asset_a_exists%17#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | asset_a_exists%17#0 self.asset_a amm/contract.py:237 + assert // check asset_a exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_a amm/contract.py:237 + b swap_switch_case_next@4 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply#0 swap_switch_case_1@2: - callsub _current_a_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_a_balance} self._current_a_balance() amm/contract.py:239 - frame_bury 0 // store in_supply#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | in_supply = self._current_a_balance() amm/contract.py:239 - callsub _current_b_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_b_balance} self._current_b_balance() amm/contract.py:240 - // virtual: store out_supply#0 to x-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply = self._current_b_balance() amm/contract.py:240 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0 self.asset_b amm/contract.py:241 - byte "asset_b" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0,"asset_b" self.asset_b amm/contract.py:241 - app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:241 - swap // store app_global_get_ex_did_exist%19#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%19#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:241 - frame_bury 1 // store out_asset#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%19#0 self.asset_b amm/contract.py:241 - // virtual: load app_global_get_ex_did_exist%19#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | app_global_get_ex_did_exist%19#0 self.asset_b amm/contract.py:241 - assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_b amm/contract.py:241 - // Implicit fall through to swap_switch_case_next@4 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply#0 + callsub _current_a_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_a_balance} self._current_a_balance() amm/contract.py:239 + frame_bury 0 // store in_supply#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | in_supply = self._current_a_balance() amm/contract.py:239 + callsub _current_b_balance // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {_current_b_balance} self._current_b_balance() amm/contract.py:240 + // virtual: store out_supply#0 to x-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply = self._current_b_balance() amm/contract.py:240 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0 self.asset_b amm/contract.py:241 + byte "asset_b" // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | 0,"asset_b" self.asset_b amm/contract.py:241 + app_global_get_ex // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:241 + swap // store asset_b_exists%19#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | asset_b_exists%19#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:241 + frame_bury 1 // store out_asset#0 to f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | asset_b_exists%19#0 self.asset_b amm/contract.py:241 + // virtual: load asset_b_exists%19#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | asset_b_exists%19#0 self.asset_b amm/contract.py:241 + assert // check asset_b exists // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | self.asset_b amm/contract.py:241 + // Implicit fall through to swap_switch_case_next@4 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | out_supply#0 swap_switch_case_next@4: - frame_dig 2 // load tmp%6#0 from f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | tmp%6#0 out_supply#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 - frame_dig 0 // load in_supply#0 from f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | tmp%6#0,in_supply#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 - uncover 2 // load out_supply#0 from x-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0,in_supply#0,out_supply#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 - callsub tokens_to_swap // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {tokens_to_swap} tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_supply\n) amm/contract.py:245-247 - // virtual: store to_swap#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 - dup // load to_swap#0 from l-stack (copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,to_swap#0 to_swap > 0, "send amount too low" amm/contract.py:248 - int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,to_swap#0,0 0 amm/contract.py:248 - > // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,{>} to_swap > 0, "send amount too low" amm/contract.py:248 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%21#0 to_swap > 0, "send amount too low" amm/contract.py:248 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%21#0 assert to_swap > 0, "send amount too low" amm/contract.py:248 - assert // send amount too low // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0 assert to_swap > 0, "send amount too low" amm/contract.py:248 - txn Sender // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,{txn} Txn.sender amm/contract.py:250 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%22#0 Txn.sender amm/contract.py:250 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%22#0 do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 - frame_dig 1 // load out_asset#0 from f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%22#0,out_asset#0 do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 - uncover 2 // load to_swap#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%22#0,out_asset#0,to_swap#0 do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 - callsub do_asset_transfer // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 - callsub _update_ratio // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | self._update_ratio() amm/contract.py:251 + frame_dig 2 // load tmp%6#0 from f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | tmp%6#0 out_supply#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 + frame_dig 0 // load in_supply#0 from f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | (𝕏) out_supply#0 | tmp%6#0,in_supply#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 + uncover 2 // load out_supply#0 from x-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%6#0,in_supply#0,out_supply#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 + callsub tokens_to_swap // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | {tokens_to_swap} tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_supply\n) amm/contract.py:245-247 + // virtual: store to_swap#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0 to_swap = tokens_to_swap(\nin_amount=swap_xfer.asset_amount, in_supply=in_supply, out_supply=out_... amm/contract.py:245-247 + dup // load to_swap#0 from l-stack (copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,to_swap#0 to_swap > 0, "send amount too low" amm/contract.py:248 + int 0 // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,to_swap#0,0 0 amm/contract.py:248 + > // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,{>} to_swap > 0, "send amount too low" amm/contract.py:248 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%21#0 to_swap > 0, "send amount too low" amm/contract.py:248 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%21#0 assert to_swap > 0, "send amount too low" amm/contract.py:248 + assert // send amount too low // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0 assert to_swap > 0, "send amount too low" amm/contract.py:248 + txn Sender // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,{txn} Txn.sender amm/contract.py:250 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%22#0 Txn.sender amm/contract.py:250 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%22#0 do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 + frame_dig 1 // load out_asset#0 from f-stack (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | to_swap#0,tmp%22#0,out_asset#0 do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 + uncover 2 // load to_swap#0 from l-stack (no copy) (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | tmp%22#0,out_asset#0,to_swap#0 do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 + callsub do_asset_transfer // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | do_asset_transfer(receiver=Txn.sender, asset=out_asset, amount=to_swap) amm/contract.py:250 + callsub _update_ratio // (𝕡) swap_xfer#0,a_asset#0,b_asset#0 | (𝕗) in_supply#0,out_asset#0,tmp%6#0 | self._update_ratio() amm/contract.py:251 retsub // // examples.amm.contract.tokens_to_swap(in_amount: uint64, in_supply: uint64, out_supply: uint64) -> uint64: tokens_to_swap: - proto 3 1 // (𝕡) in_amount#0,in_supply#0,out_supply#0 | @subroutine\ndef tokens_to_swap(*, in_amount: UInt64, in_supply: UInt64, out_supply: UInt64) -> U... amm/contract.py:352-353 + proto 3 1 // (𝕡) in_amount#0,in_supply#0,out_supply#0 | @subroutine\ndef tokens_to_swap(*, in_amount: UInt64, in_supply: UInt64, out_supply: UInt64) -> U... amm/contract.py:352-353 tokens_to_swap_block@0: - frame_dig -2 // load in_supply#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_supply#0 in_supply - in_amount amm/contract.py:354 - frame_dig -3 // load in_amount#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_supply#0,in_amount#0 in_supply - in_amount amm/contract.py:354 - - // (𝕡) in_amount#0,in_supply#0,out_supply#0 | {-} in_supply - in_amount amm/contract.py:354 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%0#0 in_supply - in_amount amm/contract.py:354 - int 1000 // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%0#0,1000 SCALE amm/contract.py:354 - swap // load tmp%0#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | 1000,tmp%0#0 SCALE * (in_supply - in_amount) amm/contract.py:354 - * // (𝕡) in_amount#0,in_supply#0,out_supply#0 | {*} SCALE * (in_supply - in_amount) amm/contract.py:354 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0 SCALE * (in_supply - in_amount) amm/contract.py:354 - frame_dig -3 // load in_amount#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,in_amount#0 in_amount * FACTOR amm/contract.py:354 - int 995 // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,in_amount#0,995 FACTOR amm/contract.py:354 - * // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,{*} in_amount * FACTOR amm/contract.py:354 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,tmp%2#0 in_amount * FACTOR amm/contract.py:354 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%2#0,tmp%1#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,tmp%2#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 + frame_dig -2 // load in_supply#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_supply#0 in_supply - in_amount amm/contract.py:354 + frame_dig -3 // load in_amount#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_supply#0,in_amount#0 in_supply - in_amount amm/contract.py:354 + - // (𝕡) in_amount#0,in_supply#0,out_supply#0 | {-} in_supply - in_amount amm/contract.py:354 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%0#0 in_supply - in_amount amm/contract.py:354 + int 1000 // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%0#0,1000 SCALE amm/contract.py:354 + swap // load tmp%0#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | 1000,tmp%0#0 SCALE * (in_supply - in_amount) amm/contract.py:354 + * // (𝕡) in_amount#0,in_supply#0,out_supply#0 | {*} SCALE * (in_supply - in_amount) amm/contract.py:354 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0 SCALE * (in_supply - in_amount) amm/contract.py:354 + frame_dig -3 // load in_amount#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,in_amount#0 in_amount * FACTOR amm/contract.py:354 + int 995 // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,in_amount#0,995 FACTOR amm/contract.py:354 + * // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,{*} in_amount * FACTOR amm/contract.py:354 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,tmp%2#0 in_amount * FACTOR amm/contract.py:354 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%2#0,tmp%1#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%1#0,tmp%2#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 dup - cover 2 // store tmp%2#0 to l-stack (copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%2#0,tmp%1#0,tmp%2#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 - + // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%2#0,{+} SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 - swap // store in_total#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,tmp%2#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,tmp%2#0 out_total = in_amount * FACTOR * out_supply amm/contract.py:355 - frame_dig -1 // load out_supply#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,tmp%2#0,out_supply#0 out_total = in_amount * FACTOR * out_supply amm/contract.py:355 - * // (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,{*} in_amount * FACTOR * out_supply amm/contract.py:355 - // virtual: store out_total#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,out_total#0 out_total = in_amount * FACTOR * out_supply amm/contract.py:355 - // virtual: load out_total#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,out_total#0 out_total // in_total amm/contract.py:356 - swap // load in_total#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | out_total#0,in_total#0 out_total // in_total amm/contract.py:356 - / // (𝕡) in_amount#0,in_supply#0,out_supply#0 | {/} out_total // in_total amm/contract.py:356 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%4#0 out_total // in_total amm/contract.py:356 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%4#0 return out_total // in_total amm/contract.py:356 - retsub // tmp%4#0 return out_total // in_total amm/contract.py:356 + cover 2 // store tmp%2#0 to l-stack (copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%2#0,tmp%1#0,tmp%2#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 + + // (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%2#0,{+} SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 + swap // store in_total#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,tmp%2#0 in_total = SCALE * (in_supply - in_amount) + (in_amount * FACTOR) amm/contract.py:354 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,tmp%2#0 out_total = in_amount * FACTOR * out_supply amm/contract.py:355 + frame_dig -1 // load out_supply#0 from parameters (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,tmp%2#0,out_supply#0 out_total = in_amount * FACTOR * out_supply amm/contract.py:355 + * // (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,{*} in_amount * FACTOR * out_supply amm/contract.py:355 + // virtual: store out_total#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,out_total#0 out_total = in_amount * FACTOR * out_supply amm/contract.py:355 + // virtual: load out_total#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | in_total#0,out_total#0 out_total // in_total amm/contract.py:356 + swap // load in_total#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | out_total#0,in_total#0 out_total // in_total amm/contract.py:356 + / // (𝕡) in_amount#0,in_supply#0,out_supply#0 | {/} out_total // in_total amm/contract.py:356 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%4#0 out_total // in_total amm/contract.py:356 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) in_amount#0,in_supply#0,out_supply#0 | tmp%4#0 return out_total // in_total amm/contract.py:356 + retsub // tmp%4#0 return out_total // in_total amm/contract.py:356 // examples.amm.contract.ConstantProductAMM.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: amm/contract.py:28 + proto 0 0 // def __init__(self) -> None: amm/contract.py:28 __init___block@0: - byte "asset_a" // "asset_a" # The asset id of asset A\nself.asset_a amm/contract.py:32-33 - int 0 // "asset_a",0 et A\nself.asset_a = Asset(0 amm/contract.py:32-33 - app_global_put // # The asset id of asset A\nself.asset_a = Asset(0) amm/contract.py:32-33 - byte "asset_b" // "asset_b" # The asset id of asset B\nself.asset_b amm/contract.py:34-35 - int 0 // "asset_b",0 et B\nself.asset_b = Asset(0 amm/contract.py:34-35 - app_global_put // # The asset id of asset B\nself.asset_b = Asset(0) amm/contract.py:34-35 - txn Sender // {txn} vernor of this contract, allowed to do admin type actions\nself.governor = Txn.sender amm/contract.py:36-37 - // virtual: store new_state_value%0#0 to l-stack (no copy) new_state_value%0#0 vernor of this contract, allowed to do admin type actions\nself.governor = Txn.sender amm/contract.py:36-37 - byte "governor" // new_state_value%0#0,"governor" # The current governor of this contract, allowed to do admin type actions\nself.governor amm/contract.py:36-37 - swap // load new_state_value%0#0 from l-stack (no copy) "governor",new_state_value%0#0 # The current governor of this contract, allowed to do admin type actions\nself.governor = Txn.se... amm/contract.py:36-37 - app_global_put // # The current governor of this contract, allowed to do admin type actions\nself.governor = Txn.se... amm/contract.py:36-37 - byte "pool_token" // "pool_token" # The asset id of the Pool Token, used to track share of pool the holder may recover\nself.pool_t... amm/contract.py:38-39 - int 0 // "pool_token",0 ol Token, used to track share of pool the holder may recover\nself.pool_token = Asset(0 amm/contract.py:38-39 - app_global_put // # The asset id of the Pool Token, used to track share of pool the holder may recover\nself.pool_t... amm/contract.py:38-39 - byte "ratio" // "ratio" # The ratio between assets (A*Scale/B)\nself.ratio amm/contract.py:40-41 - int 0 // "ratio",0 assets (A*Scale/B)\nself.ratio = UInt64(0 amm/contract.py:40-41 - app_global_put // # The ratio between assets (A*Scale/B)\nself.ratio = UInt64(0) amm/contract.py:40-41 + byte "asset_a" // "asset_a" # The asset id of asset A\nself.asset_a amm/contract.py:32-33 + int 0 // "asset_a",0 et A\nself.asset_a = Asset(0 amm/contract.py:32-33 + app_global_put // # The asset id of asset A\nself.asset_a = Asset(0) amm/contract.py:32-33 + byte "asset_b" // "asset_b" # The asset id of asset B\nself.asset_b amm/contract.py:34-35 + int 0 // "asset_b",0 et B\nself.asset_b = Asset(0 amm/contract.py:34-35 + app_global_put // # The asset id of asset B\nself.asset_b = Asset(0) amm/contract.py:34-35 + txn Sender // {txn} vernor of this contract, allowed to do admin type actions\nself.governor = Txn.sender amm/contract.py:36-37 + // virtual: store new_state_value%0#0 to l-stack (no copy) new_state_value%0#0 vernor of this contract, allowed to do admin type actions\nself.governor = Txn.sender amm/contract.py:36-37 + byte "governor" // new_state_value%0#0,"governor" # The current governor of this contract, allowed to do admin type actions\nself.governor amm/contract.py:36-37 + swap // load new_state_value%0#0 from l-stack (no copy) "governor",new_state_value%0#0 # The current governor of this contract, allowed to do admin type actions\nself.governor = Txn.se... amm/contract.py:36-37 + app_global_put // # The current governor of this contract, allowed to do admin type actions\nself.governor = Txn.se... amm/contract.py:36-37 + byte "pool_token" // "pool_token" # The asset id of the Pool Token, used to track share of pool the holder may recover\nself.pool_t... amm/contract.py:38-39 + int 0 // "pool_token",0 ol Token, used to track share of pool the holder may recover\nself.pool_token = Asset(0 amm/contract.py:38-39 + app_global_put // # The asset id of the Pool Token, used to track share of pool the holder may recover\nself.pool_t... amm/contract.py:38-39 + byte "ratio" // "ratio" # The ratio between assets (A*Scale/B)\nself.ratio amm/contract.py:40-41 + int 0 // "ratio",0 assets (A*Scale/B)\nself.ratio = UInt64(0 amm/contract.py:40-41 + app_global_put // # The ratio between assets (A*Scale/B)\nself.ratio = UInt64(0) amm/contract.py:40-41 retsub // diff --git a/examples/amm/out/ConstantProductAMM.destructured.ir b/examples/amm/out/ConstantProductAMM.destructured.ir index 35b514a1d9..0f6c9ea9fa 100644 --- a/examples/amm/out/ConstantProductAMM.destructured.ir +++ b/examples/amm/out/ConstantProductAMM.destructured.ir @@ -131,17 +131,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_is_governor() -> void: block@0: // L264 let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check governor exists - let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) + let (governor_value%1#0: bytes, governor_exists%2#0: uint64) = (app_global_get_ex 0u "governor") + (assert governor_exists%2#0) // check governor exists + let tmp%3#0: uint64 = (== tmp%0#0 governor_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (! pool_token_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() let tmp%3#0: uint64 = (global GroupSize) @@ -160,29 +160,29 @@ contract examples.amm.contract.ConstantProductAMM: (app_global_put "asset_b" b_asset#0) let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check asset_a exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check asset_b exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check pool_token exists - let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) + let (asset_a_value%12#0: uint64, asset_a_exists%13#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%13#0) // check asset_a exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_a_value%12#0) + let (asset_b_value%14#0: uint64, asset_b_exists%15#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%15#0) // check asset_b exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_b_value%14#0) + let (pool_token_value%16#0: uint64, pool_token_exists%17#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%17#0) // check pool_token exists + let val_as_bytes%18#0: bytes = (itob pool_token_value%16#0) return val_as_bytes%18#0 subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) + let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%5#0) // check asset_a exists + let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) + let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%11#0) // check asset_b exists + let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) let inner_txn_params%1%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) @@ -219,17 +219,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.mint(a_xfer: uint64, b_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) let tmp%10#0: bytes = (txn Sender) @@ -244,9 +244,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%17#0: uint64 = (== tmp%15#0 tmp%16#0) (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) - let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check asset_a exists - let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) + let (asset_a_value%19#0: uint64, asset_a_exists%20#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%20#0) // check asset_a exists + let tmp%21#0: uint64 = (== tmp%18#0 asset_a_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) let tmp%23#0: uint64 = (> tmp%22#0 0u) @@ -256,9 +256,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%26#0: uint64 = (== tmp%24#0 tmp%25#0) (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check asset_b exists - let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) + let (asset_b_value%28#0: uint64, asset_b_exists%29#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%29#0) // check asset_b exists + let tmp%30#0: uint64 = (== tmp%27#0 asset_b_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) let tmp%32#0: uint64 = (> tmp%31#0 0u) @@ -270,43 +270,43 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%38#0: uint64 = (> to_mint#0 0u) (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) - let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check pool_token exists - examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) + let (pool_token_value%40#0: uint64, pool_token_exists%41#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%41#0) // check pool_token exists + examples.amm.contract.do_asset_transfer(tmp%39#0, pool_token_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + (assert pool_token_value%0#0) // bootstrap method needs to be called first return subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%4#0) // check pool_token exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -363,17 +363,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.burn(pool_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) let tmp%10#0: bytes = (global CurrentApplicationAddress) @@ -383,9 +383,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%13#0: uint64 = (> tmp%12#0 0u) (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) - let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check pool_token exists - let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) + let (pool_token_value%15#0: uint64, pool_token_exists%16#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%16#0) // check pool_token exists + let tmp%17#0: uint64 = (== tmp%14#0 pool_token_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) let tmp%19#0: bytes = (txn Sender) @@ -397,13 +397,13 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%23#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%12#0) let tmp%25#0: bytes = (txn Sender) - let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check asset_a exists - examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) + let (asset_a_value%26#0: uint64, asset_a_exists%27#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%27#0) // check asset_a exists + examples.amm.contract.do_asset_transfer(tmp%25#0, asset_a_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) - let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check asset_b exists - examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) + let (asset_b_value%29#0: uint64, asset_b_exists%30#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%30#0) // check asset_b exists + examples.amm.contract.do_asset_transfer(tmp%28#0, asset_b_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -418,13 +418,13 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.swap(swap_xfer: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check asset_a exists - let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) + let (asset_a_value%0#0: uint64, asset_a_exists%1#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%1#0) // check asset_a exists + let tmp%2#0: uint64 = (== a_asset#0 asset_a_value%0#0) (assert tmp%2#0) // asset a incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let tmp%5#0: uint64 = (== b_asset#0 asset_b_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) let tmp%7#0: uint64 = (> tmp%6#0 0u) @@ -433,23 +433,23 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%9#0: bytes = (txn Sender) let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check asset_a exists - let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check asset_b exists + let (asset_a_value%11#0: uint64, asset_a_exists%12#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%12#0) // check asset_a exists + let (asset_b_value%13#0: uint64, asset_b_exists%14#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) - switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => fail // asset id incorrect} + switch awst_tmp%15#0 {asset_a_value%11#0 => block@1, asset_b_value%13#0 => block@2, * => fail // asset id incorrect} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() - let (out_asset#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check asset_a exists + let (out_asset#0: uint64, asset_a_exists%17#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%17#0) // check asset_a exists goto block@4 block@2: // switch_case_1_L239 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() - let (out_asset#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check asset_b exists + let (out_asset#0: uint64, asset_b_exists%19#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%19#0) // check asset_b exists goto block@4 block@4: // switch_case_next_L233 let to_swap#0: uint64 = examples.amm.contract.tokens_to_swap(tmp%6#0, in_supply#0, out_supply#0) diff --git a/examples/amm/out/ConstantProductAMM.ssa.ir b/examples/amm/out/ConstantProductAMM.ssa.ir index 0554d87f4a..7c892813e4 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.ir @@ -144,17 +144,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_is_governor() -> void: block@0: // L264 let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check governor exists - let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) + let (governor_value%1#0: bytes, governor_exists%2#0: uint64) = (app_global_get_ex 0u "governor") + (assert governor_exists%2#0) // check governor exists + let tmp%3#0: uint64 = (== tmp%0#0 governor_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (! pool_token_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() let tmp%3#0: uint64 = (global GroupSize) @@ -173,15 +173,15 @@ contract examples.amm.contract.ConstantProductAMM: (app_global_put "asset_b" b_asset#0) let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check asset_a exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check asset_b exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check pool_token exists - let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) + let (asset_a_value%12#0: uint64, asset_a_exists%13#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%13#0) // check asset_a exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_a_value%12#0) + let (asset_b_value%14#0: uint64, asset_b_exists%15#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%15#0) // check asset_b exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_b_value%14#0) + let (pool_token_value%16#0: uint64, pool_token_exists%17#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%17#0) // check pool_token exists + let val_as_bytes%18#0: bytes = (itob pool_token_value%16#0) return val_as_bytes%18#0 subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: @@ -196,15 +196,15 @@ contract examples.amm.contract.ConstantProductAMM: let inner_txn_params%1%%Applications_length#0: uint64 = 0u let inner_txn_params%1%%AssetAmount_length#0: uint64 = 0u let inner_txn_params%1%%AssetCloseTo_length#0: uint64 = 0u - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) + let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%5#0) // check asset_a exists + let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) + let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%11#0) // check asset_b exists + let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) let inner_txn_params%1%%ConfigAssetName_length#0: uint64 = 1u @@ -471,17 +471,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.mint(a_xfer: uint64, b_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) let tmp%10#0: bytes = (txn Sender) @@ -496,9 +496,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%17#0: uint64 = (== tmp%15#0 tmp%16#0) (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) - let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check asset_a exists - let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) + let (asset_a_value%19#0: uint64, asset_a_exists%20#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%20#0) // check asset_a exists + let tmp%21#0: uint64 = (== tmp%18#0 asset_a_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) let tmp%23#0: uint64 = (> tmp%22#0 0u) @@ -508,9 +508,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%26#0: uint64 = (== tmp%24#0 tmp%25#0) (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check asset_b exists - let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) + let (asset_b_value%28#0: uint64, asset_b_exists%29#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%29#0) // check asset_b exists + let tmp%30#0: uint64 = (== tmp%27#0 asset_b_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) let tmp%32#0: uint64 = (> tmp%31#0 0u) @@ -524,43 +524,43 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%38#0: uint64 = (> to_mint#0 0u) (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) - let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check pool_token exists - examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) + let (pool_token_value%40#0: uint64, pool_token_exists%41#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%41#0) // check pool_token exists + examples.amm.contract.do_asset_transfer(tmp%39#0, pool_token_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + (assert pool_token_value%0#0) // bootstrap method needs to be called first return subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%4#0) // check pool_token exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -617,17 +617,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.burn(pool_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) let tmp%10#0: bytes = (global CurrentApplicationAddress) @@ -637,9 +637,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%13#0: uint64 = (> tmp%12#0 0u) (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) - let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check pool_token exists - let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) + let (pool_token_value%15#0: uint64, pool_token_exists%16#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%16#0) // check pool_token exists + let tmp%17#0: uint64 = (== tmp%14#0 pool_token_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) let tmp%19#0: bytes = (txn Sender) @@ -653,13 +653,13 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%24#0: uint64 = ((gtxns AssetAmount) pool_xfer#0) let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%24#0) let tmp%25#0: bytes = (txn Sender) - let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check asset_a exists - examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) + let (asset_a_value%26#0: uint64, asset_a_exists%27#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%27#0) // check asset_a exists + examples.amm.contract.do_asset_transfer(tmp%25#0, asset_a_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) - let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check asset_b exists - examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) + let (asset_b_value%29#0: uint64, asset_b_exists%30#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%30#0) // check asset_b exists + examples.amm.contract.do_asset_transfer(tmp%28#0, asset_b_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -674,13 +674,13 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.swap(swap_xfer: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check asset_a exists - let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) + let (asset_a_value%0#0: uint64, asset_a_exists%1#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%1#0) // check asset_a exists + let tmp%2#0: uint64 = (== a_asset#0 asset_a_value%0#0) (assert tmp%2#0) // asset a incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let tmp%5#0: uint64 = (== b_asset#0 asset_b_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) let tmp%7#0: uint64 = (> tmp%6#0 0u) @@ -689,25 +689,25 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%9#0: bytes = (txn Sender) let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check asset_a exists - let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check asset_b exists + let (asset_a_value%11#0: uint64, asset_a_exists%12#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%12#0) // check asset_a exists + let (asset_b_value%13#0: uint64, asset_b_exists%14#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) - switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => block@3} + switch awst_tmp%15#0 {asset_a_value%11#0 => block@1, asset_b_value%13#0 => block@2, * => block@3} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check asset_a exists - let out_asset#0: uint64 = app_global_get_ex_value%16#0 + let (asset_a_value%16#0: uint64, asset_a_exists%17#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%17#0) // check asset_a exists + let out_asset#0: uint64 = asset_a_value%16#0 goto block@4 block@2: // switch_case_1_L239 let in_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() - let (app_global_get_ex_value%18#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check asset_b exists - let out_asset#1: uint64 = app_global_get_ex_value%18#0 + let (asset_b_value%18#0: uint64, asset_b_exists%19#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%19#0) // check asset_b exists + let out_asset#1: uint64 = asset_b_value%18#0 goto block@4 block@3: // switch_case_default_L233 fail // asset id incorrect diff --git a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir index a1487bceae..2d735b56b3 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir @@ -131,17 +131,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_is_governor() -> void: block@0: // L264 let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check governor exists - let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) + let (governor_value%1#0: bytes, governor_exists%2#0: uint64) = (app_global_get_ex 0u "governor") + (assert governor_exists%2#0) // check governor exists + let tmp%3#0: uint64 = (== tmp%0#0 governor_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (! pool_token_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() let tmp%3#0: uint64 = (global GroupSize) @@ -160,29 +160,29 @@ contract examples.amm.contract.ConstantProductAMM: (app_global_put "asset_b" b_asset#0) let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check asset_a exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check asset_b exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check pool_token exists - let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) + let (asset_a_value%12#0: uint64, asset_a_exists%13#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%13#0) // check asset_a exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_a_value%12#0) + let (asset_b_value%14#0: uint64, asset_b_exists%15#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%15#0) // check asset_b exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_b_value%14#0) + let (pool_token_value%16#0: uint64, pool_token_exists%17#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%17#0) // check pool_token exists + let val_as_bytes%18#0: bytes = (itob pool_token_value%16#0) return val_as_bytes%18#0 subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) + let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%5#0) // check asset_a exists + let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) + let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%11#0) // check asset_b exists + let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) let inner_txn_params%1%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) @@ -219,17 +219,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.mint(a_xfer: uint64, b_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) let tmp%10#0: bytes = (txn Sender) @@ -244,9 +244,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%17#0: uint64 = (== tmp%15#0 tmp%16#0) (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) - let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check asset_a exists - let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) + let (asset_a_value%19#0: uint64, asset_a_exists%20#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%20#0) // check asset_a exists + let tmp%21#0: uint64 = (== tmp%18#0 asset_a_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) let tmp%23#0: uint64 = (> tmp%22#0 0u) @@ -256,9 +256,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%26#0: uint64 = (== tmp%24#0 tmp%25#0) (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check asset_b exists - let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) + let (asset_b_value%28#0: uint64, asset_b_exists%29#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%29#0) // check asset_b exists + let tmp%30#0: uint64 = (== tmp%27#0 asset_b_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) let tmp%32#0: uint64 = (> tmp%31#0 0u) @@ -270,43 +270,43 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%38#0: uint64 = (> to_mint#0 0u) (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) - let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check pool_token exists - examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) + let (pool_token_value%40#0: uint64, pool_token_exists%41#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%41#0) // check pool_token exists + examples.amm.contract.do_asset_transfer(tmp%39#0, pool_token_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + (assert pool_token_value%0#0) // bootstrap method needs to be called first return subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%4#0) // check pool_token exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -362,17 +362,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.burn(pool_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) let tmp%10#0: bytes = (global CurrentApplicationAddress) @@ -382,9 +382,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%13#0: uint64 = (> tmp%12#0 0u) (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) - let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check pool_token exists - let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) + let (pool_token_value%15#0: uint64, pool_token_exists%16#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%16#0) // check pool_token exists + let tmp%17#0: uint64 = (== tmp%14#0 pool_token_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) let tmp%19#0: bytes = (txn Sender) @@ -396,13 +396,13 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%23#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%12#0) let tmp%25#0: bytes = (txn Sender) - let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check asset_a exists - examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) + let (asset_a_value%26#0: uint64, asset_a_exists%27#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%27#0) // check asset_a exists + examples.amm.contract.do_asset_transfer(tmp%25#0, asset_a_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) - let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check asset_b exists - examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) + let (asset_b_value%29#0: uint64, asset_b_exists%30#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%30#0) // check asset_b exists + examples.amm.contract.do_asset_transfer(tmp%28#0, asset_b_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -417,13 +417,13 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.swap(swap_xfer: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check asset_a exists - let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) + let (asset_a_value%0#0: uint64, asset_a_exists%1#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%1#0) // check asset_a exists + let tmp%2#0: uint64 = (== a_asset#0 asset_a_value%0#0) (assert tmp%2#0) // asset a incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let tmp%5#0: uint64 = (== b_asset#0 asset_b_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) let tmp%7#0: uint64 = (> tmp%6#0 0u) @@ -432,23 +432,23 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%9#0: bytes = (txn Sender) let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check asset_a exists - let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check asset_b exists + let (asset_a_value%11#0: uint64, asset_a_exists%12#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%12#0) // check asset_a exists + let (asset_b_value%13#0: uint64, asset_b_exists%14#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) - switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => fail // asset id incorrect} + switch awst_tmp%15#0 {asset_a_value%11#0 => block@1, asset_b_value%13#0 => block@2, * => fail // asset id incorrect} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() - let (out_asset#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check asset_a exists + let (out_asset#0: uint64, asset_a_exists%17#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%17#0) // check asset_a exists goto block@4 block@2: // switch_case_1_L239 let in_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#1: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() - let (out_asset#1: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check asset_b exists + let (out_asset#1: uint64, asset_b_exists%19#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%19#0) // check asset_b exists goto block@4 block@4: // switch_case_next_L233 let in_supply#2: uint64 = φ(in_supply#0 <- block@1, in_supply#1 <- block@2) diff --git a/examples/amm/out_O2/ConstantProductAMM.destructured.ir b/examples/amm/out_O2/ConstantProductAMM.destructured.ir index 35b514a1d9..0f6c9ea9fa 100644 --- a/examples/amm/out_O2/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_O2/ConstantProductAMM.destructured.ir @@ -131,17 +131,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_is_governor() -> void: block@0: // L264 let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check governor exists - let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) + let (governor_value%1#0: bytes, governor_exists%2#0: uint64) = (app_global_get_ex 0u "governor") + (assert governor_exists%2#0) // check governor exists + let tmp%3#0: uint64 = (== tmp%0#0 governor_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (! pool_token_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() let tmp%3#0: uint64 = (global GroupSize) @@ -160,29 +160,29 @@ contract examples.amm.contract.ConstantProductAMM: (app_global_put "asset_b" b_asset#0) let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check asset_a exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check asset_b exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check pool_token exists - let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) + let (asset_a_value%12#0: uint64, asset_a_exists%13#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%13#0) // check asset_a exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_a_value%12#0) + let (asset_b_value%14#0: uint64, asset_b_exists%15#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%15#0) // check asset_b exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_b_value%14#0) + let (pool_token_value%16#0: uint64, pool_token_exists%17#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%17#0) // check pool_token exists + let val_as_bytes%18#0: bytes = (itob pool_token_value%16#0) return val_as_bytes%18#0 subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) + let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%5#0) // check asset_a exists + let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) + let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%11#0) // check asset_b exists + let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) let inner_txn_params%1%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) @@ -219,17 +219,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.mint(a_xfer: uint64, b_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) let tmp%10#0: bytes = (txn Sender) @@ -244,9 +244,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%17#0: uint64 = (== tmp%15#0 tmp%16#0) (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) - let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check asset_a exists - let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) + let (asset_a_value%19#0: uint64, asset_a_exists%20#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%20#0) // check asset_a exists + let tmp%21#0: uint64 = (== tmp%18#0 asset_a_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) let tmp%23#0: uint64 = (> tmp%22#0 0u) @@ -256,9 +256,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%26#0: uint64 = (== tmp%24#0 tmp%25#0) (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check asset_b exists - let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) + let (asset_b_value%28#0: uint64, asset_b_exists%29#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%29#0) // check asset_b exists + let tmp%30#0: uint64 = (== tmp%27#0 asset_b_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) let tmp%32#0: uint64 = (> tmp%31#0 0u) @@ -270,43 +270,43 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%38#0: uint64 = (> to_mint#0 0u) (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) - let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check pool_token exists - examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) + let (pool_token_value%40#0: uint64, pool_token_exists%41#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%41#0) // check pool_token exists + examples.amm.contract.do_asset_transfer(tmp%39#0, pool_token_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + (assert pool_token_value%0#0) // bootstrap method needs to be called first return subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%4#0) // check pool_token exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -363,17 +363,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.burn(pool_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) let tmp%10#0: bytes = (global CurrentApplicationAddress) @@ -383,9 +383,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%13#0: uint64 = (> tmp%12#0 0u) (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) - let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check pool_token exists - let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) + let (pool_token_value%15#0: uint64, pool_token_exists%16#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%16#0) // check pool_token exists + let tmp%17#0: uint64 = (== tmp%14#0 pool_token_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) let tmp%19#0: bytes = (txn Sender) @@ -397,13 +397,13 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%23#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%12#0) let tmp%25#0: bytes = (txn Sender) - let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check asset_a exists - examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) + let (asset_a_value%26#0: uint64, asset_a_exists%27#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%27#0) // check asset_a exists + examples.amm.contract.do_asset_transfer(tmp%25#0, asset_a_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) - let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check asset_b exists - examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) + let (asset_b_value%29#0: uint64, asset_b_exists%30#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%30#0) // check asset_b exists + examples.amm.contract.do_asset_transfer(tmp%28#0, asset_b_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -418,13 +418,13 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.swap(swap_xfer: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check asset_a exists - let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) + let (asset_a_value%0#0: uint64, asset_a_exists%1#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%1#0) // check asset_a exists + let tmp%2#0: uint64 = (== a_asset#0 asset_a_value%0#0) (assert tmp%2#0) // asset a incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let tmp%5#0: uint64 = (== b_asset#0 asset_b_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) let tmp%7#0: uint64 = (> tmp%6#0 0u) @@ -433,23 +433,23 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%9#0: bytes = (txn Sender) let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check asset_a exists - let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check asset_b exists + let (asset_a_value%11#0: uint64, asset_a_exists%12#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%12#0) // check asset_a exists + let (asset_b_value%13#0: uint64, asset_b_exists%14#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) - switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => fail // asset id incorrect} + switch awst_tmp%15#0 {asset_a_value%11#0 => block@1, asset_b_value%13#0 => block@2, * => fail // asset id incorrect} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() - let (out_asset#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check asset_a exists + let (out_asset#0: uint64, asset_a_exists%17#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%17#0) // check asset_a exists goto block@4 block@2: // switch_case_1_L239 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() - let (out_asset#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check asset_b exists + let (out_asset#0: uint64, asset_b_exists%19#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%19#0) // check asset_b exists goto block@4 block@4: // switch_case_next_L233 let to_swap#0: uint64 = examples.amm.contract.tokens_to_swap(tmp%6#0, in_supply#0, out_supply#0) diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir index 325d263d09..92cedd2bf1 100644 --- a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir @@ -149,17 +149,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._check_is_governor() -> void: block@0: // L264 let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "governor") - (assert app_global_get_ex_did_exist%2#0) // check governor exists - let tmp%3#0: uint64 = (== tmp%0#0 app_global_get_ex_value%1#0) + let (governor_value%1#0: bytes, governor_exists%2#0: uint64) = (app_global_get_ex 0u "governor") + (assert governor_exists%2#0) // check governor exists + let tmp%3#0: uint64 = (== tmp%0#0 governor_value%1#0) (assert tmp%3#0) // Only the account set in global_state.governor may call this method return subroutine examples.amm.contract.ConstantProductAMM.bootstrap(seed: uint64, a_asset: uint64, b_asset: uint64) -> bytes: block@0: // L49 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (! pool_token_value%0#0) (assert tmp%2#0) // application has already been bootstrapped examples.amm.contract.ConstantProductAMM._check_is_governor() let tmp%3#0: uint64 = (global GroupSize) @@ -178,29 +178,29 @@ contract examples.amm.contract.ConstantProductAMM: (app_global_put "asset_b" b_asset#0) let new_state_value%11#0: uint64 = examples.amm.contract.ConstantProductAMM._create_pool_token() (app_global_put "pool_token" new_state_value%11#0) - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%13#0) // check asset_a exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%12#0) - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%15#0) // check asset_b exists - examples.amm.contract.ConstantProductAMM._do_opt_in(app_global_get_ex_value%14#0) - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%17#0) // check pool_token exists - let val_as_bytes%18#0: bytes = (itob app_global_get_ex_value%16#0) + let (asset_a_value%12#0: uint64, asset_a_exists%13#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%13#0) // check asset_a exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_a_value%12#0) + let (asset_b_value%14#0: uint64, asset_b_exists%15#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%15#0) // check asset_b exists + examples.amm.contract.ConstantProductAMM._do_opt_in(asset_b_value%14#0) + let (pool_token_value%16#0: uint64, pool_token_exists%17#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%17#0) // check pool_token exists + let val_as_bytes%18#0: bytes = (itob pool_token_value%16#0) return val_as_bytes%18#0 subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%4#0) + let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%5#0) // check asset_a exists + let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) (assert maybe_value_did_exist%3#0) // asset exists let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (app_global_get_ex_value%10#0: uint64, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) app_global_get_ex_value%10#0) + let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%11#0) // check asset_b exists + let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) (assert maybe_value_did_exist%9#0) // asset exists let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) let inner_txn_params%1%%param_ConfigAssetDecimals_idx_0#0: uint64 = 3u @@ -251,17 +251,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.mint(a_xfer: uint64, b_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L83 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns Sender) a_xfer#0) let tmp%10#0: bytes = (txn Sender) @@ -276,9 +276,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%17#0: uint64 = (== tmp%15#0 tmp%16#0) (assert tmp%17#0) // receiver not app address let tmp%18#0: uint64 = ((gtxns XferAsset) a_xfer#0) - let (app_global_get_ex_value%19#0: uint64, app_global_get_ex_did_exist%20#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%20#0) // check asset_a exists - let tmp%21#0: uint64 = (== tmp%18#0 app_global_get_ex_value%19#0) + let (asset_a_value%19#0: uint64, asset_a_exists%20#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%20#0) // check asset_a exists + let tmp%21#0: uint64 = (== tmp%18#0 asset_a_value%19#0) (assert tmp%21#0) // asset a incorrect let tmp%22#0: uint64 = ((gtxns AssetAmount) a_xfer#0) let tmp%23#0: uint64 = (> tmp%22#0 0u) @@ -288,9 +288,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%26#0: uint64 = (== tmp%24#0 tmp%25#0) (assert tmp%26#0) // receiver not app address let tmp%27#0: uint64 = ((gtxns XferAsset) b_xfer#0) - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%29#0) // check asset_b exists - let tmp%30#0: uint64 = (== tmp%27#0 app_global_get_ex_value%28#0) + let (asset_b_value%28#0: uint64, asset_b_exists%29#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%29#0) // check asset_b exists + let tmp%30#0: uint64 = (== tmp%27#0 asset_b_value%28#0) (assert tmp%30#0) // asset b incorrect let tmp%31#0: uint64 = ((gtxns AssetAmount) b_xfer#0) let tmp%32#0: uint64 = (> tmp%31#0 0u) @@ -304,43 +304,43 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%38#0: uint64 = (> to_mint#0 0u) (assert tmp%38#0) // send amount too low let tmp%39#0: bytes = (txn Sender) - let (app_global_get_ex_value%40#0: uint64, app_global_get_ex_did_exist%41#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%41#0) // check pool_token exists - examples.amm.contract.do_asset_transfer(tmp%39#0, app_global_get_ex_value%40#0, to_mint#0) + let (pool_token_value%40#0: uint64, pool_token_exists%41#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%41#0) // check pool_token exists + examples.amm.contract.do_asset_transfer(tmp%39#0, pool_token_value%40#0, to_mint#0) examples.amm.contract.ConstantProductAMM._update_ratio() return subroutine examples.amm.contract.ConstantProductAMM._check_bootstrapped() -> void: block@0: // L253 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - (assert app_global_get_ex_value%0#0) // bootstrap method needs to be called first + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + (assert pool_token_value%0#0) // bootstrap method needs to be called first return subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%4#0) // check pool_token exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) (assert maybe_value_did_exist%1#0) // account opted into asset return maybe_value%0#0 @@ -396,17 +396,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.burn(pool_xfer: uint64, pool_asset: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L149 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%1#0) // check pool_token exists - let tmp%2#0: uint64 = (== pool_asset#0 app_global_get_ex_value%0#0) + let (pool_token_value%0#0: uint64, pool_token_exists%1#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%1#0) // check pool_token exists + let tmp%2#0: uint64 = (== pool_asset#0 pool_token_value%0#0) (assert tmp%2#0) // asset pool incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%4#0) // check asset_a exists - let tmp%5#0: uint64 = (== a_asset#0 app_global_get_ex_value%3#0) + let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%4#0) // check asset_a exists + let tmp%5#0: uint64 = (== a_asset#0 asset_a_value%3#0) (assert tmp%5#0) // asset a incorrect - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%7#0) // check asset_b exists - let tmp%8#0: uint64 = (== b_asset#0 app_global_get_ex_value%6#0) + let (asset_b_value%6#0: uint64, asset_b_exists%7#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%7#0) // check asset_b exists + let tmp%8#0: uint64 = (== b_asset#0 asset_b_value%6#0) (assert tmp%8#0) // asset b incorrect let tmp%9#0: bytes = ((gtxns AssetReceiver) pool_xfer#0) let tmp%10#0: bytes = (global CurrentApplicationAddress) @@ -416,9 +416,9 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%13#0: uint64 = (> tmp%12#0 0u) (assert tmp%13#0) // amount minimum not met let tmp%14#0: uint64 = ((gtxns XferAsset) pool_xfer#0) - let (app_global_get_ex_value%15#0: uint64, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert app_global_get_ex_did_exist%16#0) // check pool_token exists - let tmp%17#0: uint64 = (== tmp%14#0 app_global_get_ex_value%15#0) + let (pool_token_value%15#0: uint64, pool_token_exists%16#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%16#0) // check pool_token exists + let tmp%17#0: uint64 = (== tmp%14#0 pool_token_value%15#0) (assert tmp%17#0) // asset pool incorrect let tmp%18#0: bytes = ((gtxns Sender) pool_xfer#0) let tmp%19#0: bytes = (txn Sender) @@ -432,13 +432,13 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%24#0: uint64 = ((gtxns AssetAmount) pool_xfer#0) let b_amt#0: uint64 = examples.amm.contract.tokens_to_burn(pool_balance#0, tmp%23#0, tmp%24#0) let tmp%25#0: bytes = (txn Sender) - let (app_global_get_ex_value%26#0: uint64, app_global_get_ex_did_exist%27#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%27#0) // check asset_a exists - examples.amm.contract.do_asset_transfer(tmp%25#0, app_global_get_ex_value%26#0, a_amt#0) + let (asset_a_value%26#0: uint64, asset_a_exists%27#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%27#0) // check asset_a exists + examples.amm.contract.do_asset_transfer(tmp%25#0, asset_a_value%26#0, a_amt#0) let tmp%28#0: bytes = (txn Sender) - let (app_global_get_ex_value%29#0: uint64, app_global_get_ex_did_exist%30#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%30#0) // check asset_b exists - examples.amm.contract.do_asset_transfer(tmp%28#0, app_global_get_ex_value%29#0, b_amt#0) + let (asset_b_value%29#0: uint64, asset_b_exists%30#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%30#0) // check asset_b exists + examples.amm.contract.do_asset_transfer(tmp%28#0, asset_b_value%29#0, b_amt#0) examples.amm.contract.ConstantProductAMM._update_ratio() return @@ -453,13 +453,13 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM.swap(swap_xfer: uint64, a_asset: uint64, b_asset: uint64) -> void: block@0: // L206 examples.amm.contract.ConstantProductAMM._check_bootstrapped() - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%1#0) // check asset_a exists - let tmp%2#0: uint64 = (== a_asset#0 app_global_get_ex_value%0#0) + let (asset_a_value%0#0: uint64, asset_a_exists%1#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%1#0) // check asset_a exists + let tmp%2#0: uint64 = (== a_asset#0 asset_a_value%0#0) (assert tmp%2#0) // asset a incorrect - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%4#0) // check asset_b exists - let tmp%5#0: uint64 = (== b_asset#0 app_global_get_ex_value%3#0) + let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%4#0) // check asset_b exists + let tmp%5#0: uint64 = (== b_asset#0 asset_b_value%3#0) (assert tmp%5#0) // asset b incorrect let tmp%6#0: uint64 = ((gtxns AssetAmount) swap_xfer#0) let tmp%7#0: uint64 = (> tmp%6#0 0u) @@ -468,25 +468,25 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%9#0: bytes = (txn Sender) let tmp%10#0: uint64 = (== tmp%8#0 tmp%9#0) (assert tmp%10#0) // sender invalid - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%12#0) // check asset_a exists - let (app_global_get_ex_value%13#0: uint64, app_global_get_ex_did_exist%14#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%14#0) // check asset_b exists + let (asset_a_value%11#0: uint64, asset_a_exists%12#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%12#0) // check asset_a exists + let (asset_b_value%13#0: uint64, asset_b_exists%14#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%14#0) // check asset_b exists let awst_tmp%15#0: uint64 = ((gtxns XferAsset) swap_xfer#0) - switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => block@3} + switch awst_tmp%15#0 {asset_a_value%11#0 => block@1, asset_b_value%13#0 => block@2, * => block@3} block@1: // switch_case_0_L235 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert app_global_get_ex_did_exist%17#0) // check asset_a exists - let out_asset#0: uint64 = app_global_get_ex_value%16#0 + let (asset_a_value%16#0: uint64, asset_a_exists%17#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%17#0) // check asset_a exists + let out_asset#0: uint64 = asset_a_value%16#0 goto block@4 block@2: // switch_case_1_L239 let in_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_a_balance() let out_supply#0: uint64 = examples.amm.contract.ConstantProductAMM._current_b_balance() - let (app_global_get_ex_value%18#0: uint64, app_global_get_ex_did_exist%19#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert app_global_get_ex_did_exist%19#0) // check asset_b exists - let out_asset#0: uint64 = app_global_get_ex_value%18#0 + let (asset_b_value%18#0: uint64, asset_b_exists%19#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%19#0) // check asset_b exists + let out_asset#0: uint64 = asset_b_value%18#0 goto block@4 block@3: // switch_case_default_L233 fail // asset id incorrect diff --git a/examples/amm/puya.log b/examples/amm/puya.log index 836ff1bf14..161cfc942d 100644 --- a/examples/amm/puya.log +++ b/examples/amm/puya.log @@ -948,14 +948,14 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: app_global_get_ex_value%16#0, out_asset#0 -debug: Replacing {app_global_get_ex_value%16#0} with out_asset#0 made 1 modifications -debug: Found equivalence set: app_global_get_ex_value%18#0, out_asset#1 -debug: Replacing {app_global_get_ex_value%18#0} with out_asset#1 made 1 modifications +debug: Found equivalence set: asset_a_value%16#0, out_asset#0 +debug: Replacing {asset_a_value%16#0} with out_asset#0 made 1 modifications +debug: Found equivalence set: asset_b_value%18#0, out_asset#1 +debug: Replacing {asset_b_value%18#0} with out_asset#1 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops -debug: simplified terminator of block@0: // L206 from switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => block@3} to switch awst_tmp%15#0 {app_global_get_ex_value%11#0 => block@1, app_global_get_ex_value%13#0 => block@2, * => fail // asset id incorrect} +debug: simplified terminator of block@0: // L206 from switch awst_tmp%15#0 {asset_a_value%11#0 => block@1, asset_b_value%13#0 => block@2, * => block@3} to switch awst_tmp%15#0 {asset_a_value%11#0 => block@1, asset_b_value%13#0 => block@2, * => fail // asset id incorrect} debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks @@ -1502,10 +1502,10 @@ debug: Replaced main_bare_routing@11.ops[16]: 'load tmp%82#0' with 'load tmp%82# debug: Found 3 edge set/s for examples.amm.contract.ConstantProductAMM.approval_program debug: Inserted _check_is_governor_block@0.ops[12]: 'store tmp%3#0 to l-stack (copy)' debug: Replaced _check_is_governor_block@0.ops[14]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted _check_is_governor_block@0.ops[5]: 'store app_global_get_ex_did_exist%2#0 to l-stack (copy)' -debug: Replaced _check_is_governor_block@0.ops[8]: 'load app_global_get_ex_did_exist%2#0' with 'load app_global_get_ex_did_exist%2#0 from l-stack (no copy)' -debug: Inserted _check_is_governor_block@0.ops[7]: 'store app_global_get_ex_value%1#0 to l-stack (copy)' -debug: Replaced _check_is_governor_block@0.ops[12]: 'load app_global_get_ex_value%1#0' with 'load app_global_get_ex_value%1#0 from l-stack (no copy)' +debug: Inserted _check_is_governor_block@0.ops[5]: 'store governor_exists%2#0 to l-stack (copy)' +debug: Replaced _check_is_governor_block@0.ops[8]: 'load governor_exists%2#0' with 'load governor_exists%2#0 from l-stack (no copy)' +debug: Inserted _check_is_governor_block@0.ops[7]: 'store governor_value%1#0 to l-stack (copy)' +debug: Replaced _check_is_governor_block@0.ops[12]: 'load governor_value%1#0' with 'load governor_value%1#0 from l-stack (no copy)' debug: Inserted _check_is_governor_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced _check_is_governor_block@0.ops[12]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[9]: 'store tmp%2#0 to l-stack (copy)' @@ -1524,44 +1524,44 @@ debug: Inserted bootstrap_block@0.ops[50]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[52]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[92]: 'store val_as_bytes%18#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[94]: 'load val_as_bytes%18#0' with 'load val_as_bytes%18#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[3]: 'store pool_token_exists%1#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[6]: 'load pool_token_exists%1#0' with 'load pool_token_exists%1#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[29]: 'store tmp%6#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[32]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[63]: 'store new_state_value%11#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[66]: 'load new_state_value%11#0' with 'load new_state_value%11#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[71]: 'store app_global_get_ex_did_exist%13#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[74]: 'load app_global_get_ex_did_exist%13#0' with 'load app_global_get_ex_did_exist%13#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[81]: 'store app_global_get_ex_did_exist%15#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[84]: 'load app_global_get_ex_did_exist%15#0' with 'load app_global_get_ex_did_exist%15#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[91]: 'store app_global_get_ex_did_exist%17#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[94]: 'load app_global_get_ex_did_exist%17#0' with 'load app_global_get_ex_did_exist%17#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[71]: 'store asset_a_exists%13#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[74]: 'load asset_a_exists%13#0' with 'load asset_a_exists%13#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[81]: 'store asset_b_exists%15#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[84]: 'load asset_b_exists%15#0' with 'load asset_b_exists%15#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[91]: 'store pool_token_exists%17#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[94]: 'load pool_token_exists%17#0' with 'load pool_token_exists%17#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[5]: 'store pool_token_value%0#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[9]: 'load pool_token_value%0#0' with 'load pool_token_value%0#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[28]: 'store tmp%5#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[33]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[75]: 'store app_global_get_ex_value%12#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[79]: 'load app_global_get_ex_value%12#0' with 'load app_global_get_ex_value%12#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[86]: 'store app_global_get_ex_value%14#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[90]: 'load app_global_get_ex_value%14#0' with 'load app_global_get_ex_value%14#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[97]: 'store app_global_get_ex_value%16#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[101]: 'load app_global_get_ex_value%16#0' with 'load app_global_get_ex_value%16#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[75]: 'store asset_a_value%12#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[79]: 'load asset_a_value%12#0' with 'load asset_a_value%12#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[86]: 'store asset_b_value%14#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[90]: 'load asset_b_value%14#0' with 'load asset_b_value%14#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[97]: 'store pool_token_value%16#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[101]: 'load pool_token_value%16#0' with 'load pool_token_value%16#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[17]: 'store tmp%6#0 to l-stack (copy)' debug: Replaced _create_pool_token_block@0.ops[19]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[62]: 'store submit_result_0%0%%CreatedAssetID#0 to l-stack (copy)' debug: Replaced _create_pool_token_block@0.ops[64]: 'load submit_result_0%0%%CreatedAssetID#0' with 'load submit_result_0%0%%CreatedAssetID#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[4]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[7]: 'load app_global_get_ex_did_exist%5#0' with 'load app_global_get_ex_did_exist%5#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[4]: 'store asset_a_exists%5#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[7]: 'load asset_a_exists%5#0' with 'load asset_a_exists%5#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[11]: 'store maybe_value_did_exist%3#0 to l-stack (copy)' debug: Replaced _create_pool_token_block@0.ops[14]: 'load maybe_value_did_exist%3#0' with 'load maybe_value_did_exist%3#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[28]: 'store app_global_get_ex_did_exist%11#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[31]: 'load app_global_get_ex_did_exist%11#0' with 'load app_global_get_ex_did_exist%11#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[28]: 'store asset_b_exists%11#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[31]: 'load asset_b_exists%11#0' with 'load asset_b_exists%11#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[35]: 'store maybe_value_did_exist%9#0 to l-stack (copy)' debug: Replaced _create_pool_token_block@0.ops[38]: 'load maybe_value_did_exist%9#0' with 'load maybe_value_did_exist%9#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[6]: 'store app_global_get_ex_value%4#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[10]: 'load app_global_get_ex_value%4#0' with 'load app_global_get_ex_value%4#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[31]: 'store app_global_get_ex_value%10#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[35]: 'load app_global_get_ex_value%10#0' with 'load app_global_get_ex_value%10#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[6]: 'store asset_a_value%4#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[10]: 'load asset_a_value%4#0' with 'load asset_a_value%4#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[31]: 'store asset_b_value%10#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[35]: 'load asset_b_value%10#0' with 'load asset_b_value%10#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[14]: 'store maybe_value%2#0 to l-stack (copy)' debug: Replaced _create_pool_token_block@0.ops[19]: 'load maybe_value%2#0' with 'load maybe_value%2#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[40]: 'store maybe_value%8#0 to l-stack (copy)' @@ -1606,26 +1606,26 @@ debug: Inserted mint_block@0.ops[159]: 'store to_mint#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[161]: 'load to_mint#0' with 'load to_mint#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[164]: 'store tmp%38#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[166]: 'load tmp%38#0' with 'load tmp%38#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[4]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[7]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[19]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[22]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[34]: 'store app_global_get_ex_did_exist%7#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[37]: 'load app_global_get_ex_did_exist%7#0' with 'load app_global_get_ex_did_exist%7#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[4]: 'store pool_token_exists%1#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[7]: 'load pool_token_exists%1#0' with 'load pool_token_exists%1#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[19]: 'store asset_a_exists%4#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[22]: 'load asset_a_exists%4#0' with 'load asset_a_exists%4#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[34]: 'store asset_b_exists%7#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[37]: 'load asset_b_exists%7#0' with 'load asset_b_exists%7#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[50]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[53]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[63]: 'store tmp%13#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[66]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[76]: 'store tmp%16#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[79]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[91]: 'store app_global_get_ex_did_exist%20#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[94]: 'load app_global_get_ex_did_exist%20#0' with 'load app_global_get_ex_did_exist%20#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[91]: 'store asset_a_exists%20#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[94]: 'load asset_a_exists%20#0' with 'load asset_a_exists%20#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[118]: 'store tmp%25#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[121]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[133]: 'store app_global_get_ex_did_exist%29#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[136]: 'load app_global_get_ex_did_exist%29#0' with 'load app_global_get_ex_did_exist%29#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[182]: 'store app_global_get_ex_did_exist%41#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[185]: 'load app_global_get_ex_did_exist%41#0' with 'load app_global_get_ex_did_exist%41#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[133]: 'store asset_b_exists%29#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[136]: 'load asset_b_exists%29#0' with 'load asset_b_exists%29#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[182]: 'store pool_token_exists%41#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[185]: 'load pool_token_exists%41#0' with 'load pool_token_exists%41#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[48]: 'store tmp%9#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[53]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[62]: 'store tmp%12#0 to l-stack (copy)' @@ -1636,20 +1636,20 @@ debug: Inserted mint_block@0.ops[119]: 'store tmp%24#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[124]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[165]: 'store tmp%35#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[169]: 'load tmp%35#0' with 'load tmp%35#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[6]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[11]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[22]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[27]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[38]: 'store app_global_get_ex_value%6#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[43]: 'load app_global_get_ex_value%6#0' with 'load app_global_get_ex_value%6#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[99]: 'store app_global_get_ex_value%19#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[104]: 'load app_global_get_ex_value%19#0' with 'load app_global_get_ex_value%19#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[143]: 'store app_global_get_ex_value%28#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[148]: 'load app_global_get_ex_value%28#0' with 'load app_global_get_ex_value%28#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[6]: 'store pool_token_value%0#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[11]: 'load pool_token_value%0#0' with 'load pool_token_value%0#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[22]: 'store asset_a_value%3#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[27]: 'load asset_a_value%3#0' with 'load asset_a_value%3#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[38]: 'store asset_b_value%6#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[43]: 'load asset_b_value%6#0' with 'load asset_b_value%6#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[99]: 'store asset_a_value%19#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[104]: 'load asset_a_value%19#0' with 'load asset_a_value%19#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[143]: 'store asset_b_value%28#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[148]: 'load asset_b_value%28#0' with 'load asset_b_value%28#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[168]: 'store tmp%34#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[174]: 'load tmp%34#0' with 'load tmp%34#0 from l-stack (no copy)' -debug: Inserted mint_block@0.ops[195]: 'store app_global_get_ex_value%40#0 to l-stack (copy)' -debug: Replaced mint_block@0.ops[200]: 'load app_global_get_ex_value%40#0' with 'load app_global_get_ex_value%40#0 from l-stack (no copy)' +debug: Inserted mint_block@0.ops[195]: 'store pool_token_value%40#0 to l-stack (copy)' +debug: Replaced mint_block@0.ops[200]: 'load pool_token_value%40#0' with 'load pool_token_value%40#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[166]: 'store tmp%33#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[174]: 'load tmp%33#0' with 'load tmp%33#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[93]: 'store tmp%18#0 to l-stack (copy)' @@ -1664,38 +1664,38 @@ debug: Inserted mint_block@0.ops[186]: 'store to_mint#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[207]: 'load to_mint#0' with 'load to_mint#0 from l-stack (no copy)' debug: Inserted mint_block@0.ops[116]: 'store tmp%22#0 to l-stack (copy)' debug: Replaced mint_block@0.ops[181]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' -debug: Inserted _check_bootstrapped_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced _check_bootstrapped_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted _check_bootstrapped_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced _check_bootstrapped_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' -debug: Inserted _current_pool_balance_block@0.ops[5]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced _current_pool_balance_block@0.ops[8]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted _check_bootstrapped_block@0.ops[3]: 'store pool_token_exists%1#0 to l-stack (copy)' +debug: Replaced _check_bootstrapped_block@0.ops[6]: 'load pool_token_exists%1#0' with 'load pool_token_exists%1#0 from l-stack (no copy)' +debug: Inserted _check_bootstrapped_block@0.ops[5]: 'store pool_token_value%0#0 to l-stack (copy)' +debug: Replaced _check_bootstrapped_block@0.ops[9]: 'load pool_token_value%0#0' with 'load pool_token_value%0#0 from l-stack (no copy)' +debug: Inserted _current_pool_balance_block@0.ops[5]: 'store pool_token_exists%4#0 to l-stack (copy)' +debug: Replaced _current_pool_balance_block@0.ops[8]: 'load pool_token_exists%4#0' with 'load pool_token_exists%4#0 from l-stack (no copy)' debug: Inserted _current_pool_balance_block@0.ops[13]: 'store maybe_value_did_exist%1#0 to l-stack (copy)' debug: Replaced _current_pool_balance_block@0.ops[16]: 'load maybe_value_did_exist%1#0' with 'load maybe_value_did_exist%1#0 from l-stack (no copy)' debug: Inserted _current_pool_balance_block@0.ops[15]: 'store maybe_value%0#0 to l-stack (copy)' debug: Replaced _current_pool_balance_block@0.ops[19]: 'load maybe_value%0#0' with 'load maybe_value%0#0 from l-stack (no copy)' -debug: Inserted _current_pool_balance_block@0.ops[7]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced _current_pool_balance_block@0.ops[12]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' +debug: Inserted _current_pool_balance_block@0.ops[7]: 'store pool_token_value%3#0 to l-stack (copy)' +debug: Replaced _current_pool_balance_block@0.ops[12]: 'load pool_token_value%3#0' with 'load pool_token_value%3#0 from l-stack (no copy)' debug: Inserted _current_pool_balance_block@0.ops[1]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced _current_pool_balance_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' -debug: Inserted _current_a_balance_block@0.ops[5]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced _current_a_balance_block@0.ops[8]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted _current_a_balance_block@0.ops[5]: 'store asset_a_exists%4#0 to l-stack (copy)' +debug: Replaced _current_a_balance_block@0.ops[8]: 'load asset_a_exists%4#0' with 'load asset_a_exists%4#0 from l-stack (no copy)' debug: Inserted _current_a_balance_block@0.ops[13]: 'store maybe_value_did_exist%1#0 to l-stack (copy)' debug: Replaced _current_a_balance_block@0.ops[16]: 'load maybe_value_did_exist%1#0' with 'load maybe_value_did_exist%1#0 from l-stack (no copy)' debug: Inserted _current_a_balance_block@0.ops[15]: 'store maybe_value%0#0 to l-stack (copy)' debug: Replaced _current_a_balance_block@0.ops[19]: 'load maybe_value%0#0' with 'load maybe_value%0#0 from l-stack (no copy)' -debug: Inserted _current_a_balance_block@0.ops[7]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced _current_a_balance_block@0.ops[12]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' +debug: Inserted _current_a_balance_block@0.ops[7]: 'store asset_a_value%3#0 to l-stack (copy)' +debug: Replaced _current_a_balance_block@0.ops[12]: 'load asset_a_value%3#0' with 'load asset_a_value%3#0 from l-stack (no copy)' debug: Inserted _current_a_balance_block@0.ops[1]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced _current_a_balance_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' -debug: Inserted _current_b_balance_block@0.ops[5]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced _current_b_balance_block@0.ops[8]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted _current_b_balance_block@0.ops[5]: 'store asset_b_exists%4#0 to l-stack (copy)' +debug: Replaced _current_b_balance_block@0.ops[8]: 'load asset_b_exists%4#0' with 'load asset_b_exists%4#0 from l-stack (no copy)' debug: Inserted _current_b_balance_block@0.ops[13]: 'store maybe_value_did_exist%1#0 to l-stack (copy)' debug: Replaced _current_b_balance_block@0.ops[16]: 'load maybe_value_did_exist%1#0' with 'load maybe_value_did_exist%1#0 from l-stack (no copy)' debug: Inserted _current_b_balance_block@0.ops[15]: 'store maybe_value%0#0 to l-stack (copy)' debug: Replaced _current_b_balance_block@0.ops[19]: 'load maybe_value%0#0' with 'load maybe_value%0#0 from l-stack (no copy)' -debug: Inserted _current_b_balance_block@0.ops[7]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced _current_b_balance_block@0.ops[12]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' +debug: Inserted _current_b_balance_block@0.ops[7]: 'store asset_b_value%3#0 to l-stack (copy)' +debug: Replaced _current_b_balance_block@0.ops[12]: 'load asset_b_value%3#0' with 'load asset_b_value%3#0 from l-stack (no copy)' debug: Inserted _current_b_balance_block@0.ops[1]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced _current_b_balance_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted tokens_to_mint_block@0.ops[3]: 'store tmp%0#0 to l-stack (copy)' @@ -1766,44 +1766,44 @@ debug: Inserted burn_block@0.ops[79]: 'store tmp%17#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[81]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[91]: 'store tmp%20#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[93]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[4]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[7]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[19]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[22]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[34]: 'store app_global_get_ex_did_exist%7#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[37]: 'load app_global_get_ex_did_exist%7#0' with 'load app_global_get_ex_did_exist%7#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[4]: 'store pool_token_exists%1#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[7]: 'load pool_token_exists%1#0' with 'load pool_token_exists%1#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[19]: 'store asset_a_exists%4#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[22]: 'load asset_a_exists%4#0' with 'load asset_a_exists%4#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[34]: 'store asset_b_exists%7#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[37]: 'load asset_b_exists%7#0' with 'load asset_b_exists%7#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[50]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[53]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[76]: 'store app_global_get_ex_did_exist%16#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[79]: 'load app_global_get_ex_did_exist%16#0' with 'load app_global_get_ex_did_exist%16#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[76]: 'store pool_token_exists%16#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[79]: 'load pool_token_exists%16#0' with 'load pool_token_exists%16#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[92]: 'store tmp%19#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[95]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[104]: 'store tmp%21#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[107]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[112]: 'store tmp%23#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[115]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[124]: 'store app_global_get_ex_did_exist%27#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[127]: 'load app_global_get_ex_did_exist%27#0' with 'load app_global_get_ex_did_exist%27#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[138]: 'store app_global_get_ex_did_exist%30#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[141]: 'load app_global_get_ex_did_exist%30#0' with 'load app_global_get_ex_did_exist%30#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[124]: 'store asset_a_exists%27#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[127]: 'load asset_a_exists%27#0' with 'load asset_a_exists%27#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[138]: 'store asset_b_exists%30#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[141]: 'load asset_b_exists%30#0' with 'load asset_b_exists%30#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[48]: 'store tmp%9#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[53]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[91]: 'store tmp%18#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[96]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[104]: 'store pool_balance#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[109]: 'load pool_balance#0' with 'load pool_balance#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[6]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[11]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[22]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[27]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[38]: 'store app_global_get_ex_value%6#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[43]: 'load app_global_get_ex_value%6#0' with 'load app_global_get_ex_value%6#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[82]: 'store app_global_get_ex_value%15#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[87]: 'load app_global_get_ex_value%15#0' with 'load app_global_get_ex_value%15#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[133]: 'store app_global_get_ex_value%26#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[138]: 'load app_global_get_ex_value%26#0' with 'load app_global_get_ex_value%26#0 from l-stack (no copy)' -debug: Inserted burn_block@0.ops[148]: 'store app_global_get_ex_value%29#0 to l-stack (copy)' -debug: Replaced burn_block@0.ops[153]: 'load app_global_get_ex_value%29#0' with 'load app_global_get_ex_value%29#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[6]: 'store pool_token_value%0#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[11]: 'load pool_token_value%0#0' with 'load pool_token_value%0#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[22]: 'store asset_a_value%3#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[27]: 'load asset_a_value%3#0' with 'load asset_a_value%3#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[38]: 'store asset_b_value%6#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[43]: 'load asset_b_value%6#0' with 'load asset_b_value%6#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[82]: 'store pool_token_value%15#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[87]: 'load pool_token_value%15#0' with 'load pool_token_value%15#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[133]: 'store asset_a_value%26#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[138]: 'load asset_a_value%26#0' with 'load asset_a_value%26#0 from l-stack (no copy)' +debug: Inserted burn_block@0.ops[148]: 'store asset_b_value%29#0 to l-stack (copy)' +debug: Replaced burn_block@0.ops[153]: 'load asset_b_value%29#0' with 'load asset_b_value%29#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[114]: 'store pool_balance#0 to l-stack (copy)' debug: Replaced burn_block@0.ops[122]: 'load pool_balance#0' with 'load pool_balance#0 from l-stack (no copy)' debug: Inserted burn_block@0.ops[117]: 'store tmp%12#0 to l-stack (copy)' @@ -1838,32 +1838,32 @@ debug: Inserted swap_block@0.ops[36]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced swap_block@0.ops[38]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' debug: Inserted swap_block@0.ops[48]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced swap_block@0.ops[50]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[4]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[7]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[19]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[22]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[4]: 'store asset_a_exists%1#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[7]: 'load asset_a_exists%1#0' with 'load asset_a_exists%1#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[19]: 'store asset_b_exists%4#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[22]: 'load asset_b_exists%4#0' with 'load asset_b_exists%4#0 from l-stack (no copy)' debug: Inserted swap_block@0.ops[46]: 'store tmp%9#0 to l-stack (copy)' debug: Replaced swap_block@0.ops[49]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[58]: 'store app_global_get_ex_did_exist%12#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[61]: 'load app_global_get_ex_did_exist%12#0' with 'load app_global_get_ex_did_exist%12#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[66]: 'store app_global_get_ex_did_exist%14#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[69]: 'load app_global_get_ex_did_exist%14#0' with 'load app_global_get_ex_did_exist%14#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[58]: 'store asset_a_exists%12#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[61]: 'load asset_a_exists%12#0' with 'load asset_a_exists%12#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[66]: 'store asset_b_exists%14#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[69]: 'load asset_b_exists%14#0' with 'load asset_b_exists%14#0 from l-stack (no copy)' debug: Inserted swap_block@0.ops[44]: 'store tmp%8#0 to l-stack (copy)' debug: Replaced swap_block@0.ops[49]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' debug: Inserted swap_block@0.ops[74]: 'store awst_tmp%15#0 to l-stack (copy)' debug: Replaced swap_block@0.ops[78]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[6]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[11]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[22]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[27]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[71]: 'store app_global_get_ex_value%13#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[80]: 'load app_global_get_ex_value%13#0' with 'load app_global_get_ex_value%13#0 from l-stack (no copy)' -debug: Inserted swap_block@0.ops[63]: 'store app_global_get_ex_value%11#0 to l-stack (copy)' -debug: Replaced swap_block@0.ops[80]: 'load app_global_get_ex_value%11#0' with 'load app_global_get_ex_value%11#0 from l-stack (no copy)' -debug: Inserted swap_switch_case_0@1.ops[7]: 'store app_global_get_ex_did_exist%17#0 to l-stack (copy)' -debug: Replaced swap_switch_case_0@1.ops[10]: 'load app_global_get_ex_did_exist%17#0' with 'load app_global_get_ex_did_exist%17#0 from l-stack (no copy)' -debug: Inserted swap_switch_case_1@2.ops[7]: 'store app_global_get_ex_did_exist%19#0 to l-stack (copy)' -debug: Replaced swap_switch_case_1@2.ops[10]: 'load app_global_get_ex_did_exist%19#0' with 'load app_global_get_ex_did_exist%19#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[6]: 'store asset_a_value%0#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[11]: 'load asset_a_value%0#0' with 'load asset_a_value%0#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[22]: 'store asset_b_value%3#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[27]: 'load asset_b_value%3#0' with 'load asset_b_value%3#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[71]: 'store asset_b_value%13#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[80]: 'load asset_b_value%13#0' with 'load asset_b_value%13#0 from l-stack (no copy)' +debug: Inserted swap_block@0.ops[63]: 'store asset_a_value%11#0 to l-stack (copy)' +debug: Replaced swap_block@0.ops[80]: 'load asset_a_value%11#0' with 'load asset_a_value%11#0 from l-stack (no copy)' +debug: Inserted swap_switch_case_0@1.ops[7]: 'store asset_a_exists%17#0 to l-stack (copy)' +debug: Replaced swap_switch_case_0@1.ops[10]: 'load asset_a_exists%17#0' with 'load asset_a_exists%17#0 from l-stack (no copy)' +debug: Inserted swap_switch_case_1@2.ops[7]: 'store asset_b_exists%19#0 to l-stack (copy)' +debug: Replaced swap_switch_case_1@2.ops[10]: 'load asset_b_exists%19#0' with 'load asset_b_exists%19#0 from l-stack (no copy)' debug: Inserted swap_switch_case_next@4.ops[4]: 'store to_swap#0 to l-stack (copy)' debug: Replaced swap_switch_case_next@4.ops[6]: 'load to_swap#0' with 'load to_swap#0 from l-stack (no copy)' debug: Inserted swap_switch_case_next@4.ops[9]: 'store tmp%21#0 to l-stack (copy)' diff --git a/examples/auction/out/Auction.approval.mir b/examples/auction/out/Auction.approval.mir index 4b823fc84d..3d9b50ad93 100644 --- a/examples/auction/out/Auction.approval.mir +++ b/examples/auction/out/Auction.approval.mir @@ -1,10 +1,10 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.auction.contract.Auction.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} + txn ApplicationID // {txn} // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // @@ -15,309 +15,309 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txn NumAppArgs // {txn} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class Auction(ARC4Contract): auction/contract.py:15 - bz main_bare_routing@12 // class Auction(ARC4Contract): auction/contract.py:15 - // Implicit fall through to main_abi_routing@3 // class Auction(ARC4Contract): auction/contract.py:15 + txn NumAppArgs // {txn} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class Auction(ARC4Contract): auction/contract.py:15 + bz main_bare_routing@12 // class Auction(ARC4Contract): auction/contract.py:15 + // Implicit fall through to main_abi_routing@3 // class Auction(ARC4Contract): auction/contract.py:15 main_abi_routing@3: - txna ApplicationArgs 0 // {txna} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class Auction(ARC4Contract): auction/contract.py:15 - method "opt_into_asset(asset)void" // tmp%2#0,method<"opt_into_asset(asset)void"> class Auction(ARC4Contract): auction/contract.py:15 - method "start_auction(uint64,uint64,axfer)void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void"> class Auction(ARC4Contract): auction/contract.py:15 - method "opt_in()void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void"> class Auction(ARC4Contract): auction/contract.py:15 - method "bid(pay)void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void"> class Auction(ARC4Contract): auction/contract.py:15 - method "claim_bids()void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void">,method<"claim_bids()void"> class Auction(ARC4Contract): auction/contract.py:15 - method "claim_asset(asset)void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void">,method<"claim_bids()void">,method<"claim_asset(asset)void"> class Auction(ARC4Contract): auction/contract.py:15 - uncover 6 // load tmp%2#0 from l-stack (no copy) method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void">,method<"claim_bids()void">,method<"claim_asset(asset)void">,tmp%2#0 class Auction(ARC4Contract): auction/contract.py:15 - match main_opt_into_asset_route@4 main_start_auction_route@5 main_opt_in_route@6 main_bid_route@7 main_claim_bids_route@8 main_claim_asset_route@9 // class Auction(ARC4Contract): auction/contract.py:15 - err // reject transaction // class Auction(ARC4Contract): auction/contract.py:15 + txna ApplicationArgs 0 // {txna} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class Auction(ARC4Contract): auction/contract.py:15 + method "opt_into_asset(asset)void" // tmp%2#0,method<"opt_into_asset(asset)void"> class Auction(ARC4Contract): auction/contract.py:15 + method "start_auction(uint64,uint64,axfer)void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void"> class Auction(ARC4Contract): auction/contract.py:15 + method "opt_in()void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void"> class Auction(ARC4Contract): auction/contract.py:15 + method "bid(pay)void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void"> class Auction(ARC4Contract): auction/contract.py:15 + method "claim_bids()void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void">,method<"claim_bids()void"> class Auction(ARC4Contract): auction/contract.py:15 + method "claim_asset(asset)void" // tmp%2#0,method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void">,method<"claim_bids()void">,method<"claim_asset(asset)void"> class Auction(ARC4Contract): auction/contract.py:15 + uncover 6 // load tmp%2#0 from l-stack (no copy) method<"opt_into_asset(asset)void">,method<"start_auction(uint64,uint64,axfer)void">,method<"opt_in()void">,method<"bid(pay)void">,method<"claim_bids()void">,method<"claim_asset(asset)void">,tmp%2#0 class Auction(ARC4Contract): auction/contract.py:15 + match main_opt_into_asset_route@4 main_start_auction_route@5 main_opt_in_route@6 main_bid_route@7 main_claim_bids_route@8 main_claim_asset_route@9 // class Auction(ARC4Contract): auction/contract.py:15 + err // reject transaction // class Auction(ARC4Contract): auction/contract.py:15 main_opt_into_asset_route@4: - txn OnCompletion // {txn} arc4.abimethod auction/contract.py:25 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod auction/contract.py:25 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod auction/contract.py:25 - ! // {!} arc4.abimethod auction/contract.py:25 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod auction/contract.py:25 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod auction/contract.py:25 - assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:25 - txn ApplicationID // {txn} arc4.abimethod auction/contract.py:25 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod auction/contract.py:25 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod auction/contract.py:25 - assert // is not creating // arc4.abimethod auction/contract.py:25 - txna ApplicationArgs 1 // {txna} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 class Auction(ARC4Contract): auction/contract.py:15 - btoi // {btoi} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 class Auction(ARC4Contract): auction/contract.py:15 - txnas Assets // {txnas} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod auction/contract.py:25 - callsub opt_into_asset // arc4.abimethod auction/contract.py:25 - int 1 // 1 arc4.abimethod auction/contract.py:25 - return // arc4.abimethod auction/contract.py:25 + txn OnCompletion // {txn} arc4.abimethod auction/contract.py:25 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod auction/contract.py:25 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod auction/contract.py:25 + ! // {!} arc4.abimethod auction/contract.py:25 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod auction/contract.py:25 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod auction/contract.py:25 + assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:25 + txn ApplicationID // {txn} arc4.abimethod auction/contract.py:25 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod auction/contract.py:25 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod auction/contract.py:25 + assert // is not creating // arc4.abimethod auction/contract.py:25 + txna ApplicationArgs 1 // {txna} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 class Auction(ARC4Contract): auction/contract.py:15 + btoi // {btoi} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 class Auction(ARC4Contract): auction/contract.py:15 + txnas Assets // {txnas} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod auction/contract.py:25 + callsub opt_into_asset // arc4.abimethod auction/contract.py:25 + int 1 // 1 arc4.abimethod auction/contract.py:25 + return // arc4.abimethod auction/contract.py:25 main_start_auction_route@5: - txn OnCompletion // {txn} arc4.abimethod auction/contract.py:41 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 arc4.abimethod auction/contract.py:41 - // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod auction/contract.py:41 - ! // {!} arc4.abimethod auction/contract.py:41 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod auction/contract.py:41 - // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 arc4.abimethod auction/contract.py:41 - assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:41 - txn ApplicationID // {txn} arc4.abimethod auction/contract.py:41 - // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod auction/contract.py:41 - // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod auction/contract.py:41 - assert // is not creating // arc4.abimethod auction/contract.py:41 - txna ApplicationArgs 1 // {txna} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 class Auction(ARC4Contract): auction/contract.py:15 - txna ApplicationArgs 2 // tmp%12#0,{txna} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%13#0 to l-stack (no copy) tmp%12#0,tmp%13#0 class Auction(ARC4Contract): auction/contract.py:15 - txn GroupIndex // tmp%12#0,tmp%13#0,{txn} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%16#0 to l-stack (no copy) tmp%12#0,tmp%13#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%16#0 from l-stack (no copy) tmp%12#0,tmp%13#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 - int 1 // tmp%12#0,tmp%13#0,tmp%16#0,1 class Auction(ARC4Contract): auction/contract.py:15 - - // tmp%12#0,tmp%13#0,{-} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store awst_tmp%17#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - dup // load awst_tmp%17#0 from l-stack (copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - gtxns TypeEnum // tmp%12#0,tmp%13#0,awst_tmp%17#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%18#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%18#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0 class Auction(ARC4Contract): auction/contract.py:15 - int axfer // tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0,axfer class Auction(ARC4Contract): auction/contract.py:15 - == // tmp%12#0,tmp%13#0,awst_tmp%17#0,{==} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%19#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%19#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%19#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%19#0 class Auction(ARC4Contract): auction/contract.py:15 - assert // transaction type is axfer // tmp%12#0,tmp%13#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - uncover 2 // load tmp%12#0 from l-stack (no copy) tmp%13#0,awst_tmp%17#0,tmp%12#0 arc4.abimethod auction/contract.py:41 - uncover 2 // load tmp%13#0 from l-stack (no copy) awst_tmp%17#0,tmp%12#0,tmp%13#0 arc4.abimethod auction/contract.py:41 - uncover 2 // load awst_tmp%17#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0 arc4.abimethod auction/contract.py:41 - callsub start_auction // arc4.abimethod auction/contract.py:41 - int 1 // 1 arc4.abimethod auction/contract.py:41 - return // arc4.abimethod auction/contract.py:41 + txn OnCompletion // {txn} arc4.abimethod auction/contract.py:41 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 arc4.abimethod auction/contract.py:41 + // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod auction/contract.py:41 + ! // {!} arc4.abimethod auction/contract.py:41 + // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod auction/contract.py:41 + // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 arc4.abimethod auction/contract.py:41 + assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:41 + txn ApplicationID // {txn} arc4.abimethod auction/contract.py:41 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod auction/contract.py:41 + // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod auction/contract.py:41 + assert // is not creating // arc4.abimethod auction/contract.py:41 + txna ApplicationArgs 1 // {txna} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 class Auction(ARC4Contract): auction/contract.py:15 + txna ApplicationArgs 2 // tmp%12#0,{txna} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%13#0 to l-stack (no copy) tmp%12#0,tmp%13#0 class Auction(ARC4Contract): auction/contract.py:15 + txn GroupIndex // tmp%12#0,tmp%13#0,{txn} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%16#0 to l-stack (no copy) tmp%12#0,tmp%13#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%16#0 from l-stack (no copy) tmp%12#0,tmp%13#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 + int 1 // tmp%12#0,tmp%13#0,tmp%16#0,1 class Auction(ARC4Contract): auction/contract.py:15 + - // tmp%12#0,tmp%13#0,{-} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store awst_tmp%17#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + dup // load awst_tmp%17#0 from l-stack (copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + gtxns TypeEnum // tmp%12#0,tmp%13#0,awst_tmp%17#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%18#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%18#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0 class Auction(ARC4Contract): auction/contract.py:15 + int axfer // tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0,axfer class Auction(ARC4Contract): auction/contract.py:15 + == // tmp%12#0,tmp%13#0,awst_tmp%17#0,{==} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%19#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%19#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%19#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%19#0 class Auction(ARC4Contract): auction/contract.py:15 + assert // transaction type is axfer // tmp%12#0,tmp%13#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + uncover 2 // load tmp%12#0 from l-stack (no copy) tmp%13#0,awst_tmp%17#0,tmp%12#0 arc4.abimethod auction/contract.py:41 + uncover 2 // load tmp%13#0 from l-stack (no copy) awst_tmp%17#0,tmp%12#0,tmp%13#0 arc4.abimethod auction/contract.py:41 + uncover 2 // load awst_tmp%17#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0 arc4.abimethod auction/contract.py:41 + callsub start_auction // arc4.abimethod auction/contract.py:41 + int 1 // 1 arc4.abimethod auction/contract.py:41 + return // arc4.abimethod auction/contract.py:41 main_opt_in_route@6: - txn OnCompletion // {txn} arc4.abimethod auction/contract.py:63 - // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 arc4.abimethod auction/contract.py:63 - // virtual: load tmp%20#0 from l-stack (no copy) tmp%20#0 arc4.abimethod auction/contract.py:63 - ! // {!} arc4.abimethod auction/contract.py:63 - // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 arc4.abimethod auction/contract.py:63 - // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 arc4.abimethod auction/contract.py:63 - assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:63 - txn ApplicationID // {txn} arc4.abimethod auction/contract.py:63 - // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 arc4.abimethod auction/contract.py:63 - // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 arc4.abimethod auction/contract.py:63 - assert // is not creating // arc4.abimethod auction/contract.py:63 - callsub opt_in // arc4.abimethod auction/contract.py:63 - int 1 // 1 arc4.abimethod auction/contract.py:63 - return // arc4.abimethod auction/contract.py:63 + txn OnCompletion // {txn} arc4.abimethod auction/contract.py:63 + // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 arc4.abimethod auction/contract.py:63 + // virtual: load tmp%20#0 from l-stack (no copy) tmp%20#0 arc4.abimethod auction/contract.py:63 + ! // {!} arc4.abimethod auction/contract.py:63 + // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 arc4.abimethod auction/contract.py:63 + // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 arc4.abimethod auction/contract.py:63 + assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:63 + txn ApplicationID // {txn} arc4.abimethod auction/contract.py:63 + // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 arc4.abimethod auction/contract.py:63 + // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 arc4.abimethod auction/contract.py:63 + assert // is not creating // arc4.abimethod auction/contract.py:63 + callsub opt_in // arc4.abimethod auction/contract.py:63 + int 1 // 1 arc4.abimethod auction/contract.py:63 + return // arc4.abimethod auction/contract.py:63 main_bid_route@7: - txn OnCompletion // {txn} arc4.abimethod auction/contract.py:67 - // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 arc4.abimethod auction/contract.py:67 - // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 arc4.abimethod auction/contract.py:67 - ! // {!} arc4.abimethod auction/contract.py:67 - // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 arc4.abimethod auction/contract.py:67 - // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 arc4.abimethod auction/contract.py:67 - assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:67 - txn ApplicationID // {txn} arc4.abimethod auction/contract.py:67 - // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 arc4.abimethod auction/contract.py:67 - // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 arc4.abimethod auction/contract.py:67 - assert // is not creating // arc4.abimethod auction/contract.py:67 - txn GroupIndex // {txn} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 - int 1 // tmp%28#0,1 class Auction(ARC4Contract): auction/contract.py:15 - - // {-} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store awst_tmp%17#0 to l-stack (no copy) awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - dup // load awst_tmp%17#0 from l-stack (copy) awst_tmp%17#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - gtxns TypeEnum // awst_tmp%17#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%29#0 to l-stack (no copy) awst_tmp%17#0,tmp%29#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%29#0 from l-stack (no copy) awst_tmp%17#0,tmp%29#0 class Auction(ARC4Contract): auction/contract.py:15 - int pay // awst_tmp%17#0,tmp%29#0,pay class Auction(ARC4Contract): auction/contract.py:15 - == // awst_tmp%17#0,{==} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%30#0 to l-stack (no copy) awst_tmp%17#0,tmp%30#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%30#0 from l-stack (no copy) awst_tmp%17#0,tmp%30#0 class Auction(ARC4Contract): auction/contract.py:15 - assert // transaction type is pay // awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load awst_tmp%17#0 from l-stack (no copy) awst_tmp%17#0 arc4.abimethod auction/contract.py:67 - callsub bid // arc4.abimethod auction/contract.py:67 - int 1 // 1 arc4.abimethod auction/contract.py:67 - return // arc4.abimethod auction/contract.py:67 + txn OnCompletion // {txn} arc4.abimethod auction/contract.py:67 + // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 arc4.abimethod auction/contract.py:67 + // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 arc4.abimethod auction/contract.py:67 + ! // {!} arc4.abimethod auction/contract.py:67 + // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 arc4.abimethod auction/contract.py:67 + // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 arc4.abimethod auction/contract.py:67 + assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:67 + txn ApplicationID // {txn} arc4.abimethod auction/contract.py:67 + // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 arc4.abimethod auction/contract.py:67 + // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 arc4.abimethod auction/contract.py:67 + assert // is not creating // arc4.abimethod auction/contract.py:67 + txn GroupIndex // {txn} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 + int 1 // tmp%28#0,1 class Auction(ARC4Contract): auction/contract.py:15 + - // {-} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store awst_tmp%17#0 to l-stack (no copy) awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + dup // load awst_tmp%17#0 from l-stack (copy) awst_tmp%17#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + gtxns TypeEnum // awst_tmp%17#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%29#0 to l-stack (no copy) awst_tmp%17#0,tmp%29#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%29#0 from l-stack (no copy) awst_tmp%17#0,tmp%29#0 class Auction(ARC4Contract): auction/contract.py:15 + int pay // awst_tmp%17#0,tmp%29#0,pay class Auction(ARC4Contract): auction/contract.py:15 + == // awst_tmp%17#0,{==} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%30#0 to l-stack (no copy) awst_tmp%17#0,tmp%30#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%30#0 from l-stack (no copy) awst_tmp%17#0,tmp%30#0 class Auction(ARC4Contract): auction/contract.py:15 + assert // transaction type is pay // awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load awst_tmp%17#0 from l-stack (no copy) awst_tmp%17#0 arc4.abimethod auction/contract.py:67 + callsub bid // arc4.abimethod auction/contract.py:67 + int 1 // 1 arc4.abimethod auction/contract.py:67 + return // arc4.abimethod auction/contract.py:67 main_claim_bids_route@8: - txn OnCompletion // {txn} arc4.abimethod auction/contract.py:83 - // virtual: store tmp%31#0 to l-stack (no copy) tmp%31#0 arc4.abimethod auction/contract.py:83 - // virtual: load tmp%31#0 from l-stack (no copy) tmp%31#0 arc4.abimethod auction/contract.py:83 - ! // {!} arc4.abimethod auction/contract.py:83 - // virtual: store tmp%32#0 to l-stack (no copy) tmp%32#0 arc4.abimethod auction/contract.py:83 - // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 arc4.abimethod auction/contract.py:83 - assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:83 - txn ApplicationID // {txn} arc4.abimethod auction/contract.py:83 - // virtual: store tmp%33#0 to l-stack (no copy) tmp%33#0 arc4.abimethod auction/contract.py:83 - // virtual: load tmp%33#0 from l-stack (no copy) tmp%33#0 arc4.abimethod auction/contract.py:83 - assert // is not creating // arc4.abimethod auction/contract.py:83 - callsub claim_bids // arc4.abimethod auction/contract.py:83 - int 1 // 1 arc4.abimethod auction/contract.py:83 - return // arc4.abimethod auction/contract.py:83 + txn OnCompletion // {txn} arc4.abimethod auction/contract.py:83 + // virtual: store tmp%31#0 to l-stack (no copy) tmp%31#0 arc4.abimethod auction/contract.py:83 + // virtual: load tmp%31#0 from l-stack (no copy) tmp%31#0 arc4.abimethod auction/contract.py:83 + ! // {!} arc4.abimethod auction/contract.py:83 + // virtual: store tmp%32#0 to l-stack (no copy) tmp%32#0 arc4.abimethod auction/contract.py:83 + // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 arc4.abimethod auction/contract.py:83 + assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:83 + txn ApplicationID // {txn} arc4.abimethod auction/contract.py:83 + // virtual: store tmp%33#0 to l-stack (no copy) tmp%33#0 arc4.abimethod auction/contract.py:83 + // virtual: load tmp%33#0 from l-stack (no copy) tmp%33#0 arc4.abimethod auction/contract.py:83 + assert // is not creating // arc4.abimethod auction/contract.py:83 + callsub claim_bids // arc4.abimethod auction/contract.py:83 + int 1 // 1 arc4.abimethod auction/contract.py:83 + return // arc4.abimethod auction/contract.py:83 main_claim_asset_route@9: - txn OnCompletion // {txn} arc4.abimethod auction/contract.py:99 - // virtual: store tmp%34#0 to l-stack (no copy) tmp%34#0 arc4.abimethod auction/contract.py:99 - // virtual: load tmp%34#0 from l-stack (no copy) tmp%34#0 arc4.abimethod auction/contract.py:99 - ! // {!} arc4.abimethod auction/contract.py:99 - // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 arc4.abimethod auction/contract.py:99 - // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 arc4.abimethod auction/contract.py:99 - assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:99 - txn ApplicationID // {txn} arc4.abimethod auction/contract.py:99 - // virtual: store tmp%36#0 to l-stack (no copy) tmp%36#0 arc4.abimethod auction/contract.py:99 - // virtual: load tmp%36#0 from l-stack (no copy) tmp%36#0 arc4.abimethod auction/contract.py:99 - assert // is not creating // arc4.abimethod auction/contract.py:99 - txna ApplicationArgs 1 // {txna} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%37#0 to l-stack (no copy) tmp%37#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%37#0 from l-stack (no copy) tmp%37#0 class Auction(ARC4Contract): auction/contract.py:15 - btoi // {btoi} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%38#0 to l-stack (no copy) tmp%38#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 class Auction(ARC4Contract): auction/contract.py:15 - txnas Assets // {txnas} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 arc4.abimethod auction/contract.py:99 - callsub claim_asset // arc4.abimethod auction/contract.py:99 - int 1 // 1 arc4.abimethod auction/contract.py:99 - return // arc4.abimethod auction/contract.py:99 + txn OnCompletion // {txn} arc4.abimethod auction/contract.py:99 + // virtual: store tmp%34#0 to l-stack (no copy) tmp%34#0 arc4.abimethod auction/contract.py:99 + // virtual: load tmp%34#0 from l-stack (no copy) tmp%34#0 arc4.abimethod auction/contract.py:99 + ! // {!} arc4.abimethod auction/contract.py:99 + // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 arc4.abimethod auction/contract.py:99 + // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 arc4.abimethod auction/contract.py:99 + assert // OnCompletion is NoOp // arc4.abimethod auction/contract.py:99 + txn ApplicationID // {txn} arc4.abimethod auction/contract.py:99 + // virtual: store tmp%36#0 to l-stack (no copy) tmp%36#0 arc4.abimethod auction/contract.py:99 + // virtual: load tmp%36#0 from l-stack (no copy) tmp%36#0 arc4.abimethod auction/contract.py:99 + assert // is not creating // arc4.abimethod auction/contract.py:99 + txna ApplicationArgs 1 // {txna} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%37#0 to l-stack (no copy) tmp%37#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%37#0 from l-stack (no copy) tmp%37#0 class Auction(ARC4Contract): auction/contract.py:15 + btoi // {btoi} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%38#0 to l-stack (no copy) tmp%38#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 class Auction(ARC4Contract): auction/contract.py:15 + txnas Assets // {txnas} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 arc4.abimethod auction/contract.py:99 + callsub claim_asset // arc4.abimethod auction/contract.py:99 + int 1 // 1 arc4.abimethod auction/contract.py:99 + return // arc4.abimethod auction/contract.py:99 main_bare_routing@12: - txn OnCompletion // {txn} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%40#0 to l-stack (no copy) tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%40#0 from l-stack (no copy) tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 - ! // {!} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store not%tmp%40#0 to l-stack (no copy) not%tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load not%tmp%40#0 from l-stack (no copy) not%tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 - assert // reject transaction // class Auction(ARC4Contract): auction/contract.py:15 - txn ApplicationID // {txn} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 class Auction(ARC4Contract): auction/contract.py:15 - ! // {!} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%42#0 to l-stack (no copy) tmp%42#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%42#0 from l-stack (no copy) tmp%42#0 class Auction(ARC4Contract): auction/contract.py:15 - assert // is creating // class Auction(ARC4Contract): auction/contract.py:15 - int 1 // 1 class Auction(ARC4Contract): auction/contract.py:15 - return // class Auction(ARC4Contract): auction/contract.py:15 + txn OnCompletion // {txn} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%40#0 to l-stack (no copy) tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%40#0 from l-stack (no copy) tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 + ! // {!} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store not%tmp%40#0 to l-stack (no copy) not%tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load not%tmp%40#0 from l-stack (no copy) not%tmp%40#0 class Auction(ARC4Contract): auction/contract.py:15 + assert // reject transaction // class Auction(ARC4Contract): auction/contract.py:15 + txn ApplicationID // {txn} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 class Auction(ARC4Contract): auction/contract.py:15 + ! // {!} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%42#0 to l-stack (no copy) tmp%42#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%42#0 from l-stack (no copy) tmp%42#0 class Auction(ARC4Contract): auction/contract.py:15 + assert // is creating // class Auction(ARC4Contract): auction/contract.py:15 + int 1 // 1 class Auction(ARC4Contract): auction/contract.py:15 + return // class Auction(ARC4Contract): auction/contract.py:15 // examples.auction.contract.Auction.opt_into_asset(asset: uint64) -> void: opt_into_asset: - proto 1 0 // (𝕡) asset#0 | @arc4.abimethod\ndef opt_into_asset(self, asset: Asset) -> None: auction/contract.py:25-26 + proto 1 0 // (𝕡) asset#0 | @arc4.abimethod\ndef opt_into_asset(self, asset: Asset) -> None: auction/contract.py:25-26 opt_into_asset_block@0: - txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert Txn.sender auction/contract.py:27-28 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender auction/contract.py:27-28 - global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 - == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... auction/contract.py:27-28 - assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... auction/contract.py:27-28 - int 0 // (𝕡) asset#0 | 0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - byte "asa" // (𝕡) asset#0 | 0,"asa" y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 - // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 - ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert self.asa.asset_id == 0, "ASA already opted in" auction/contract.py:29-30 - assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert self.asa.asset_id == 0, "ASA already opted in" auction/contract.py:29-30 - byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa auction/contract.py:31-32 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset auction/contract.py:31-32 - app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset auction/contract.py:31-32 - itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nitxn.AssetTransfer(\nasset_receiver=Global... auction/contract.py:34-39 - global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address auction/contract.py:36 - // virtual: store inner_txn_params%7%%param_AssetReceiver_idx_0#0 to l-stack (no copy) (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 Global.current_application_address auction/contract.py:36 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0,asset#0 - itxn_field XferAsset // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 - int axfer // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0,axfer # Submit opt-in transaction: 0 asset transfer to self\nitxn.AssetTransfer auction/contract.py:34-35 - itxn_field TypeEnum // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 - int 0 // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0,0 0 auction/contract.py:38 - itxn_field Fee // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 + txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert Txn.sender auction/contract.py:27-28 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender auction/contract.py:27-28 + global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 + == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address auction/contract.py:27-28 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... auction/contract.py:27-28 + assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... auction/contract.py:27-28 + int 0 // (𝕡) asset#0 | 0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + byte "asa" // (𝕡) asset#0 | 0,"asa" y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + // virtual: store asa_exists%4#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%4#0,{app_global_get_ex}.0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + // virtual: store asa_value%3#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + // virtual: load asa_exists%4#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + assert // check asa exists // (𝕡) asset#0 | asa_value%3#0 y a ASA hasn't already been opted into\nassert self.asa auction/contract.py:29-30 + // virtual: load asa_value%3#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0 y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 + ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert self.asa.asset_id == 0 auction/contract.py:29-30 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert self.asa.asset_id == 0, "ASA already opted in" auction/contract.py:29-30 + assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert self.asa.asset_id == 0, "ASA already opted in" auction/contract.py:29-30 + byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa auction/contract.py:31-32 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset auction/contract.py:31-32 + app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset auction/contract.py:31-32 + itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nitxn.AssetTransfer(\nasset_receiver=Global... auction/contract.py:34-39 + global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address auction/contract.py:36 + // virtual: store inner_txn_params%7%%param_AssetReceiver_idx_0#0 to l-stack (no copy) (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 Global.current_application_address auction/contract.py:36 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0,asset#0 + itxn_field XferAsset // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 + int axfer // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0,axfer # Submit opt-in transaction: 0 asset transfer to self\nitxn.AssetTransfer auction/contract.py:34-35 + itxn_field TypeEnum // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 + int 0 // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0,0 0 auction/contract.py:38 + itxn_field Fee // (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 // virtual: load inner_txn_params%7%%param_AssetReceiver_idx_0#0 from l-stack (no copy) (𝕡) asset#0 | inner_txn_params%7%%param_AssetReceiver_idx_0#0 - itxn_field AssetReceiver // (𝕡) asset#0 | - itxn_submit // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nitxn.AssetTransfer(\nasset_receiver=Global... auction/contract.py:34-39 + itxn_field AssetReceiver // (𝕡) asset#0 | + itxn_submit // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nitxn.AssetTransfer(\nasset_receiver=Global... auction/contract.py:34-39 retsub // // examples.auction.contract.Auction.start_auction(starting_price: bytes, length: bytes, axfer: uint64) -> void: start_auction: - proto 3 0 // (𝕡) starting_price#0,length#0,axfer#0 | @arc4.abimethod\ndef start_auction(\nself,\nstarting_price: arc4.UInt64,\nlength: arc4.UInt64,\na... auction/contract.py:41-47 + proto 3 0 // (𝕡) starting_price#0,length#0,axfer#0 | @arc4.abimethod\ndef start_auction(\nself,\nstarting_price: arc4.UInt64,\nlength: arc4.UInt64,\na... auction/contract.py:41-47 start_auction_block@0: - txn Sender // (𝕡) starting_price#0,length#0,axfer#0 | {txn} Txn.sender auction/contract.py:48 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0 Txn.sender auction/contract.py:48 - global CreatorAddress // (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0,{global} Global.creator_address auction/contract.py:48 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0,tmp%1#0 Global.creator_address auction/contract.py:48 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%1#0,tmp%0#0 Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0,tmp%1#0 Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 - == // (𝕡) starting_price#0,length#0,axfer#0 | {==} Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%2#0 Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%2#0 assert Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 - assert // auction must be started by creator // (𝕡) starting_price#0,length#0,axfer#0 | assert Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 - int 0 // (𝕡) starting_price#0,length#0,axfer#0 | 0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - byte "auction_end" // (𝕡) starting_price#0,length#0,axfer#0 | 0,"auction_end" e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - app_global_get_ex // (𝕡) starting_price#0,length#0,axfer#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - assert // check auction_end exists // (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 - // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | app_global_get_ex_value%3#0 e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 - ! // (𝕡) starting_price#0,length#0,axfer#0 | {!} e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%5#0 e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%5#0 # Ensure the auction hasn't already been started\nassert self.auction_end == 0, "auction already ... auction/contract.py:50-51 - assert // auction already started // (𝕡) starting_price#0,length#0,axfer#0 | # Ensure the auction hasn't already been started\nassert self.auction_end == 0, "auction already ... auction/contract.py:50-51 - frame_dig -1 // load axfer#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | axfer#0 axfer.asset_receiver auction/contract.py:55 - gtxns AssetReceiver // (𝕡) starting_price#0,length#0,axfer#0 | {gtxns} axfer.asset_receiver auction/contract.py:55 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0 axfer.asset_receiver auction/contract.py:55 - global CurrentApplicationAddress // (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0,{global} Global.current_application_address auction/contract.py:55 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0,tmp%7#0 Global.current_application_address auction/contract.py:55 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%7#0,tmp%6#0 axfer.asset_receiver == Global.current_application_address auction/contract.py:55 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0,tmp%7#0 axfer.asset_receiver == Global.current_application_address auction/contract.py:55 - == // (𝕡) starting_price#0,length#0,axfer#0 | {==} axfer.asset_receiver == Global.current_application_address auction/contract.py:55 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%8#0 axfer.asset_receiver == Global.current_application_address auction/contract.py:55 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%8#0 # Verify axfer\nassert (\naxfer.asset_receiver == Global.current_application_address\n), "axfer m... auction/contract.py:53-56 - assert // axfer must transfer to this app // (𝕡) starting_price#0,length#0,axfer#0 | # Verify axfer\nassert (\naxfer.asset_receiver == Global.current_application_address\n), "axfer m... auction/contract.py:53-56 - frame_dig -1 // load axfer#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | axfer#0 \nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 - gtxns AssetAmount // (𝕡) starting_price#0,length#0,axfer#0 | {gtxns} \nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 - // virtual: store new_state_value%9#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%9#0 \nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 - byte "asa_amount" // (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%9#0,"asa_amount" # Set global state\nself.asa_amount auction/contract.py:58-59 - swap // load new_state_value%9#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | "asa_amount",new_state_value%9#0 # Set global state\nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 - app_global_put // (𝕡) starting_price#0,length#0,axfer#0 | # Set global state\nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 - global LatestTimestamp // (𝕡) starting_price#0,length#0,axfer#0 | {global} Global.latest_timestamp auction/contract.py:60 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0 Global.latest_timestamp auction/contract.py:60 - frame_dig -2 // load length#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,length#0 length.decode() auction/contract.py:60 - btoi // (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,{btoi} length.decode() auction/contract.py:60 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,tmp%11#0 length.decode() auction/contract.py:60 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%11#0,tmp%10#0 Global.latest_timestamp + length.decode() auction/contract.py:60 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,tmp%11#0 Global.latest_timestamp + length.decode() auction/contract.py:60 - + // (𝕡) starting_price#0,length#0,axfer#0 | {+} Global.latest_timestamp + length.decode() auction/contract.py:60 - // virtual: store new_state_value%12#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%12#0 Global.latest_timestamp + length.decode() auction/contract.py:60 - byte "auction_end" // (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%12#0,"auction_end" self.auction_end auction/contract.py:60 - swap // load new_state_value%12#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | "auction_end",new_state_value%12#0 self.auction_end = Global.latest_timestamp + length.decode() auction/contract.py:60 - app_global_put // (𝕡) starting_price#0,length#0,axfer#0 | self.auction_end = Global.latest_timestamp + length.decode() auction/contract.py:60 - frame_dig -3 // load starting_price#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | starting_price#0 starting_price.decode() auction/contract.py:61 - btoi // (𝕡) starting_price#0,length#0,axfer#0 | {btoi} starting_price.decode() auction/contract.py:61 - // virtual: store new_state_value%13#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%13#0 starting_price.decode() auction/contract.py:61 - byte "previous_bid" // (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%13#0,"previous_bid" self.previous_bid auction/contract.py:61 - swap // load new_state_value%13#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | "previous_bid",new_state_value%13#0 self.previous_bid = starting_price.decode() auction/contract.py:61 - app_global_put // (𝕡) starting_price#0,length#0,axfer#0 | self.previous_bid = starting_price.decode() auction/contract.py:61 + txn Sender // (𝕡) starting_price#0,length#0,axfer#0 | {txn} Txn.sender auction/contract.py:48 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0 Txn.sender auction/contract.py:48 + global CreatorAddress // (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0,{global} Global.creator_address auction/contract.py:48 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0,tmp%1#0 Global.creator_address auction/contract.py:48 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%1#0,tmp%0#0 Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%0#0,tmp%1#0 Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 + == // (𝕡) starting_price#0,length#0,axfer#0 | {==} Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%2#0 Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%2#0 assert Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 + assert // auction must be started by creator // (𝕡) starting_price#0,length#0,axfer#0 | assert Txn.sender == Global.creator_address, "auction must be started by creator" auction/contract.py:48 + int 0 // (𝕡) starting_price#0,length#0,axfer#0 | 0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + byte "auction_end" // (𝕡) starting_price#0,length#0,axfer#0 | 0,"auction_end" e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + app_global_get_ex // (𝕡) starting_price#0,length#0,axfer#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + // virtual: store auction_end_exists%4#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | auction_end_exists%4#0,{app_global_get_ex}.0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + // virtual: store auction_end_value%3#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | auction_end_value%3#0,auction_end_exists%4#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + // virtual: load auction_end_exists%4#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | auction_end_value%3#0,auction_end_exists%4#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + assert // check auction_end exists // (𝕡) starting_price#0,length#0,axfer#0 | auction_end_value%3#0 e the auction hasn't already been started\nassert self.auction_end auction/contract.py:50-51 + // virtual: load auction_end_value%3#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | auction_end_value%3#0 e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 + ! // (𝕡) starting_price#0,length#0,axfer#0 | {!} e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%5#0 e the auction hasn't already been started\nassert self.auction_end == 0 auction/contract.py:50-51 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%5#0 # Ensure the auction hasn't already been started\nassert self.auction_end == 0, "auction already ... auction/contract.py:50-51 + assert // auction already started // (𝕡) starting_price#0,length#0,axfer#0 | # Ensure the auction hasn't already been started\nassert self.auction_end == 0, "auction already ... auction/contract.py:50-51 + frame_dig -1 // load axfer#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | axfer#0 axfer.asset_receiver auction/contract.py:55 + gtxns AssetReceiver // (𝕡) starting_price#0,length#0,axfer#0 | {gtxns} axfer.asset_receiver auction/contract.py:55 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0 axfer.asset_receiver auction/contract.py:55 + global CurrentApplicationAddress // (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0,{global} Global.current_application_address auction/contract.py:55 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0,tmp%7#0 Global.current_application_address auction/contract.py:55 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%7#0,tmp%6#0 axfer.asset_receiver == Global.current_application_address auction/contract.py:55 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%6#0,tmp%7#0 axfer.asset_receiver == Global.current_application_address auction/contract.py:55 + == // (𝕡) starting_price#0,length#0,axfer#0 | {==} axfer.asset_receiver == Global.current_application_address auction/contract.py:55 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%8#0 axfer.asset_receiver == Global.current_application_address auction/contract.py:55 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%8#0 # Verify axfer\nassert (\naxfer.asset_receiver == Global.current_application_address\n), "axfer m... auction/contract.py:53-56 + assert // axfer must transfer to this app // (𝕡) starting_price#0,length#0,axfer#0 | # Verify axfer\nassert (\naxfer.asset_receiver == Global.current_application_address\n), "axfer m... auction/contract.py:53-56 + frame_dig -1 // load axfer#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | axfer#0 \nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 + gtxns AssetAmount // (𝕡) starting_price#0,length#0,axfer#0 | {gtxns} \nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 + // virtual: store new_state_value%9#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%9#0 \nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 + byte "asa_amount" // (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%9#0,"asa_amount" # Set global state\nself.asa_amount auction/contract.py:58-59 + swap // load new_state_value%9#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | "asa_amount",new_state_value%9#0 # Set global state\nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 + app_global_put // (𝕡) starting_price#0,length#0,axfer#0 | # Set global state\nself.asa_amount = axfer.asset_amount auction/contract.py:58-59 + global LatestTimestamp // (𝕡) starting_price#0,length#0,axfer#0 | {global} Global.latest_timestamp auction/contract.py:60 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0 Global.latest_timestamp auction/contract.py:60 + frame_dig -2 // load length#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,length#0 length.decode() auction/contract.py:60 + btoi // (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,{btoi} length.decode() auction/contract.py:60 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,tmp%11#0 length.decode() auction/contract.py:60 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%11#0,tmp%10#0 Global.latest_timestamp + length.decode() auction/contract.py:60 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | tmp%10#0,tmp%11#0 Global.latest_timestamp + length.decode() auction/contract.py:60 + + // (𝕡) starting_price#0,length#0,axfer#0 | {+} Global.latest_timestamp + length.decode() auction/contract.py:60 + // virtual: store new_state_value%12#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%12#0 Global.latest_timestamp + length.decode() auction/contract.py:60 + byte "auction_end" // (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%12#0,"auction_end" self.auction_end auction/contract.py:60 + swap // load new_state_value%12#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | "auction_end",new_state_value%12#0 self.auction_end = Global.latest_timestamp + length.decode() auction/contract.py:60 + app_global_put // (𝕡) starting_price#0,length#0,axfer#0 | self.auction_end = Global.latest_timestamp + length.decode() auction/contract.py:60 + frame_dig -3 // load starting_price#0 from parameters (𝕡) starting_price#0,length#0,axfer#0 | starting_price#0 starting_price.decode() auction/contract.py:61 + btoi // (𝕡) starting_price#0,length#0,axfer#0 | {btoi} starting_price.decode() auction/contract.py:61 + // virtual: store new_state_value%13#0 to l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%13#0 starting_price.decode() auction/contract.py:61 + byte "previous_bid" // (𝕡) starting_price#0,length#0,axfer#0 | new_state_value%13#0,"previous_bid" self.previous_bid auction/contract.py:61 + swap // load new_state_value%13#0 from l-stack (no copy) (𝕡) starting_price#0,length#0,axfer#0 | "previous_bid",new_state_value%13#0 self.previous_bid = starting_price.decode() auction/contract.py:61 + app_global_put // (𝕡) starting_price#0,length#0,axfer#0 | self.previous_bid = starting_price.decode() auction/contract.py:61 retsub // // examples.auction.contract.Auction.opt_in() -> void: opt_in: - proto 0 0 // @arc4.abimethod\ndef opt_in(self) -> None: auction/contract.py:63-64 + proto 0 0 // @arc4.abimethod\ndef opt_in(self) -> None: auction/contract.py:63-64 opt_in_block@0: retsub // @@ -325,222 +325,222 @@ opt_in_block@0: // examples.auction.contract.Auction.bid(pay: uint64) -> void: bid: - proto 1 0 // (𝕡) pay#0 | @arc4.abimethod\ndef bid(self, pay: gtxn.PaymentTransaction) -> None: auction/contract.py:67-68 + proto 1 0 // (𝕡) pay#0 | @arc4.abimethod\ndef bid(self, pay: gtxn.PaymentTransaction) -> None: auction/contract.py:67-68 bid_block@0: - global LatestTimestamp // (𝕡) pay#0 | {global} e auction hasn't ended\nassert Global.latest_timestamp auction/contract.py:69-70 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0 e auction hasn't ended\nassert Global.latest_timestamp auction/contract.py:69-70 - int 0 // (𝕡) pay#0 | tmp%0#0,0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - byte "auction_end" // (𝕡) pay#0 | tmp%0#0,0,"auction_end" \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - app_global_get_ex // (𝕡) pay#0 | tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - assert // check auction_end exists // (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) pay#0 | app_global_get_ex_value%1#0,tmp%0#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) pay#0 | tmp%0#0,app_global_get_ex_value%1#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - < // (𝕡) pay#0 | {<} e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) pay#0 | tmp%3#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) pay#0 | tmp%3#0 # Ensure auction hasn't ended\nassert Global.latest_timestamp < self.auction_end, "auction has en... auction/contract.py:69-70 - assert // auction has ended // (𝕡) pay#0 | # Ensure auction hasn't ended\nassert Global.latest_timestamp < self.auction_end, "auction has en... auction/contract.py:69-70 - frame_dig -1 // load pay#0 from parameters (𝕡) pay#0 | pay#0 y payment transaction\nassert pay.sender auction/contract.py:72-73 - gtxns Sender // (𝕡) pay#0 | {gtxns} y payment transaction\nassert pay.sender auction/contract.py:72-73 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0 y payment transaction\nassert pay.sender auction/contract.py:72-73 - txn Sender // (𝕡) pay#0 | tmp%4#0,{txn} saction\nassert pay.sender == Txn.sender auction/contract.py:72-73 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%5#0 saction\nassert pay.sender == Txn.sender auction/contract.py:72-73 - dig 1 // load tmp%4#0 from l-stack (copy) (𝕡) pay#0 | tmp%4#0,tmp%5#0,tmp%4#0 y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 - swap // load tmp%5#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%4#0,tmp%5#0 y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 - == // (𝕡) pay#0 | tmp%4#0,{==} y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%6#0 y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%6#0 # Verify payment transaction\nassert pay.sender == Txn.sender, "payment sender must match transac... auction/contract.py:72-73 - assert // payment sender must match transaction sender // (𝕡) pay#0 | tmp%4#0 # Verify payment transaction\nassert pay.sender == Txn.sender, "payment sender must match transac... auction/contract.py:72-73 - frame_dig -1 // load pay#0 from parameters (𝕡) pay#0 | tmp%4#0,pay#0 pay.amount auction/contract.py:74 - gtxns Amount // (𝕡) pay#0 | tmp%4#0,{gtxns} pay.amount auction/contract.py:74 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0 pay.amount auction/contract.py:74 - int 0 // (𝕡) pay#0 | tmp%4#0,tmp%7#0,0 self.previous_bid auction/contract.py:74 - byte "previous_bid" // (𝕡) pay#0 | tmp%4#0,tmp%7#0,0,"previous_bid" self.previous_bid auction/contract.py:74 - app_global_get_ex // (𝕡) pay#0 | tmp%4#0,tmp%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bid auction/contract.py:74 - // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.previous_bid auction/contract.py:74 - // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:74 - // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:74 - assert // check previous_bid exists // (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0 self.previous_bid auction/contract.py:74 - dig 1 // load tmp%7#0 from l-stack (copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,app_global_get_ex_value%8#0,tmp%7#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 - swap // load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,tmp%7#0,app_global_get_ex_value%8#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 - > // (𝕡) pay#0 | tmp%4#0,tmp%7#0,{>} pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,tmp%10#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,tmp%10#0 assert pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 - assert // Bid must be higher than previous bid // (𝕡) pay#0 | tmp%4#0,tmp%7#0 assert pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 - byte "previous_bid" // (𝕡) pay#0 | tmp%4#0,tmp%7#0,"previous_bid" # set global state\nself.previous_bid auction/contract.py:76-77 - dig 1 // load tmp%7#0 from l-stack (copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,"previous_bid",tmp%7#0 # set global state\nself.previous_bid = pay.amount auction/contract.py:76-77 - app_global_put // (𝕡) pay#0 | tmp%4#0,tmp%7#0 # set global state\nself.previous_bid = pay.amount auction/contract.py:76-77 - byte "previous_bidder" // (𝕡) pay#0 | tmp%4#0,tmp%7#0,"previous_bidder" self.previous_bidder auction/contract.py:78 - uncover 2 // load tmp%4#0 from l-stack (no copy) (𝕡) pay#0 | tmp%7#0,"previous_bidder",tmp%4#0 self.previous_bidder = pay.sender auction/contract.py:78 - app_global_put // (𝕡) pay#0 | tmp%7#0 self.previous_bidder = pay.sender auction/contract.py:78 - txn Sender // (𝕡) pay#0 | tmp%7#0,{txn} unt\nself.claimable_amount[Txn.sender auction/contract.py:80-81 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) pay#0 | tmp%7#0,tmp%14#0 unt\nself.claimable_amount[Txn.sender auction/contract.py:80-81 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pay#0 | tmp%7#0,tmp%14#0 # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 - byte "claim" // (𝕡) pay#0 | tmp%7#0,tmp%14#0,"claim" # Update claimable amount\nself.claimable_amount[Txn.sender] auction/contract.py:80-81 - uncover 2 // load tmp%7#0 from l-stack (no copy) (𝕡) pay#0 | tmp%14#0,"claim",tmp%7#0 # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 - app_local_put // (𝕡) pay#0 | # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 + global LatestTimestamp // (𝕡) pay#0 | {global} e auction hasn't ended\nassert Global.latest_timestamp auction/contract.py:69-70 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0 e auction hasn't ended\nassert Global.latest_timestamp auction/contract.py:69-70 + int 0 // (𝕡) pay#0 | tmp%0#0,0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + byte "auction_end" // (𝕡) pay#0 | tmp%0#0,0,"auction_end" \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + app_global_get_ex // (𝕡) pay#0 | tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + // virtual: store auction_end_exists%2#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0,auction_end_exists%2#0,{app_global_get_ex}.0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + // virtual: store auction_end_value%1#0 to l-stack (no copy) (𝕡) pay#0 | tmp%0#0,auction_end_value%1#0,auction_end_exists%2#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + // virtual: load auction_end_exists%2#0 from l-stack (no copy) (𝕡) pay#0 | tmp%0#0,auction_end_value%1#0,auction_end_exists%2#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + assert // check auction_end exists // (𝕡) pay#0 | tmp%0#0,auction_end_value%1#0 \nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) pay#0 | auction_end_value%1#0,tmp%0#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + // virtual: load auction_end_value%1#0 from l-stack (no copy) (𝕡) pay#0 | tmp%0#0,auction_end_value%1#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + < // (𝕡) pay#0 | {<} e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) pay#0 | tmp%3#0 e auction hasn't ended\nassert Global.latest_timestamp < self.auction_end auction/contract.py:69-70 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) pay#0 | tmp%3#0 # Ensure auction hasn't ended\nassert Global.latest_timestamp < self.auction_end, "auction has en... auction/contract.py:69-70 + assert // auction has ended // (𝕡) pay#0 | # Ensure auction hasn't ended\nassert Global.latest_timestamp < self.auction_end, "auction has en... auction/contract.py:69-70 + frame_dig -1 // load pay#0 from parameters (𝕡) pay#0 | pay#0 y payment transaction\nassert pay.sender auction/contract.py:72-73 + gtxns Sender // (𝕡) pay#0 | {gtxns} y payment transaction\nassert pay.sender auction/contract.py:72-73 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0 y payment transaction\nassert pay.sender auction/contract.py:72-73 + txn Sender // (𝕡) pay#0 | tmp%4#0,{txn} saction\nassert pay.sender == Txn.sender auction/contract.py:72-73 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%5#0 saction\nassert pay.sender == Txn.sender auction/contract.py:72-73 + dig 1 // load tmp%4#0 from l-stack (copy) (𝕡) pay#0 | tmp%4#0,tmp%5#0,tmp%4#0 y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 + swap // load tmp%5#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%4#0,tmp%5#0 y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 + == // (𝕡) pay#0 | tmp%4#0,{==} y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%6#0 y payment transaction\nassert pay.sender == Txn.sender auction/contract.py:72-73 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%6#0 # Verify payment transaction\nassert pay.sender == Txn.sender, "payment sender must match transac... auction/contract.py:72-73 + assert // payment sender must match transaction sender // (𝕡) pay#0 | tmp%4#0 # Verify payment transaction\nassert pay.sender == Txn.sender, "payment sender must match transac... auction/contract.py:72-73 + frame_dig -1 // load pay#0 from parameters (𝕡) pay#0 | tmp%4#0,pay#0 pay.amount auction/contract.py:74 + gtxns Amount // (𝕡) pay#0 | tmp%4#0,{gtxns} pay.amount auction/contract.py:74 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0 pay.amount auction/contract.py:74 + int 0 // (𝕡) pay#0 | tmp%4#0,tmp%7#0,0 self.previous_bid auction/contract.py:74 + byte "previous_bid" // (𝕡) pay#0 | tmp%4#0,tmp%7#0,0,"previous_bid" self.previous_bid auction/contract.py:74 + app_global_get_ex // (𝕡) pay#0 | tmp%4#0,tmp%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bid auction/contract.py:74 + // virtual: store previous_bid_exists%9#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,previous_bid_exists%9#0,{app_global_get_ex}.0 self.previous_bid auction/contract.py:74 + // virtual: store previous_bid_value%8#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,previous_bid_value%8#0,previous_bid_exists%9#0 self.previous_bid auction/contract.py:74 + // virtual: load previous_bid_exists%9#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,previous_bid_value%8#0,previous_bid_exists%9#0 self.previous_bid auction/contract.py:74 + assert // check previous_bid exists // (𝕡) pay#0 | tmp%4#0,tmp%7#0,previous_bid_value%8#0 self.previous_bid auction/contract.py:74 + dig 1 // load tmp%7#0 from l-stack (copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,previous_bid_value%8#0,tmp%7#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 + swap // load previous_bid_value%8#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,tmp%7#0,previous_bid_value%8#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 + > // (𝕡) pay#0 | tmp%4#0,tmp%7#0,{>} pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,tmp%10#0 pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,tmp%10#0 assert pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 + assert // Bid must be higher than previous bid // (𝕡) pay#0 | tmp%4#0,tmp%7#0 assert pay.amount > self.previous_bid, "Bid must be higher than previous bid" auction/contract.py:74 + byte "previous_bid" // (𝕡) pay#0 | tmp%4#0,tmp%7#0,"previous_bid" # set global state\nself.previous_bid auction/contract.py:76-77 + dig 1 // load tmp%7#0 from l-stack (copy) (𝕡) pay#0 | tmp%4#0,tmp%7#0,"previous_bid",tmp%7#0 # set global state\nself.previous_bid = pay.amount auction/contract.py:76-77 + app_global_put // (𝕡) pay#0 | tmp%4#0,tmp%7#0 # set global state\nself.previous_bid = pay.amount auction/contract.py:76-77 + byte "previous_bidder" // (𝕡) pay#0 | tmp%4#0,tmp%7#0,"previous_bidder" self.previous_bidder auction/contract.py:78 + uncover 2 // load tmp%4#0 from l-stack (no copy) (𝕡) pay#0 | tmp%7#0,"previous_bidder",tmp%4#0 self.previous_bidder = pay.sender auction/contract.py:78 + app_global_put // (𝕡) pay#0 | tmp%7#0 self.previous_bidder = pay.sender auction/contract.py:78 + txn Sender // (𝕡) pay#0 | tmp%7#0,{txn} unt\nself.claimable_amount[Txn.sender auction/contract.py:80-81 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) pay#0 | tmp%7#0,tmp%14#0 unt\nself.claimable_amount[Txn.sender auction/contract.py:80-81 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) pay#0 | tmp%7#0,tmp%14#0 # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 + byte "claim" // (𝕡) pay#0 | tmp%7#0,tmp%14#0,"claim" # Update claimable amount\nself.claimable_amount[Txn.sender] auction/contract.py:80-81 + uncover 2 // load tmp%7#0 from l-stack (no copy) (𝕡) pay#0 | tmp%14#0,"claim",tmp%7#0 # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 + app_local_put // (𝕡) pay#0 | # Update claimable amount\nself.claimable_amount[Txn.sender] = pay.amount auction/contract.py:80-81 retsub // // examples.auction.contract.Auction.claim_bids() -> void: claim_bids: - proto 0 0 // @arc4.abimethod\ndef claim_bids(self) -> None: auction/contract.py:83-84 + proto 0 0 // @arc4.abimethod\ndef claim_bids(self) -> None: auction/contract.py:83-84 claim_bids_block@0: - txn Sender // {txn} Txn.sender auction/contract.py:85 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender auction/contract.py:85 - // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 self.claimable_amount[Txn.sender] auction/contract.py:85 - int 0 // tmp%0#0,0 self.claimable_amount[Txn.sender] auction/contract.py:85 - byte "claim" // tmp%0#0,0,"claim" self.claimable_amount[Txn.sender] auction/contract.py:85 - app_local_get_ex // {app_local_get_ex}.0,{app_local_get_ex}.1 self.claimable_amount[Txn.sender] auction/contract.py:85 - swap // store app_local_get_ex_did_exist%2#0 to l-stack (no copy) app_local_get_ex_did_exist%2#0,{app_local_get_ex}.0 self.claimable_amount[Txn.sender] auction/contract.py:85 + txn Sender // {txn} Txn.sender auction/contract.py:85 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender auction/contract.py:85 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 self.claimable_amount[Txn.sender] auction/contract.py:85 + int 0 // tmp%0#0,0 self.claimable_amount[Txn.sender] auction/contract.py:85 + byte "claim" // tmp%0#0,0,"claim" self.claimable_amount[Txn.sender] auction/contract.py:85 + app_local_get_ex // {app_local_get_ex}.0,{app_local_get_ex}.1 self.claimable_amount[Txn.sender] auction/contract.py:85 + swap // store claimable_amount_exists%2#0 to l-stack (no copy) claimable_amount_exists%2#0,{app_local_get_ex}.0 self.claimable_amount[Txn.sender] auction/contract.py:85 dup - cover 2 // store original_amount#0 to l-stack (copy) original_amount#0,app_local_get_ex_did_exist%2#0,original_amount#0 self.claimable_amount[Txn.sender] auction/contract.py:85 - cover 2 // store original_amount#0 to f-stack (𝕗) original_amount#0 | original_amount#0,app_local_get_ex_did_exist%2#0 self.claimable_amount[Txn.sender] auction/contract.py:85 - // virtual: load app_local_get_ex_did_exist%2#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,app_local_get_ex_did_exist%2#0 self.claimable_amount[Txn.sender] auction/contract.py:85 - assert // check claimable_amount exists for account // (𝕗) original_amount#0 | original_amount#0 self.claimable_amount[Txn.sender] auction/contract.py:85 - txn Sender // (𝕗) original_amount#0 | original_amount#0,{txn} ubtract previous bid if sender is previous bidder\nif Txn.sender auction/contract.py:87-88 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0 ubtract previous bid if sender is previous bidder\nif Txn.sender auction/contract.py:87-88 - int 0 // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - byte "previous_bidder" // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,0,"previous_bidder" us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - app_global_get_ex // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,{app_global_get_ex}.0,{app_global_get_ex}.1 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - // virtual: store app_global_get_ex_did_exist%6#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_did_exist%6#0,{app_global_get_ex}.0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - // virtual: store app_global_get_ex_value%5#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - // virtual: load app_global_get_ex_did_exist%6#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - assert // check previous_bidder exists // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,app_global_get_ex_value%5#0,tmp%4#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - // virtual: load app_global_get_ex_value%5#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,app_global_get_ex_value%5#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - == // (𝕗) original_amount#0 | original_amount#0,{==} ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%7#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + cover 2 // store original_amount#0 to l-stack (copy) original_amount#0,claimable_amount_exists%2#0,original_amount#0 self.claimable_amount[Txn.sender] auction/contract.py:85 + cover 2 // store original_amount#0 to f-stack (𝕗) original_amount#0 | original_amount#0,claimable_amount_exists%2#0 self.claimable_amount[Txn.sender] auction/contract.py:85 + // virtual: load claimable_amount_exists%2#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,claimable_amount_exists%2#0 self.claimable_amount[Txn.sender] auction/contract.py:85 + assert // check claimable_amount exists for account // (𝕗) original_amount#0 | original_amount#0 self.claimable_amount[Txn.sender] auction/contract.py:85 + txn Sender // (𝕗) original_amount#0 | original_amount#0,{txn} ubtract previous bid if sender is previous bidder\nif Txn.sender auction/contract.py:87-88 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0 ubtract previous bid if sender is previous bidder\nif Txn.sender auction/contract.py:87-88 + int 0 // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + byte "previous_bidder" // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,0,"previous_bidder" us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + app_global_get_ex // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,{app_global_get_ex}.0,{app_global_get_ex}.1 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + // virtual: store previous_bidder_exists%6#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,previous_bidder_exists%6#0,{app_global_get_ex}.0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + // virtual: store previous_bidder_value%5#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,previous_bidder_value%5#0,previous_bidder_exists%6#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + // virtual: load previous_bidder_exists%6#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,previous_bidder_value%5#0,previous_bidder_exists%6#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + assert // check previous_bidder exists // (𝕗) original_amount#0 | original_amount#0,tmp%4#0,previous_bidder_value%5#0 us bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,previous_bidder_value%5#0,tmp%4#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + // virtual: load previous_bidder_value%5#0 from l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%4#0,previous_bidder_value%5#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + == // (𝕗) original_amount#0 | original_amount#0,{==} ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) original_amount#0 | original_amount#0,tmp%7#0 ubtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder auction/contract.py:87-88 // virtual: load original_amount#0 from l-stack (no copy) (𝕗) original_amount#0 | tmp%7#0,original_amount#0 // virtual: store amount#1 to f-stack (𝕗) original_amount#0,amount#1 | tmp%7#0 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | tmp%7#0 # subtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder: auction/contract.py:87-88 - bz claim_bids_after_if_else@2 // (𝕗) original_amount#0,amount#1 | # subtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder: auction/contract.py:87-88 - // Implicit fall through to claim_bids_if_body@1 // (𝕗) original_amount#0,amount#1 | # subtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder: auction/contract.py:87-88 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | tmp%7#0 # subtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder: auction/contract.py:87-88 + bz claim_bids_after_if_else@2 // (𝕗) original_amount#0,amount#1 | # subtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder: auction/contract.py:87-88 + // Implicit fall through to claim_bids_if_body@1 // (𝕗) original_amount#0,amount#1 | # subtract previous bid if sender is previous bidder\nif Txn.sender == self.previous_bidder: auction/contract.py:87-88 claim_bids_if_body@1: - int 0 // (𝕗) original_amount#0,amount#1 | 0 self.previous_bid auction/contract.py:89 - byte "previous_bid" // (𝕗) original_amount#0,amount#1 | 0,"previous_bid" self.previous_bid auction/contract.py:89 - app_global_get_ex // (𝕗) original_amount#0,amount#1 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bid auction/contract.py:89 - // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.previous_bid auction/contract.py:89 - // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:89 - // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bid auction/contract.py:89 - assert // check previous_bid exists // (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0 self.previous_bid auction/contract.py:89 - frame_dig 0 // load original_amount#0 from f-stack (𝕗) original_amount#0,amount#1 | app_global_get_ex_value%8#0,original_amount#0 amount -= self.previous_bid auction/contract.py:89 - swap // load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | original_amount#0,app_global_get_ex_value%8#0 amount -= self.previous_bid auction/contract.py:89 - - // (𝕗) original_amount#0,amount#1 | {-} amount -= self.previous_bid auction/contract.py:89 - frame_bury 1 // store amount#1 to f-stack (𝕗) original_amount#0,amount#1 | amount -= self.previous_bid auction/contract.py:89 - // Implicit fall through to claim_bids_after_if_else@2 // (𝕗) original_amount#0,amount#1 | + int 0 // (𝕗) original_amount#0,amount#1 | 0 self.previous_bid auction/contract.py:89 + byte "previous_bid" // (𝕗) original_amount#0,amount#1 | 0,"previous_bid" self.previous_bid auction/contract.py:89 + app_global_get_ex // (𝕗) original_amount#0,amount#1 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bid auction/contract.py:89 + // virtual: store previous_bid_exists%9#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | previous_bid_exists%9#0,{app_global_get_ex}.0 self.previous_bid auction/contract.py:89 + // virtual: store previous_bid_value%8#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | previous_bid_value%8#0,previous_bid_exists%9#0 self.previous_bid auction/contract.py:89 + // virtual: load previous_bid_exists%9#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | previous_bid_value%8#0,previous_bid_exists%9#0 self.previous_bid auction/contract.py:89 + assert // check previous_bid exists // (𝕗) original_amount#0,amount#1 | previous_bid_value%8#0 self.previous_bid auction/contract.py:89 + frame_dig 0 // load original_amount#0 from f-stack (𝕗) original_amount#0,amount#1 | previous_bid_value%8#0,original_amount#0 amount -= self.previous_bid auction/contract.py:89 + swap // load previous_bid_value%8#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | original_amount#0,previous_bid_value%8#0 amount -= self.previous_bid auction/contract.py:89 + - // (𝕗) original_amount#0,amount#1 | {-} amount -= self.previous_bid auction/contract.py:89 + frame_bury 1 // store amount#1 to f-stack (𝕗) original_amount#0,amount#1 | amount -= self.previous_bid auction/contract.py:89 + // Implicit fall through to claim_bids_after_if_else@2 // (𝕗) original_amount#0,amount#1 | claim_bids_after_if_else@2: - itxn_begin // (𝕗) original_amount#0,amount#1 | itxn.Payment(\nfee=0,\namount=amount,\nreceiver=Txn.sender,\n).submit() auction/contract.py:91-95 - txn Sender // (𝕗) original_amount#0,amount#1 | {txn} Txn.sender auction/contract.py:94 - // virtual: store inner_txn_params%11%%param_Receiver_idx_0#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | inner_txn_params%11%%param_Receiver_idx_0#0 Txn.sender auction/contract.py:94 - int pay // (𝕗) original_amount#0,amount#1 | inner_txn_params%11%%param_Receiver_idx_0#0,pay itxn.Payment auction/contract.py:91 - itxn_field TypeEnum // (𝕗) original_amount#0,amount#1 | inner_txn_params%11%%param_Receiver_idx_0#0 + itxn_begin // (𝕗) original_amount#0,amount#1 | itxn.Payment(\nfee=0,\namount=amount,\nreceiver=Txn.sender,\n).submit() auction/contract.py:91-95 + txn Sender // (𝕗) original_amount#0,amount#1 | {txn} Txn.sender auction/contract.py:94 + // virtual: store inner_txn_params%11%%param_Receiver_idx_0#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | inner_txn_params%11%%param_Receiver_idx_0#0 Txn.sender auction/contract.py:94 + int pay // (𝕗) original_amount#0,amount#1 | inner_txn_params%11%%param_Receiver_idx_0#0,pay itxn.Payment auction/contract.py:91 + itxn_field TypeEnum // (𝕗) original_amount#0,amount#1 | inner_txn_params%11%%param_Receiver_idx_0#0 // virtual: load inner_txn_params%11%%param_Receiver_idx_0#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | inner_txn_params%11%%param_Receiver_idx_0#0 - itxn_field Receiver // (𝕗) original_amount#0,amount#1 | - int 0 // (𝕗) original_amount#0,amount#1 | 0 0 auction/contract.py:92 - itxn_field Fee // (𝕗) original_amount#0,amount#1 | - frame_dig 1 // load amount#1 from f-stack (𝕗) original_amount#0,amount#1 | amount#1 - dup // store amount#1 to l-stack (copy) (𝕗) original_amount#0,amount#1 | amount#1,amount#1 - itxn_field Amount // (𝕗) original_amount#0,amount#1 | amount#1 - itxn_submit // (𝕗) original_amount#0,amount#1 | amount#1 itxn.Payment(\nfee=0,\namount=amount,\nreceiver=Txn.sender,\n).submit() auction/contract.py:91-95 - frame_dig 0 // load original_amount#0 from f-stack (𝕗) original_amount#0,amount#1 | amount#1,original_amount#0 original_amount - amount auction/contract.py:97 - swap // load amount#1 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | original_amount#0,amount#1 original_amount - amount auction/contract.py:97 - - // (𝕗) original_amount#0,amount#1 | {-} original_amount - amount auction/contract.py:97 - // virtual: store new_state_value%12#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0 original_amount - amount auction/contract.py:97 - txn Sender // (𝕗) original_amount#0,amount#1 | new_state_value%12#0,{txn} Txn.sender auction/contract.py:97 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0 Txn.sender auction/contract.py:97 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0 self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 - byte "claim" // (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0,"claim" self.claimable_amount[Txn.sender] auction/contract.py:97 - uncover 2 // load new_state_value%12#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | tmp%13#0,"claim",new_state_value%12#0 self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 - app_local_put // (𝕗) original_amount#0,amount#1 | self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 + itxn_field Receiver // (𝕗) original_amount#0,amount#1 | + int 0 // (𝕗) original_amount#0,amount#1 | 0 0 auction/contract.py:92 + itxn_field Fee // (𝕗) original_amount#0,amount#1 | + frame_dig 1 // load amount#1 from f-stack (𝕗) original_amount#0,amount#1 | amount#1 + dup // store amount#1 to l-stack (copy) (𝕗) original_amount#0,amount#1 | amount#1,amount#1 + itxn_field Amount // (𝕗) original_amount#0,amount#1 | amount#1 + itxn_submit // (𝕗) original_amount#0,amount#1 | amount#1 itxn.Payment(\nfee=0,\namount=amount,\nreceiver=Txn.sender,\n).submit() auction/contract.py:91-95 + frame_dig 0 // load original_amount#0 from f-stack (𝕗) original_amount#0,amount#1 | amount#1,original_amount#0 original_amount - amount auction/contract.py:97 + swap // load amount#1 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | original_amount#0,amount#1 original_amount - amount auction/contract.py:97 + - // (𝕗) original_amount#0,amount#1 | {-} original_amount - amount auction/contract.py:97 + // virtual: store new_state_value%12#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0 original_amount - amount auction/contract.py:97 + txn Sender // (𝕗) original_amount#0,amount#1 | new_state_value%12#0,{txn} Txn.sender auction/contract.py:97 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0 Txn.sender auction/contract.py:97 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0 self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 + byte "claim" // (𝕗) original_amount#0,amount#1 | new_state_value%12#0,tmp%13#0,"claim" self.claimable_amount[Txn.sender] auction/contract.py:97 + uncover 2 // load new_state_value%12#0 from l-stack (no copy) (𝕗) original_amount#0,amount#1 | tmp%13#0,"claim",new_state_value%12#0 self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 + app_local_put // (𝕗) original_amount#0,amount#1 | self.claimable_amount[Txn.sender] = original_amount - amount auction/contract.py:97 retsub // // examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: claim_asset: - proto 1 0 // (𝕡) asset#0 | @arc4.abimethod\ndef claim_asset(self, asset: Asset) -> None: auction/contract.py:99-100 + proto 1 0 // (𝕡) asset#0 | @arc4.abimethod\ndef claim_asset(self, asset: Asset) -> None: auction/contract.py:99-100 claim_asset_block@0: - global LatestTimestamp // (𝕡) asset#0 | {global} Global.latest_timestamp auction/contract.py:101 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 Global.latest_timestamp auction/contract.py:101 - int 0 // (𝕡) asset#0 | tmp%0#0,0 self.auction_end auction/contract.py:101 - byte "auction_end" // (𝕡) asset#0 | tmp%0#0,0,"auction_end" self.auction_end auction/contract.py:101 - app_global_get_ex // (𝕡) asset#0 | tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.auction_end auction/contract.py:101 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.auction_end auction/contract.py:101 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.auction_end auction/contract.py:101 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.auction_end auction/contract.py:101 - assert // check auction_end exists // (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0 self.auction_end auction/contract.py:101 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%1#0,tmp%0#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 - // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,app_global_get_ex_value%1#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 - > // (𝕡) asset#0 | {>} Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) asset#0 | tmp%3#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) asset#0 | tmp%3#0 assert Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 - assert // auction has not ended // (𝕡) asset#0 | assert Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 - itxn_begin // (𝕡) asset#0 | # Send ASA to previous bidder\nitxn.AssetTransfer(\nfee=0,\nxfer_asset=asset,\nasset_close_to=sel... auction/contract.py:102-109 - int 0 // (𝕡) asset#0 | 0 self.asa_amount auction/contract.py:108 - byte "asa_amount" // (𝕡) asset#0 | 0,"asa_amount" self.asa_amount auction/contract.py:108 - app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa_amount auction/contract.py:108 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.asa_amount auction/contract.py:108 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asa_amount auction/contract.py:108 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.asa_amount auction/contract.py:108 - assert // check asa_amount exists // (𝕡) asset#0 | app_global_get_ex_value%6#0 self.asa_amount auction/contract.py:108 - int 0 // (𝕡) asset#0 | app_global_get_ex_value%6#0,0 self.previous_bidder auction/contract.py:106 - byte "previous_bidder" // (𝕡) asset#0 | app_global_get_ex_value%6#0,0,"previous_bidder" self.previous_bidder auction/contract.py:106 - app_global_get_ex // (𝕡) asset#0 | app_global_get_ex_value%6#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bidder auction/contract.py:106 - // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.previous_bidder auction/contract.py:106 - // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bidder auction/contract.py:106 - // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.previous_bidder auction/contract.py:106 - assert // check previous_bidder exists // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0 self.previous_bidder auction/contract.py:106 - int 0 // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,0 self.previous_bidder auction/contract.py:107 - byte "previous_bidder" // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,0,"previous_bidder" self.previous_bidder auction/contract.py:107 - app_global_get_ex // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bidder auction/contract.py:107 - // virtual: store app_global_get_ex_did_exist%11#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%11#0,{app_global_get_ex}.0 self.previous_bidder auction/contract.py:107 - // virtual: store app_global_get_ex_value%10#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.previous_bidder auction/contract.py:107 - // virtual: load app_global_get_ex_did_exist%11#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,app_global_get_ex_did_exist%11#0 self.previous_bidder auction/contract.py:107 - assert // check previous_bidder exists // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 self.previous_bidder auction/contract.py:107 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,asset#0 - itxn_field XferAsset // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 - int axfer // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,axfer # Send ASA to previous bidder\nitxn.AssetTransfer auction/contract.py:102-103 - itxn_field TypeEnum // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 - int 0 // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0,0 0 auction/contract.py:104 - itxn_field Fee // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 - // virtual: load app_global_get_ex_value%10#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0,app_global_get_ex_value%10#0 - itxn_field AssetReceiver // (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0 - // virtual: load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0,app_global_get_ex_value%8#0 - itxn_field AssetCloseTo // (𝕡) asset#0 | app_global_get_ex_value%6#0 - // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%6#0 - itxn_field AssetAmount // (𝕡) asset#0 | - itxn_submit // (𝕡) asset#0 | # Send ASA to previous bidder\nitxn.AssetTransfer(\nfee=0,\nxfer_asset=asset,\nasset_close_to=sel... auction/contract.py:102-109 + global LatestTimestamp // (𝕡) asset#0 | {global} Global.latest_timestamp auction/contract.py:101 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 Global.latest_timestamp auction/contract.py:101 + int 0 // (𝕡) asset#0 | tmp%0#0,0 self.auction_end auction/contract.py:101 + byte "auction_end" // (𝕡) asset#0 | tmp%0#0,0,"auction_end" self.auction_end auction/contract.py:101 + app_global_get_ex // (𝕡) asset#0 | tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.auction_end auction/contract.py:101 + // virtual: store auction_end_exists%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,auction_end_exists%2#0,{app_global_get_ex}.0 self.auction_end auction/contract.py:101 + // virtual: store auction_end_value%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,auction_end_value%1#0,auction_end_exists%2#0 self.auction_end auction/contract.py:101 + // virtual: load auction_end_exists%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,auction_end_value%1#0,auction_end_exists%2#0 self.auction_end auction/contract.py:101 + assert // check auction_end exists // (𝕡) asset#0 | tmp%0#0,auction_end_value%1#0 self.auction_end auction/contract.py:101 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | auction_end_value%1#0,tmp%0#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 + // virtual: load auction_end_value%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,auction_end_value%1#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 + > // (𝕡) asset#0 | {>} Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) asset#0 | tmp%3#0 Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) asset#0 | tmp%3#0 assert Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 + assert // auction has not ended // (𝕡) asset#0 | assert Global.latest_timestamp > self.auction_end, "auction has not ended" auction/contract.py:101 + itxn_begin // (𝕡) asset#0 | # Send ASA to previous bidder\nitxn.AssetTransfer(\nfee=0,\nxfer_asset=asset,\nasset_close_to=sel... auction/contract.py:102-109 + int 0 // (𝕡) asset#0 | 0 self.asa_amount auction/contract.py:108 + byte "asa_amount" // (𝕡) asset#0 | 0,"asa_amount" self.asa_amount auction/contract.py:108 + app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa_amount auction/contract.py:108 + // virtual: store asa_amount_exists%7#0 to l-stack (no copy) (𝕡) asset#0 | asa_amount_exists%7#0,{app_global_get_ex}.0 self.asa_amount auction/contract.py:108 + // virtual: store asa_amount_value%6#0 to l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,asa_amount_exists%7#0 self.asa_amount auction/contract.py:108 + // virtual: load asa_amount_exists%7#0 from l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,asa_amount_exists%7#0 self.asa_amount auction/contract.py:108 + assert // check asa_amount exists // (𝕡) asset#0 | asa_amount_value%6#0 self.asa_amount auction/contract.py:108 + int 0 // (𝕡) asset#0 | asa_amount_value%6#0,0 self.previous_bidder auction/contract.py:106 + byte "previous_bidder" // (𝕡) asset#0 | asa_amount_value%6#0,0,"previous_bidder" self.previous_bidder auction/contract.py:106 + app_global_get_ex // (𝕡) asset#0 | asa_amount_value%6#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bidder auction/contract.py:106 + // virtual: store previous_bidder_exists%9#0 to l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_exists%9#0,{app_global_get_ex}.0 self.previous_bidder auction/contract.py:106 + // virtual: store previous_bidder_value%8#0 to l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_exists%9#0 self.previous_bidder auction/contract.py:106 + // virtual: load previous_bidder_exists%9#0 from l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_exists%9#0 self.previous_bidder auction/contract.py:106 + assert // check previous_bidder exists // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0 self.previous_bidder auction/contract.py:106 + int 0 // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,0 self.previous_bidder auction/contract.py:107 + byte "previous_bidder" // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,0,"previous_bidder" self.previous_bidder auction/contract.py:107 + app_global_get_ex // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.previous_bidder auction/contract.py:107 + // virtual: store previous_bidder_exists%11#0 to l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_exists%11#0,{app_global_get_ex}.0 self.previous_bidder auction/contract.py:107 + // virtual: store previous_bidder_value%10#0 to l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0,previous_bidder_exists%11#0 self.previous_bidder auction/contract.py:107 + // virtual: load previous_bidder_exists%11#0 from l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0,previous_bidder_exists%11#0 self.previous_bidder auction/contract.py:107 + assert // check previous_bidder exists // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0 self.previous_bidder auction/contract.py:107 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0,asset#0 + itxn_field XferAsset // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0 + int axfer // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0,axfer # Send ASA to previous bidder\nitxn.AssetTransfer auction/contract.py:102-103 + itxn_field TypeEnum // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0 + int 0 // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0,0 0 auction/contract.py:104 + itxn_field Fee // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0 + // virtual: load previous_bidder_value%10#0 from l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0,previous_bidder_value%10#0 + itxn_field AssetReceiver // (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0 + // virtual: load previous_bidder_value%8#0 from l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0,previous_bidder_value%8#0 + itxn_field AssetCloseTo // (𝕡) asset#0 | asa_amount_value%6#0 + // virtual: load asa_amount_value%6#0 from l-stack (no copy) (𝕡) asset#0 | asa_amount_value%6#0 + itxn_field AssetAmount // (𝕡) asset#0 | + itxn_submit // (𝕡) asset#0 | # Send ASA to previous bidder\nitxn.AssetTransfer(\nfee=0,\nxfer_asset=asset,\nasset_close_to=sel... auction/contract.py:102-109 retsub // // examples.auction.contract.Auction.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: auction/contract.py:16 + proto 0 0 // def __init__(self) -> None: auction/contract.py:16 __init___block@0: - byte "auction_end" // "auction_end" self.auction_end auction/contract.py:17 - int 0 // "auction_end",0 0 auction/contract.py:17 - app_global_put // self.auction_end = UInt64(0) auction/contract.py:17 - byte "previous_bid" // "previous_bid" self.previous_bid auction/contract.py:18 - int 0 // "previous_bid",0 0 auction/contract.py:18 - app_global_put // self.previous_bid = UInt64(0) auction/contract.py:18 - byte "asa_amount" // "asa_amount" self.asa_amount auction/contract.py:19 - int 0 // "asa_amount",0 0 auction/contract.py:19 - app_global_put // self.asa_amount = UInt64(0) auction/contract.py:19 - byte "asa" // "asa" self.asa auction/contract.py:20 - int 0 // "asa",0 0 auction/contract.py:20 - app_global_put // self.asa = Asset(0) auction/contract.py:20 - global ZeroAddress // {global} er than an empty string for Account type safety\nself.previous_bidder = Global.zero_address auction/contract.py:21-22 - // virtual: store new_state_value%0#0 to l-stack (no copy) new_state_value%0#0 er than an empty string for Account type safety\nself.previous_bidder = Global.zero_address auction/contract.py:21-22 - byte "previous_bidder" // new_state_value%0#0,"previous_bidder" # Use zero address rather than an empty string for Account type safety\nself.previous_bidder auction/contract.py:21-22 - swap // load new_state_value%0#0 from l-stack (no copy) "previous_bidder",new_state_value%0#0 # Use zero address rather than an empty string for Account type safety\nself.previous_bidder = Gl... auction/contract.py:21-22 - app_global_put // # Use zero address rather than an empty string for Account type safety\nself.previous_bidder = Gl... auction/contract.py:21-22 + byte "auction_end" // "auction_end" self.auction_end auction/contract.py:17 + int 0 // "auction_end",0 0 auction/contract.py:17 + app_global_put // self.auction_end = UInt64(0) auction/contract.py:17 + byte "previous_bid" // "previous_bid" self.previous_bid auction/contract.py:18 + int 0 // "previous_bid",0 0 auction/contract.py:18 + app_global_put // self.previous_bid = UInt64(0) auction/contract.py:18 + byte "asa_amount" // "asa_amount" self.asa_amount auction/contract.py:19 + int 0 // "asa_amount",0 0 auction/contract.py:19 + app_global_put // self.asa_amount = UInt64(0) auction/contract.py:19 + byte "asa" // "asa" self.asa auction/contract.py:20 + int 0 // "asa",0 0 auction/contract.py:20 + app_global_put // self.asa = Asset(0) auction/contract.py:20 + global ZeroAddress // {global} er than an empty string for Account type safety\nself.previous_bidder = Global.zero_address auction/contract.py:21-22 + // virtual: store new_state_value%0#0 to l-stack (no copy) new_state_value%0#0 er than an empty string for Account type safety\nself.previous_bidder = Global.zero_address auction/contract.py:21-22 + byte "previous_bidder" // new_state_value%0#0,"previous_bidder" # Use zero address rather than an empty string for Account type safety\nself.previous_bidder auction/contract.py:21-22 + swap // load new_state_value%0#0 from l-stack (no copy) "previous_bidder",new_state_value%0#0 # Use zero address rather than an empty string for Account type safety\nself.previous_bidder = Gl... auction/contract.py:21-22 + app_global_put // # Use zero address rather than an empty string for Account type safety\nself.previous_bidder = Gl... auction/contract.py:21-22 retsub // diff --git a/examples/auction/out/Auction.destructured.ir b/examples/auction/out/Auction.destructured.ir index 2ae9caf703..2a266cb2d2 100644 --- a/examples/auction/out/Auction.destructured.ir +++ b/examples/auction/out/Auction.destructured.ir @@ -94,9 +94,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -114,9 +114,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check auction_end exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (auction_end_value%3#0: uint64, auction_end_exists%4#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%4#0) // check auction_end exists + let tmp%5#0: uint64 = (! auction_end_value%3#0) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) let tmp%7#0: bytes = (global CurrentApplicationAddress) @@ -139,18 +139,18 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.bid(pay: uint64) -> void: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (< tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) let tmp%5#0: bytes = (txn Sender) let tmp%6#0: uint64 = (== tmp%4#0 tmp%5#0) (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let tmp%10#0: uint64 = (> tmp%7#0 previous_bid_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid (app_global_put "previous_bid" tmp%7#0) (app_global_put "previous_bidder" tmp%4#0) @@ -161,18 +161,18 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") - (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account + let (original_amount#0: uint64, claimable_amount_exists%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") + (assert claimable_amount_exists%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) - let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists - let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) + let (previous_bidder_value%5#0: bytes, previous_bidder_exists%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%6#0) // check previous_bidder exists + let tmp%7#0: uint64 = (== tmp%4#0 previous_bidder_value%5#0) let amount#1: uint64 = original_amount#0 goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let amount#1: uint64 = (- original_amount#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let amount#1: uint64 = (- original_amount#0 previous_bid_value%8#0) goto block@2 block@2: // after_if_else_L87 itxn_begin @@ -190,23 +190,23 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (> tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists - let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists + let (asa_amount_value%6#0: uint64, asa_amount_exists%7#0: uint64) = (app_global_get_ex 0u "asa_amount") + (assert asa_amount_exists%7#0) // check asa_amount exists + let (previous_bidder_value%8#0: bytes, previous_bidder_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%9#0) // check previous_bidder exists + let (previous_bidder_value%10#0: bytes, previous_bidder_exists%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%11#0) // check previous_bidder exists ((itxn_field XferAsset) asset#0) ((itxn_field TypeEnum) axfer) ((itxn_field Fee) 0u) - ((itxn_field AssetReceiver) app_global_get_ex_value%10#0) - ((itxn_field AssetCloseTo) app_global_get_ex_value%8#0) - ((itxn_field AssetAmount) app_global_get_ex_value%6#0) + ((itxn_field AssetReceiver) previous_bidder_value%10#0) + ((itxn_field AssetCloseTo) previous_bidder_value%8#0) + ((itxn_field AssetAmount) asa_amount_value%6#0) itxn_submit return diff --git a/examples/auction/out/Auction.ssa.ir b/examples/auction/out/Auction.ssa.ir index 4ecd00781c..429f31cd3a 100644 --- a/examples/auction/out/Auction.ssa.ir +++ b/examples/auction/out/Auction.ssa.ir @@ -104,9 +104,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (== asa_value%3#0 0u) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -242,9 +242,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check auction_end exists - let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) + let (auction_end_value%3#0: uint64, auction_end_exists%4#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%4#0) // check auction_end exists + let tmp%5#0: uint64 = (== auction_end_value%3#0 0u) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) let tmp%7#0: bytes = (global CurrentApplicationAddress) @@ -267,18 +267,18 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.bid(pay: uint64) -> void: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (< tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) let tmp%5#0: bytes = (txn Sender) let tmp%6#0: uint64 = (== tmp%4#0 tmp%5#0) (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let tmp%10#0: uint64 = (> tmp%7#0 previous_bid_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid let new_state_value%11#0: uint64 = ((gtxns Amount) pay#0) (app_global_put "previous_bid" new_state_value%11#0) @@ -292,20 +292,20 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") - (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account - let awst_tmp%3#0: uint64 = app_local_get_ex_value%1#0 + let (claimable_amount_value%1#0: uint64, claimable_amount_exists%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") + (assert claimable_amount_exists%2#0) // check claimable_amount exists for account + let awst_tmp%3#0: uint64 = claimable_amount_value%1#0 let original_amount#0: uint64 = awst_tmp%3#0 let amount#0: uint64 = awst_tmp%3#0 let tmp%4#0: bytes = (txn Sender) - let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists - let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) + let (previous_bidder_value%5#0: bytes, previous_bidder_exists%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%6#0) // check previous_bidder exists + let tmp%7#0: uint64 = (== tmp%4#0 previous_bidder_value%5#0) goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let amount#1: uint64 = (- amount#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let amount#1: uint64 = (- amount#0 previous_bid_value%8#0) goto block@2 block@2: // after_if_else_L87 let amount#2: uint64 = φ(amount#0 <- block@0, amount#1 <- block@1) @@ -442,9 +442,9 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (> tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin let inner_txn_params%5%%Accounts_length#0: uint64 = 0u @@ -454,18 +454,18 @@ contract examples.auction.contract.Auction: let inner_txn_params%5%%ApprovalProgram_length#0: uint64 = 0u let inner_txn_params%5%%ApprovalProgramPages_length#0: uint64 = 0u let inner_txn_params%5%%Applications_length#0: uint64 = 0u - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists - let inner_txn_params%5%%param_AssetAmount_idx_0#0: uint64 = app_global_get_ex_value%6#0 + let (asa_amount_value%6#0: uint64, asa_amount_exists%7#0: uint64) = (app_global_get_ex 0u "asa_amount") + (assert asa_amount_exists%7#0) // check asa_amount exists + let inner_txn_params%5%%param_AssetAmount_idx_0#0: uint64 = asa_amount_value%6#0 let inner_txn_params%5%%AssetAmount_length#0: uint64 = 1u - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists - let inner_txn_params%5%%param_AssetCloseTo_idx_0#0: bytes = app_global_get_ex_value%8#0 + let (previous_bidder_value%8#0: bytes, previous_bidder_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%9#0) // check previous_bidder exists + let inner_txn_params%5%%param_AssetCloseTo_idx_0#0: bytes = previous_bidder_value%8#0 let inner_txn_params%5%%AssetCloseTo_length#0: uint64 = 1u let inner_txn_params%5%%ConfigAssetName_length#0: uint64 = 0u - let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists - let inner_txn_params%5%%param_AssetReceiver_idx_0#0: bytes = app_global_get_ex_value%10#0 + let (previous_bidder_value%10#0: bytes, previous_bidder_exists%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%11#0) // check previous_bidder exists + let inner_txn_params%5%%param_AssetReceiver_idx_0#0: bytes = previous_bidder_value%10#0 let inner_txn_params%5%%AssetReceiver_length#0: uint64 = 1u let inner_txn_params%5%%AssetSender_length#0: uint64 = 0u let inner_txn_params%5%%Assets_length#0: uint64 = 0u diff --git a/examples/auction/out/Auction.ssa.opt_pass_1.ir b/examples/auction/out/Auction.ssa.opt_pass_1.ir index 4aa963c7ae..96e9fd72ef 100644 --- a/examples/auction/out/Auction.ssa.opt_pass_1.ir +++ b/examples/auction/out/Auction.ssa.opt_pass_1.ir @@ -94,9 +94,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -114,9 +114,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check auction_end exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (auction_end_value%3#0: uint64, auction_end_exists%4#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%4#0) // check auction_end exists + let tmp%5#0: uint64 = (! auction_end_value%3#0) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) let tmp%7#0: bytes = (global CurrentApplicationAddress) @@ -139,18 +139,18 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.bid(pay: uint64) -> void: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (< tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) let tmp%5#0: bytes = (txn Sender) let tmp%6#0: uint64 = (== tmp%4#0 tmp%5#0) (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let tmp%10#0: uint64 = (> tmp%7#0 previous_bid_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid (app_global_put "previous_bid" tmp%7#0) (app_global_put "previous_bidder" tmp%4#0) @@ -161,17 +161,17 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") - (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account + let (original_amount#0: uint64, claimable_amount_exists%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") + (assert claimable_amount_exists%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) - let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists - let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) + let (previous_bidder_value%5#0: bytes, previous_bidder_exists%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%6#0) // check previous_bidder exists + let tmp%7#0: uint64 = (== tmp%4#0 previous_bidder_value%5#0) goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let amount#1: uint64 = (- original_amount#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let amount#1: uint64 = (- original_amount#0 previous_bid_value%8#0) goto block@2 block@2: // after_if_else_L87 let amount#2: uint64 = φ(original_amount#0 <- block@0, amount#1 <- block@1) @@ -190,23 +190,23 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (> tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists - let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists + let (asa_amount_value%6#0: uint64, asa_amount_exists%7#0: uint64) = (app_global_get_ex 0u "asa_amount") + (assert asa_amount_exists%7#0) // check asa_amount exists + let (previous_bidder_value%8#0: bytes, previous_bidder_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%9#0) // check previous_bidder exists + let (previous_bidder_value%10#0: bytes, previous_bidder_exists%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%11#0) // check previous_bidder exists ((itxn_field XferAsset) asset#0) ((itxn_field TypeEnum) axfer) ((itxn_field Fee) 0u) - ((itxn_field AssetReceiver) app_global_get_ex_value%10#0) - ((itxn_field AssetCloseTo) app_global_get_ex_value%8#0) - ((itxn_field AssetAmount) app_global_get_ex_value%6#0) + ((itxn_field AssetReceiver) previous_bidder_value%10#0) + ((itxn_field AssetCloseTo) previous_bidder_value%8#0) + ((itxn_field AssetAmount) asa_amount_value%6#0) itxn_submit return diff --git a/examples/auction/out_O2/Auction.destructured.ir b/examples/auction/out_O2/Auction.destructured.ir index 2ae9caf703..2a266cb2d2 100644 --- a/examples/auction/out_O2/Auction.destructured.ir +++ b/examples/auction/out_O2/Auction.destructured.ir @@ -94,9 +94,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -114,9 +114,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check auction_end exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (auction_end_value%3#0: uint64, auction_end_exists%4#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%4#0) // check auction_end exists + let tmp%5#0: uint64 = (! auction_end_value%3#0) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) let tmp%7#0: bytes = (global CurrentApplicationAddress) @@ -139,18 +139,18 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.bid(pay: uint64) -> void: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (< tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) let tmp%5#0: bytes = (txn Sender) let tmp%6#0: uint64 = (== tmp%4#0 tmp%5#0) (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let tmp%10#0: uint64 = (> tmp%7#0 previous_bid_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid (app_global_put "previous_bid" tmp%7#0) (app_global_put "previous_bidder" tmp%4#0) @@ -161,18 +161,18 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (original_amount#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") - (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account + let (original_amount#0: uint64, claimable_amount_exists%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") + (assert claimable_amount_exists%2#0) // check claimable_amount exists for account let tmp%4#0: bytes = (txn Sender) - let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists - let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) + let (previous_bidder_value%5#0: bytes, previous_bidder_exists%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%6#0) // check previous_bidder exists + let tmp%7#0: uint64 = (== tmp%4#0 previous_bidder_value%5#0) let amount#1: uint64 = original_amount#0 goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let amount#1: uint64 = (- original_amount#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let amount#1: uint64 = (- original_amount#0 previous_bid_value%8#0) goto block@2 block@2: // after_if_else_L87 itxn_begin @@ -190,23 +190,23 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (> tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists - let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists + let (asa_amount_value%6#0: uint64, asa_amount_exists%7#0: uint64) = (app_global_get_ex 0u "asa_amount") + (assert asa_amount_exists%7#0) // check asa_amount exists + let (previous_bidder_value%8#0: bytes, previous_bidder_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%9#0) // check previous_bidder exists + let (previous_bidder_value%10#0: bytes, previous_bidder_exists%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%11#0) // check previous_bidder exists ((itxn_field XferAsset) asset#0) ((itxn_field TypeEnum) axfer) ((itxn_field Fee) 0u) - ((itxn_field AssetReceiver) app_global_get_ex_value%10#0) - ((itxn_field AssetCloseTo) app_global_get_ex_value%8#0) - ((itxn_field AssetAmount) app_global_get_ex_value%6#0) + ((itxn_field AssetReceiver) previous_bidder_value%10#0) + ((itxn_field AssetCloseTo) previous_bidder_value%8#0) + ((itxn_field AssetAmount) asa_amount_value%6#0) itxn_submit return diff --git a/examples/auction/out_unoptimized/Auction.destructured.ir b/examples/auction/out_unoptimized/Auction.destructured.ir index a96f975008..ff92452079 100644 --- a/examples/auction/out_unoptimized/Auction.destructured.ir +++ b/examples/auction/out_unoptimized/Auction.destructured.ir @@ -106,9 +106,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (== asa_value%3#0 0u) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -131,9 +131,9 @@ contract examples.auction.contract.Auction: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // auction must be started by creator - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%4#0) // check auction_end exists - let tmp%5#0: uint64 = (== app_global_get_ex_value%3#0 0u) + let (auction_end_value%3#0: uint64, auction_end_exists%4#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%4#0) // check auction_end exists + let tmp%5#0: uint64 = (== auction_end_value%3#0 0u) (assert tmp%5#0) // auction already started let tmp%6#0: bytes = ((gtxns AssetReceiver) axfer#0) let tmp%7#0: bytes = (global CurrentApplicationAddress) @@ -156,18 +156,18 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.bid(pay: uint64) -> void: block@0: // L67 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (< tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (< tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has ended let tmp%4#0: bytes = ((gtxns Sender) pay#0) let tmp%5#0: bytes = (txn Sender) let tmp%6#0: uint64 = (== tmp%4#0 tmp%5#0) (assert tmp%6#0) // payment sender must match transaction sender let tmp%7#0: uint64 = ((gtxns Amount) pay#0) - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let tmp%10#0: uint64 = (> tmp%7#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let tmp%10#0: uint64 = (> tmp%7#0 previous_bid_value%8#0) (assert tmp%10#0) // Bid must be higher than previous bid let new_state_value%11#0: uint64 = ((gtxns Amount) pay#0) (app_global_put "previous_bid" new_state_value%11#0) @@ -181,21 +181,21 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_bids() -> void: block@0: // L83 let tmp%0#0: bytes = (txn Sender) - let (app_local_get_ex_value%1#0: uint64, app_local_get_ex_did_exist%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") - (assert app_local_get_ex_did_exist%2#0) // check claimable_amount exists for account - let awst_tmp%3#0: uint64 = app_local_get_ex_value%1#0 + let (claimable_amount_value%1#0: uint64, claimable_amount_exists%2#0: uint64) = (app_local_get_ex tmp%0#0 0u "claim") + (assert claimable_amount_exists%2#0) // check claimable_amount exists for account + let awst_tmp%3#0: uint64 = claimable_amount_value%1#0 let original_amount#0: uint64 = awst_tmp%3#0 let amount#0: uint64 = awst_tmp%3#0 let tmp%4#0: bytes = (txn Sender) - let (app_global_get_ex_value%5#0: bytes, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%6#0) // check previous_bidder exists - let tmp%7#0: uint64 = (== tmp%4#0 app_global_get_ex_value%5#0) + let (previous_bidder_value%5#0: bytes, previous_bidder_exists%6#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%6#0) // check previous_bidder exists + let tmp%7#0: uint64 = (== tmp%4#0 previous_bidder_value%5#0) let amount#5: uint64 = amount#0 goto tmp%7#0 ? block@1 : block@2 block@1: // if_body_L87 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bid") - (assert app_global_get_ex_did_exist%9#0) // check previous_bid exists - let amount#0: uint64 = (- amount#0 app_global_get_ex_value%8#0) + let (previous_bid_value%8#0: uint64, previous_bid_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bid") + (assert previous_bid_exists%9#0) // check previous_bid exists + let amount#0: uint64 = (- amount#0 previous_bid_value%8#0) let amount#5: uint64 = amount#0 goto block@2 block@2: // after_if_else_L87 @@ -220,20 +220,20 @@ contract examples.auction.contract.Auction: subroutine examples.auction.contract.Auction.claim_asset(asset: uint64) -> void: block@0: // L99 let tmp%0#0: uint64 = (global LatestTimestamp) - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "auction_end") - (assert app_global_get_ex_did_exist%2#0) // check auction_end exists - let tmp%3#0: uint64 = (> tmp%0#0 app_global_get_ex_value%1#0) + let (auction_end_value%1#0: uint64, auction_end_exists%2#0: uint64) = (app_global_get_ex 0u "auction_end") + (assert auction_end_exists%2#0) // check auction_end exists + let tmp%3#0: uint64 = (> tmp%0#0 auction_end_value%1#0) (assert tmp%3#0) // auction has not ended itxn_begin - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "asa_amount") - (assert app_global_get_ex_did_exist%7#0) // check asa_amount exists - let inner_txn_params%5%%param_AssetAmount_idx_0#0: uint64 = app_global_get_ex_value%6#0 - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%9#0) // check previous_bidder exists - let inner_txn_params%5%%param_AssetCloseTo_idx_0#0: bytes = app_global_get_ex_value%8#0 - let (app_global_get_ex_value%10#0: bytes, app_global_get_ex_did_exist%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") - (assert app_global_get_ex_did_exist%11#0) // check previous_bidder exists - let inner_txn_params%5%%param_AssetReceiver_idx_0#0: bytes = app_global_get_ex_value%10#0 + let (asa_amount_value%6#0: uint64, asa_amount_exists%7#0: uint64) = (app_global_get_ex 0u "asa_amount") + (assert asa_amount_exists%7#0) // check asa_amount exists + let inner_txn_params%5%%param_AssetAmount_idx_0#0: uint64 = asa_amount_value%6#0 + let (previous_bidder_value%8#0: bytes, previous_bidder_exists%9#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%9#0) // check previous_bidder exists + let inner_txn_params%5%%param_AssetCloseTo_idx_0#0: bytes = previous_bidder_value%8#0 + let (previous_bidder_value%10#0: bytes, previous_bidder_exists%11#0: uint64) = (app_global_get_ex 0u "previous_bidder") + (assert previous_bidder_exists%11#0) // check previous_bidder exists + let inner_txn_params%5%%param_AssetReceiver_idx_0#0: bytes = previous_bidder_value%10#0 let inner_txn_params%5%%param_Fee_idx_0#0: uint64 = 0u let inner_txn_params%5%%param_TypeEnum_idx_0#0: uint64 = axfer let inner_txn_params%5%%param_XferAsset_idx_0#0: uint64 = asset#0 diff --git a/examples/auction/puya.log b/examples/auction/puya.log index 6ac29dfbad..efc1455e06 100644 --- a/examples/auction/puya.log +++ b/examples/auction/puya.log @@ -569,8 +569,8 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: app_local_get_ex_value%1#0, awst_tmp%3#0, original_amount#0, amount#0 -debug: Replacing {app_local_get_ex_value%1#0, awst_tmp%3#0, amount#0} with original_amount#0 made 3 modifications +debug: Found equivalence set: claimable_amount_value%1#0, awst_tmp%3#0, original_amount#0, amount#0 +debug: Replacing {claimable_amount_value%1#0, awst_tmp%3#0, amount#0} with original_amount#0 made 3 modifications debug: Found equivalence set: amount#2, inner_txn_params%11%%param_Amount_idx_0#0 debug: Replacing {inner_txn_params%11%%param_Amount_idx_0#0} with amount#2 made 1 modifications debug: Optimizer: Intrinsic Simplifier @@ -701,12 +701,12 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: app_global_get_ex_value%6#0, inner_txn_params%5%%param_AssetAmount_idx_0#0 -debug: Replacing {inner_txn_params%5%%param_AssetAmount_idx_0#0} with app_global_get_ex_value%6#0 made 1 modifications -debug: Found equivalence set: app_global_get_ex_value%8#0, inner_txn_params%5%%param_AssetCloseTo_idx_0#0 -debug: Replacing {inner_txn_params%5%%param_AssetCloseTo_idx_0#0} with app_global_get_ex_value%8#0 made 1 modifications -debug: Found equivalence set: app_global_get_ex_value%10#0, inner_txn_params%5%%param_AssetReceiver_idx_0#0 -debug: Replacing {inner_txn_params%5%%param_AssetReceiver_idx_0#0} with app_global_get_ex_value%10#0 made 1 modifications +debug: Found equivalence set: asa_amount_value%6#0, inner_txn_params%5%%param_AssetAmount_idx_0#0 +debug: Replacing {inner_txn_params%5%%param_AssetAmount_idx_0#0} with asa_amount_value%6#0 made 1 modifications +debug: Found equivalence set: previous_bidder_value%8#0, inner_txn_params%5%%param_AssetCloseTo_idx_0#0 +debug: Replacing {inner_txn_params%5%%param_AssetCloseTo_idx_0#0} with previous_bidder_value%8#0 made 1 modifications +debug: Found equivalence set: previous_bidder_value%10#0, inner_txn_params%5%%param_AssetReceiver_idx_0#0 +debug: Replacing {inner_txn_params%5%%param_AssetReceiver_idx_0#0} with previous_bidder_value%10#0 made 1 modifications debug: Found equivalence set: asset#0, inner_txn_params%5%%param_XferAsset_idx_0#0 debug: Replacing {inner_txn_params%5%%param_XferAsset_idx_0#0} with asset#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier @@ -1091,12 +1091,12 @@ debug: Inserted opt_into_asset_block@0.ops[20]: 'store tmp%5#0 to l-stack (copy) debug: Replaced opt_into_asset_block@0.ops[22]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' debug: Inserted opt_into_asset_block@0.ops[3]: 'store tmp%1#0 to l-stack (copy)' debug: Replaced opt_into_asset_block@0.ops[6]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted opt_into_asset_block@0.ops[15]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced opt_into_asset_block@0.ops[18]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted opt_into_asset_block@0.ops[15]: 'store asa_exists%4#0 to l-stack (copy)' +debug: Replaced opt_into_asset_block@0.ops[18]: 'load asa_exists%4#0' with 'load asa_exists%4#0 from l-stack (no copy)' debug: Inserted opt_into_asset_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced opt_into_asset_block@0.ops[6]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' -debug: Inserted opt_into_asset_block@0.ops[18]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced opt_into_asset_block@0.ops[22]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' +debug: Inserted opt_into_asset_block@0.ops[18]: 'store asa_value%3#0 to l-stack (copy)' +debug: Replaced opt_into_asset_block@0.ops[22]: 'load asa_value%3#0' with 'load asa_value%3#0 from l-stack (no copy)' debug: Inserted opt_into_asset_block@0.ops[33]: 'store inner_txn_params%7%%param_AssetReceiver_idx_0#0 to l-stack (copy)' debug: Replaced opt_into_asset_block@0.ops[41]: 'load inner_txn_params%7%%param_AssetReceiver_idx_0#0' with 'load inner_txn_params%7%%param_AssetReceiver_idx_0#0 from l-stack (no copy)' debug: Inserted start_auction_block@0.ops[7]: 'store tmp%2#0 to l-stack (copy)' @@ -1107,8 +1107,8 @@ debug: Inserted start_auction_block@0.ops[32]: 'store tmp%8#0 to l-stack (copy)' debug: Replaced start_auction_block@0.ops[34]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' debug: Inserted start_auction_block@0.ops[3]: 'store tmp%1#0 to l-stack (copy)' debug: Replaced start_auction_block@0.ops[6]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted start_auction_block@0.ops[15]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced start_auction_block@0.ops[18]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted start_auction_block@0.ops[15]: 'store auction_end_exists%4#0 to l-stack (copy)' +debug: Replaced start_auction_block@0.ops[18]: 'load auction_end_exists%4#0' with 'load auction_end_exists%4#0 from l-stack (no copy)' debug: Inserted start_auction_block@0.ops[30]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced start_auction_block@0.ops[33]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' debug: Inserted start_auction_block@0.ops[41]: 'store new_state_value%9#0 to l-stack (copy)' @@ -1121,8 +1121,8 @@ debug: Inserted start_auction_block@0.ops[62]: 'store new_state_value%13#0 to l- debug: Replaced start_auction_block@0.ops[65]: 'load new_state_value%13#0' with 'load new_state_value%13#0 from l-stack (no copy)' debug: Inserted start_auction_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced start_auction_block@0.ops[6]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' -debug: Inserted start_auction_block@0.ops[18]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced start_auction_block@0.ops[22]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' +debug: Inserted start_auction_block@0.ops[18]: 'store auction_end_value%3#0 to l-stack (copy)' +debug: Replaced start_auction_block@0.ops[22]: 'load auction_end_value%3#0' with 'load auction_end_value%3#0 from l-stack (no copy)' debug: Inserted start_auction_block@0.ops[30]: 'store tmp%6#0 to l-stack (copy)' debug: Replaced start_auction_block@0.ops[35]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted start_auction_block@0.ops[50]: 'store tmp%10#0 to l-stack (copy)' @@ -1135,18 +1135,18 @@ debug: Inserted bid_block@0.ops[41]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced bid_block@0.ops[43]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' debug: Inserted bid_block@0.ops[52]: 'store tmp%14#0 to l-stack (copy)' debug: Replaced bid_block@0.ops[54]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' -debug: Inserted bid_block@0.ops[5]: 'store app_global_get_ex_did_exist%2#0 to l-stack (copy)' -debug: Replaced bid_block@0.ops[8]: 'load app_global_get_ex_did_exist%2#0' with 'load app_global_get_ex_did_exist%2#0 from l-stack (no copy)' +debug: Inserted bid_block@0.ops[5]: 'store auction_end_exists%2#0 to l-stack (copy)' +debug: Replaced bid_block@0.ops[8]: 'load auction_end_exists%2#0' with 'load auction_end_exists%2#0 from l-stack (no copy)' debug: Inserted bid_block@0.ops[21]: 'store tmp%5#0 to l-stack (copy)' debug: Replaced bid_block@0.ops[24]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' -debug: Inserted bid_block@0.ops[36]: 'store app_global_get_ex_did_exist%9#0 to l-stack (copy)' -debug: Replaced bid_block@0.ops[39]: 'load app_global_get_ex_did_exist%9#0' with 'load app_global_get_ex_did_exist%9#0 from l-stack (no copy)' +debug: Inserted bid_block@0.ops[36]: 'store previous_bid_exists%9#0 to l-stack (copy)' +debug: Replaced bid_block@0.ops[39]: 'load previous_bid_exists%9#0' with 'load previous_bid_exists%9#0 from l-stack (no copy)' debug: Inserted bid_block@0.ops[19]: 'store tmp%4#0 to l-stack (copy)' debug: Replaced bid_block@0.ops[24]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' -debug: Inserted bid_block@0.ops[7]: 'store app_global_get_ex_value%1#0 to l-stack (copy)' -debug: Replaced bid_block@0.ops[12]: 'load app_global_get_ex_value%1#0' with 'load app_global_get_ex_value%1#0 from l-stack (no copy)' -debug: Inserted bid_block@0.ops[40]: 'store app_global_get_ex_value%8#0 to l-stack (copy)' -debug: Replaced bid_block@0.ops[45]: 'load app_global_get_ex_value%8#0' with 'load app_global_get_ex_value%8#0 from l-stack (no copy)' +debug: Inserted bid_block@0.ops[7]: 'store auction_end_value%1#0 to l-stack (copy)' +debug: Replaced bid_block@0.ops[12]: 'load auction_end_value%1#0' with 'load auction_end_value%1#0 from l-stack (no copy)' +debug: Inserted bid_block@0.ops[40]: 'store previous_bid_value%8#0 to l-stack (copy)' +debug: Replaced bid_block@0.ops[45]: 'load previous_bid_value%8#0' with 'load previous_bid_value%8#0 from l-stack (no copy)' debug: Inserted bid_block@0.ops[45]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced bid_block@0.ops[53]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' debug: Inserted bid_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' @@ -1159,22 +1159,22 @@ debug: Inserted bid_block@0.ops[27]: 'store tmp%4#0 to l-stack (copy)' debug: Replaced bid_block@0.ops[60]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' debug: Inserted claim_bids_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced claim_bids_block@0.ops[3]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' -debug: Inserted claim_bids_block@0.ops[7]: 'store app_local_get_ex_did_exist%2#0 to l-stack (copy)' -debug: Replaced claim_bids_block@0.ops[10]: 'load app_local_get_ex_did_exist%2#0' with 'load app_local_get_ex_did_exist%2#0 from l-stack (no copy)' -debug: Inserted claim_bids_block@0.ops[17]: 'store app_global_get_ex_did_exist%6#0 to l-stack (copy)' -debug: Replaced claim_bids_block@0.ops[20]: 'load app_global_get_ex_did_exist%6#0' with 'load app_global_get_ex_did_exist%6#0 from l-stack (no copy)' +debug: Inserted claim_bids_block@0.ops[7]: 'store claimable_amount_exists%2#0 to l-stack (copy)' +debug: Replaced claim_bids_block@0.ops[10]: 'load claimable_amount_exists%2#0' with 'load claimable_amount_exists%2#0 from l-stack (no copy)' +debug: Inserted claim_bids_block@0.ops[17]: 'store previous_bidder_exists%6#0 to l-stack (copy)' +debug: Replaced claim_bids_block@0.ops[20]: 'load previous_bidder_exists%6#0' with 'load previous_bidder_exists%6#0 from l-stack (no copy)' debug: Inserted claim_bids_block@0.ops[25]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced claim_bids_block@0.ops[29]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' -debug: Inserted claim_bids_block@0.ops[19]: 'store app_global_get_ex_value%5#0 to l-stack (copy)' -debug: Replaced claim_bids_block@0.ops[24]: 'load app_global_get_ex_value%5#0' with 'load app_global_get_ex_value%5#0 from l-stack (no copy)' +debug: Inserted claim_bids_block@0.ops[19]: 'store previous_bidder_value%5#0 to l-stack (copy)' +debug: Replaced claim_bids_block@0.ops[24]: 'load previous_bidder_value%5#0' with 'load previous_bidder_value%5#0 from l-stack (no copy)' debug: Inserted claim_bids_block@0.ops[13]: 'store tmp%4#0 to l-stack (copy)' debug: Replaced claim_bids_block@0.ops[24]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' debug: Inserted claim_bids_block@0.ops[9]: 'store original_amount#0 to l-stack (copy)' debug: Replaced claim_bids_block@0.ops[30]: 'load original_amount#0' with 'load original_amount#0 from l-stack (no copy)' -debug: Inserted claim_bids_if_body@1.ops[3]: 'store app_global_get_ex_did_exist%9#0 to l-stack (copy)' -debug: Replaced claim_bids_if_body@1.ops[6]: 'load app_global_get_ex_did_exist%9#0' with 'load app_global_get_ex_did_exist%9#0 from l-stack (no copy)' -debug: Inserted claim_bids_if_body@1.ops[5]: 'store app_global_get_ex_value%8#0 to l-stack (copy)' -debug: Replaced claim_bids_if_body@1.ops[10]: 'load app_global_get_ex_value%8#0' with 'load app_global_get_ex_value%8#0 from l-stack (no copy)' +debug: Inserted claim_bids_if_body@1.ops[3]: 'store previous_bid_exists%9#0 to l-stack (copy)' +debug: Replaced claim_bids_if_body@1.ops[6]: 'load previous_bid_exists%9#0' with 'load previous_bid_exists%9#0 from l-stack (no copy)' +debug: Inserted claim_bids_if_body@1.ops[5]: 'store previous_bid_value%8#0 to l-stack (copy)' +debug: Replaced claim_bids_if_body@1.ops[10]: 'load previous_bid_value%8#0' with 'load previous_bid_value%8#0 from l-stack (no copy)' debug: Inserted claim_bids_after_if_else@2.ops[17]: 'store tmp%13#0 to l-stack (copy)' debug: Replaced claim_bids_after_if_else@2.ops[19]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' debug: Inserted claim_bids_after_if_else@2.ops[2]: 'store inner_txn_params%11%%param_Receiver_idx_0#0 to l-stack (copy)' @@ -1188,24 +1188,24 @@ debug: examples.auction.contract.Auction.claim_bids f-stack entry: [] debug: examples.auction.contract.Auction.claim_bids f-stack on first store: ['original_amount#0', 'amount#1'] debug: Inserted claim_asset_block@0.ops[12]: 'store tmp%3#0 to l-stack (copy)' debug: Replaced claim_asset_block@0.ops[14]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[5]: 'store app_global_get_ex_did_exist%2#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[8]: 'load app_global_get_ex_did_exist%2#0' with 'load app_global_get_ex_did_exist%2#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[21]: 'store app_global_get_ex_did_exist%7#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[24]: 'load app_global_get_ex_did_exist%7#0' with 'load app_global_get_ex_did_exist%7#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[29]: 'store app_global_get_ex_did_exist%9#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[32]: 'load app_global_get_ex_did_exist%9#0' with 'load app_global_get_ex_did_exist%9#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[37]: 'store app_global_get_ex_did_exist%11#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[40]: 'load app_global_get_ex_did_exist%11#0' with 'load app_global_get_ex_did_exist%11#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[7]: 'store app_global_get_ex_value%1#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[12]: 'load app_global_get_ex_value%1#0' with 'load app_global_get_ex_value%1#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[5]: 'store auction_end_exists%2#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[8]: 'load auction_end_exists%2#0' with 'load auction_end_exists%2#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[21]: 'store asa_amount_exists%7#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[24]: 'load asa_amount_exists%7#0' with 'load asa_amount_exists%7#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[29]: 'store previous_bidder_exists%9#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[32]: 'load previous_bidder_exists%9#0' with 'load previous_bidder_exists%9#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[37]: 'store previous_bidder_exists%11#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[40]: 'load previous_bidder_exists%11#0' with 'load previous_bidder_exists%11#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[7]: 'store auction_end_value%1#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[12]: 'load auction_end_value%1#0' with 'load auction_end_value%1#0 from l-stack (no copy)' debug: Inserted claim_asset_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced claim_asset_block@0.ops[12]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[41]: 'store app_global_get_ex_value%10#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[51]: 'load app_global_get_ex_value%10#0' with 'load app_global_get_ex_value%10#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[33]: 'store app_global_get_ex_value%8#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[54]: 'load app_global_get_ex_value%8#0' with 'load app_global_get_ex_value%8#0 from l-stack (no copy)' -debug: Inserted claim_asset_block@0.ops[25]: 'store app_global_get_ex_value%6#0 to l-stack (copy)' -debug: Replaced claim_asset_block@0.ops[57]: 'load app_global_get_ex_value%6#0' with 'load app_global_get_ex_value%6#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[41]: 'store previous_bidder_value%10#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[51]: 'load previous_bidder_value%10#0' with 'load previous_bidder_value%10#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[33]: 'store previous_bidder_value%8#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[54]: 'load previous_bidder_value%8#0' with 'load previous_bidder_value%8#0 from l-stack (no copy)' +debug: Inserted claim_asset_block@0.ops[25]: 'store asa_amount_value%6#0 to l-stack (copy)' +debug: Replaced claim_asset_block@0.ops[57]: 'load asa_amount_value%6#0' with 'load asa_amount_value%6#0 from l-stack (no copy)' debug: Inserted __init___block@0.ops[13]: 'store new_state_value%0#0 to l-stack (copy)' debug: Replaced __init___block@0.ops[16]: 'load new_state_value%0#0' with 'load new_state_value%0#0 from l-stack (no copy)' info: Writing auction/out/Auction.approval.teal diff --git a/examples/global_state/out/AppStateContract.approval.mir b/examples/global_state/out/AppStateContract.approval.mir index 45e6dfdce2..04f6177165 100644 --- a/examples/global_state/out/AppStateContract.approval.mir +++ b/examples/global_state/out/AppStateContract.approval.mir @@ -18,12 +18,12 @@ main_entrypoint@2: int 0 // 0 self.global_int_simplified global_state/contract.py:15 byte "global_int_simplified" // 0,"global_int_simplified" self.global_int_simplified global_state/contract.py:15 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_simplified global_state/contract.py:15 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.global_int_simplified global_state/contract.py:15 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.global_int_simplified global_state/contract.py:15 - assert // check global_int_simplified exists // app_global_get_ex_value%1#0 self.global_int_simplified global_state/contract.py:15 - // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) app_global_get_ex_value%1#0 self.global_int_simplified == 33 global_state/contract.py:15 - int 33 // app_global_get_ex_value%1#0,33 33 global_state/contract.py:15 + // virtual: store global_int_simplified_exists%2#0 to l-stack (no copy) global_int_simplified_exists%2#0,{app_global_get_ex}.0 self.global_int_simplified global_state/contract.py:15 + // virtual: store global_int_simplified_value%1#0 to l-stack (no copy) global_int_simplified_value%1#0,global_int_simplified_exists%2#0 self.global_int_simplified global_state/contract.py:15 + // virtual: load global_int_simplified_exists%2#0 from l-stack (no copy) global_int_simplified_value%1#0,global_int_simplified_exists%2#0 self.global_int_simplified global_state/contract.py:15 + assert // check global_int_simplified exists // global_int_simplified_value%1#0 self.global_int_simplified global_state/contract.py:15 + // virtual: load global_int_simplified_value%1#0 from l-stack (no copy) global_int_simplified_value%1#0 self.global_int_simplified == 33 global_state/contract.py:15 + int 33 // global_int_simplified_value%1#0,33 33 global_state/contract.py:15 == // {==} self.global_int_simplified == 33 global_state/contract.py:15 // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 self.global_int_simplified == 33 global_state/contract.py:15 // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 assert self.global_int_simplified == 33 global_state/contract.py:15 @@ -38,12 +38,12 @@ main_entrypoint@2: int 0 // 0 self.global_int_full global_state/contract.py:17 byte "global_int_full" // 0,"global_int_full" self.global_int_full global_state/contract.py:17 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_full global_state/contract.py:17 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:17 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.global_int_full global_state/contract.py:17 - assert // check global_int_full exists // app_global_get_ex_value%6#0 self.global_int_full global_state/contract.py:17 - // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) app_global_get_ex_value%6#0 self.global_int_full.value == 55 global_state/contract.py:17 - int 55 // app_global_get_ex_value%6#0,55 55 global_state/contract.py:17 + // virtual: store global_int_full_exists%7#0 to l-stack (no copy) global_int_full_exists%7#0,{app_global_get_ex}.0 self.global_int_full global_state/contract.py:17 + // virtual: store global_int_full_value%6#0 to l-stack (no copy) global_int_full_value%6#0,global_int_full_exists%7#0 self.global_int_full global_state/contract.py:17 + // virtual: load global_int_full_exists%7#0 from l-stack (no copy) global_int_full_value%6#0,global_int_full_exists%7#0 self.global_int_full global_state/contract.py:17 + assert // check global_int_full exists // global_int_full_value%6#0 self.global_int_full global_state/contract.py:17 + // virtual: load global_int_full_value%6#0 from l-stack (no copy) global_int_full_value%6#0 self.global_int_full.value == 55 global_state/contract.py:17 + int 55 // global_int_full_value%6#0,55 55 global_state/contract.py:17 == // {==} self.global_int_full.value == 55 global_state/contract.py:17 // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 self.global_int_full.value == 55 global_state/contract.py:17 // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 assert self.global_int_full.value == 55 global_state/contract.py:17 @@ -61,7 +61,7 @@ main_entrypoint@2: byte "global_int_no_default" // "global_int_no_default" self.global_int_no_default global_state/contract.py:19 int 44 // "global_int_no_default",44 44 global_state/contract.py:19 app_global_put // self.global_int_no_default.value = UInt64(44) global_state/contract.py:19 - int 0 // 0 self.global_int_no_default.maybe() global_state/contract.py:20 + int 0 // 0 self.global_int_no_default global_state/contract.py:20 byte "global_int_no_default" // 0,"global_int_no_default" self.global_int_no_default global_state/contract.py:20 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_int_no_default.maybe() global_state/contract.py:20 // virtual: store i_exists#0 to l-stack (no copy) i_exists#0,{app_global_get_ex}.0 self.global_int_no_default.maybe() global_state/contract.py:20 @@ -77,12 +77,12 @@ main_entrypoint@2: int 0 // 0 self.global_bytes_simplified global_state/contract.py:24 byte "global_bytes_simplified" // 0,"global_bytes_simplified" self.global_bytes_simplified global_state/contract.py:24 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_simplified global_state/contract.py:24 - // virtual: store app_global_get_ex_did_exist%16#0 to l-stack (no copy) app_global_get_ex_did_exist%16#0,{app_global_get_ex}.0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: store app_global_get_ex_value%15#0 to l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: load app_global_get_ex_did_exist%16#0 from l-stack (no copy) app_global_get_ex_value%15#0,app_global_get_ex_did_exist%16#0 self.global_bytes_simplified global_state/contract.py:24 - assert // check global_bytes_simplified exists // app_global_get_ex_value%15#0 self.global_bytes_simplified global_state/contract.py:24 - // virtual: load app_global_get_ex_value%15#0 from l-stack (no copy) app_global_get_ex_value%15#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 - byte "Hello" // app_global_get_ex_value%15#0,"Hello" b"Hello" global_state/contract.py:24 + // virtual: store global_bytes_simplified_exists%16#0 to l-stack (no copy) global_bytes_simplified_exists%16#0,{app_global_get_ex}.0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: store global_bytes_simplified_value%15#0 to l-stack (no copy) global_bytes_simplified_value%15#0,global_bytes_simplified_exists%16#0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: load global_bytes_simplified_exists%16#0 from l-stack (no copy) global_bytes_simplified_value%15#0,global_bytes_simplified_exists%16#0 self.global_bytes_simplified global_state/contract.py:24 + assert // check global_bytes_simplified exists // global_bytes_simplified_value%15#0 self.global_bytes_simplified global_state/contract.py:24 + // virtual: load global_bytes_simplified_value%15#0 from l-stack (no copy) global_bytes_simplified_value%15#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 + byte "Hello" // global_bytes_simplified_value%15#0,"Hello" b"Hello" global_state/contract.py:24 == // {==} self.global_bytes_simplified == b"Hello" global_state/contract.py:24 // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 self.global_bytes_simplified == b"Hello" global_state/contract.py:24 // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 assert self.global_bytes_simplified == b"Hello" global_state/contract.py:24 @@ -97,17 +97,17 @@ main_entrypoint@2: int 0 // 0 self.global_bytes_full global_state/contract.py:26 byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:26 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full global_state/contract.py:26 - // virtual: store app_global_get_ex_did_exist%21#0 to l-stack (no copy) app_global_get_ex_did_exist%21#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:26 - // virtual: store app_global_get_ex_value%20#0 to l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 - // virtual: load app_global_get_ex_did_exist%21#0 from l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.global_bytes_full global_state/contract.py:26 - assert // check global_bytes_full exists // app_global_get_ex_value%20#0 self.global_bytes_full global_state/contract.py:26 - // virtual: load app_global_get_ex_value%20#0 from l-stack (no copy) app_global_get_ex_value%20#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - byte "Hello" // app_global_get_ex_value%20#0,"Hello" b"Hello" global_state/contract.py:26 + // virtual: store global_bytes_full_exists%21#0 to l-stack (no copy) global_bytes_full_exists%21#0,{app_global_get_ex}.0 self.global_bytes_full global_state/contract.py:26 + // virtual: store global_bytes_full_value%20#0 to l-stack (no copy) global_bytes_full_value%20#0,global_bytes_full_exists%21#0 self.global_bytes_full global_state/contract.py:26 + // virtual: load global_bytes_full_exists%21#0 from l-stack (no copy) global_bytes_full_value%20#0,global_bytes_full_exists%21#0 self.global_bytes_full global_state/contract.py:26 + assert // check global_bytes_full exists // global_bytes_full_value%20#0 self.global_bytes_full global_state/contract.py:26 + // virtual: load global_bytes_full_value%20#0 from l-stack (no copy) global_bytes_full_value%20#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 + byte "Hello" // global_bytes_full_value%20#0,"Hello" b"Hello" global_state/contract.py:26 == // {==} self.global_bytes_full.value == b"Hello" global_state/contract.py:26 // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 self.global_bytes_full.value == b"Hello" global_state/contract.py:26 // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 assert // assert self.global_bytes_full.value == b"Hello" global_state/contract.py:26 - int 0 // 0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 + int 0 // 0 self.global_bytes_full global_state/contract.py:27 byte "global_bytes_full" // 0,"global_bytes_full" self.global_bytes_full global_state/contract.py:27 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 swap // store global_bytes_full_get_ex%24#0 to l-stack (no copy) global_bytes_full_get_ex%24#0,{app_global_get_ex}.0 self.global_bytes_full.get(Bytes(b"default")) global_state/contract.py:27 @@ -136,7 +136,7 @@ main_entrypoint@2: byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:29 byte "World" // "global_bytes_no_default","World" b"World" global_state/contract.py:29 app_global_put // self.global_bytes_no_default.value = Bytes(b"World") global_state/contract.py:29 - int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:30 + int 0 // 0 self.global_bytes_no_default global_state/contract.py:30 byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:30 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:30 // virtual: store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:30 @@ -151,7 +151,7 @@ main_entrypoint@2: assert // assert b_value == b"World" global_state/contract.py:32 byte "global_bytes_no_default" // "global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:33 app_global_del // del self.global_bytes_no_default.value global_state/contract.py:33 - int 0 // 0 self.global_bytes_no_default.maybe() global_state/contract.py:34 + int 0 // 0 self.global_bytes_no_default global_state/contract.py:34 byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:34 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.maybe() global_state/contract.py:34 swap // store b_exists#0 to l-stack (no copy) b_exists#0,{app_global_get_ex}.0 self.global_bytes_no_default.maybe() global_state/contract.py:34 @@ -161,7 +161,7 @@ main_entrypoint@2: // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 not b_exists global_state/contract.py:35 // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 assert not b_exists global_state/contract.py:35 assert // assert not b_exists global_state/contract.py:35 - int 0 // 0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 + int 0 // 0 self.global_bytes_no_default global_state/contract.py:37 byte "global_bytes_no_default" // 0,"global_bytes_no_default" self.global_bytes_no_default global_state/contract.py:37 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 swap // store global_bytes_no_default_get_ex%37#0 to l-stack (no copy) global_bytes_no_default_get_ex%37#0,{app_global_get_ex}.0 self.global_bytes_no_default.get(Bytes(b"default")) global_state/contract.py:37 diff --git a/examples/global_state/out/AppStateContract.destructured.ir b/examples/global_state/out/AppStateContract.destructured.ir index 17a1ce8b86..76b73952e5 100644 --- a/examples/global_state/out/AppStateContract.destructured.ir +++ b/examples/global_state/out/AppStateContract.destructured.ir @@ -8,15 +8,15 @@ contract examples.global_state.contract.AppStateContract: examples.global_state.contract.AppStateContract.__init__() goto block@2 block@2: // entrypoint_L5 - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists - let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) + let (global_int_simplified_value%1#0: uint64, global_int_simplified_exists%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") + (assert global_int_simplified_exists%2#0) // check global_int_simplified exists + let tmp%3#0: uint64 = (== global_int_simplified_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists - let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) + let (global_int_full_value%6#0: uint64, global_int_full_exists%7#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%7#0) // check global_int_full exists + let tmp%8#0: uint64 = (== global_int_full_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) @@ -26,15 +26,15 @@ contract examples.global_state.contract.AppStateContract: (assert i_exists#0) let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) - let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists - let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") + let (global_bytes_simplified_value%15#0: bytes, global_bytes_simplified_exists%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") + (assert global_bytes_simplified_exists%16#0) // check global_bytes_simplified exists + let tmp%17#0: uint64 = (== global_bytes_simplified_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) - let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists - let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") + let (global_bytes_full_value%20#0: bytes, global_bytes_full_exists%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%21#0) // check global_bytes_full exists + let tmp%22#0: uint64 = (== global_bytes_full_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) diff --git a/examples/global_state/out/AppStateContract.ssa.ir b/examples/global_state/out/AppStateContract.ssa.ir index 22472e90ff..6c90c119e6 100644 --- a/examples/global_state/out/AppStateContract.ssa.ir +++ b/examples/global_state/out/AppStateContract.ssa.ir @@ -8,15 +8,15 @@ contract examples.global_state.contract.AppStateContract: examples.global_state.contract.AppStateContract.__init__() goto block@2 block@2: // entrypoint_L5 - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists - let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) + let (global_int_simplified_value%1#0: uint64, global_int_simplified_exists%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") + (assert global_int_simplified_exists%2#0) // check global_int_simplified exists + let tmp%3#0: uint64 = (== global_int_simplified_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists - let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) + let (global_int_full_value%6#0: uint64, global_int_full_exists%7#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%7#0) // check global_int_full exists + let tmp%8#0: uint64 = (== global_int_full_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) @@ -28,15 +28,15 @@ contract examples.global_state.contract.AppStateContract: (assert i_exists#0) let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) - let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists - let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") + let (global_bytes_simplified_value%15#0: bytes, global_bytes_simplified_exists%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") + (assert global_bytes_simplified_exists%16#0) // check global_bytes_simplified exists + let tmp%17#0: uint64 = (== global_bytes_simplified_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) - let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists - let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") + let (global_bytes_full_value%20#0: bytes, global_bytes_full_exists%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%21#0) // check global_bytes_full exists + let tmp%22#0: uint64 = (== global_bytes_full_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) diff --git a/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir b/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir index 6f2bc7a081..a488a78329 100644 --- a/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir +++ b/examples/global_state/out/AppStateContract.ssa.opt_pass_1.ir @@ -8,15 +8,15 @@ contract examples.global_state.contract.AppStateContract: examples.global_state.contract.AppStateContract.__init__() goto block@2 block@2: // entrypoint_L5 - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists - let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) + let (global_int_simplified_value%1#0: uint64, global_int_simplified_exists%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") + (assert global_int_simplified_exists%2#0) // check global_int_simplified exists + let tmp%3#0: uint64 = (== global_int_simplified_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists - let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) + let (global_int_full_value%6#0: uint64, global_int_full_exists%7#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%7#0) // check global_int_full exists + let tmp%8#0: uint64 = (== global_int_full_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) @@ -26,15 +26,15 @@ contract examples.global_state.contract.AppStateContract: (assert i_exists#0) let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) - let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists - let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") + let (global_bytes_simplified_value%15#0: bytes, global_bytes_simplified_exists%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") + (assert global_bytes_simplified_exists%16#0) // check global_bytes_simplified exists + let tmp%17#0: uint64 = (== global_bytes_simplified_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) - let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists - let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") + let (global_bytes_full_value%20#0: bytes, global_bytes_full_exists%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%21#0) // check global_bytes_full exists + let tmp%22#0: uint64 = (== global_bytes_full_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) diff --git a/examples/global_state/out_O2/AppStateContract.destructured.ir b/examples/global_state/out_O2/AppStateContract.destructured.ir index 17a1ce8b86..76b73952e5 100644 --- a/examples/global_state/out_O2/AppStateContract.destructured.ir +++ b/examples/global_state/out_O2/AppStateContract.destructured.ir @@ -8,15 +8,15 @@ contract examples.global_state.contract.AppStateContract: examples.global_state.contract.AppStateContract.__init__() goto block@2 block@2: // entrypoint_L5 - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists - let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) + let (global_int_simplified_value%1#0: uint64, global_int_simplified_exists%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") + (assert global_int_simplified_exists%2#0) // check global_int_simplified exists + let tmp%3#0: uint64 = (== global_int_simplified_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists - let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) + let (global_int_full_value%6#0: uint64, global_int_full_exists%7#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%7#0) // check global_int_full exists + let tmp%8#0: uint64 = (== global_int_full_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) @@ -26,15 +26,15 @@ contract examples.global_state.contract.AppStateContract: (assert i_exists#0) let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) - let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists - let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") + let (global_bytes_simplified_value%15#0: bytes, global_bytes_simplified_exists%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") + (assert global_bytes_simplified_exists%16#0) // check global_bytes_simplified exists + let tmp%17#0: uint64 = (== global_bytes_simplified_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) - let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists - let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") + let (global_bytes_full_value%20#0: bytes, global_bytes_full_exists%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%21#0) // check global_bytes_full exists + let tmp%22#0: uint64 = (== global_bytes_full_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) diff --git a/examples/global_state/out_unoptimized/AppStateContract.destructured.ir b/examples/global_state/out_unoptimized/AppStateContract.destructured.ir index b3c0672358..5c0ae19952 100644 --- a/examples/global_state/out_unoptimized/AppStateContract.destructured.ir +++ b/examples/global_state/out_unoptimized/AppStateContract.destructured.ir @@ -8,15 +8,15 @@ contract examples.global_state.contract.AppStateContract: examples.global_state.contract.AppStateContract.__init__() goto block@2 block@2: // entrypoint_L5 - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") - (assert app_global_get_ex_did_exist%2#0) // check global_int_simplified exists - let tmp%3#0: uint64 = (== app_global_get_ex_value%1#0 33u) + let (global_int_simplified_value%1#0: uint64, global_int_simplified_exists%2#0: uint64) = (app_global_get_ex 0u "global_int_simplified") + (assert global_int_simplified_exists%2#0) // check global_int_simplified exists + let tmp%3#0: uint64 = (== global_int_simplified_value%1#0 33u) (assert tmp%3#0) let (global_int_full_exists%4#0: any, global_int_full_exists%5#0: uint64) = (app_global_get_ex 0u "global_int_full") (assert global_int_full_exists%5#0) - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "global_int_full") - (assert app_global_get_ex_did_exist%7#0) // check global_int_full exists - let tmp%8#0: uint64 = (== app_global_get_ex_value%6#0 55u) + let (global_int_full_value%6#0: uint64, global_int_full_exists%7#0: uint64) = (app_global_get_ex 0u "global_int_full") + (assert global_int_full_exists%7#0) // check global_int_full exists + let tmp%8#0: uint64 = (== global_int_full_value%6#0 55u) (assert tmp%8#0) let (global_int_no_default_exists%9#0: any, global_int_no_default_exists%10#0: uint64) = (app_global_get_ex 0u "global_int_no_default") let tmp%11#0: uint64 = (! global_int_no_default_exists%10#0) @@ -28,15 +28,15 @@ contract examples.global_state.contract.AppStateContract: (assert i_exists#0) let tmp%14#0: uint64 = (== i_value#0 44u) (assert tmp%14#0) - let (app_global_get_ex_value%15#0: bytes, app_global_get_ex_did_exist%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") - (assert app_global_get_ex_did_exist%16#0) // check global_bytes_simplified exists - let tmp%17#0: uint64 = (== app_global_get_ex_value%15#0 "Hello") + let (global_bytes_simplified_value%15#0: bytes, global_bytes_simplified_exists%16#0: uint64) = (app_global_get_ex 0u "global_bytes_simplified") + (assert global_bytes_simplified_exists%16#0) // check global_bytes_simplified exists + let tmp%17#0: uint64 = (== global_bytes_simplified_value%15#0 "Hello") (assert tmp%17#0) let (global_bytes_full_exists%18#0: any, global_bytes_full_exists%19#0: uint64) = (app_global_get_ex 0u "global_bytes_full") (assert global_bytes_full_exists%19#0) - let (app_global_get_ex_value%20#0: bytes, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") - (assert app_global_get_ex_did_exist%21#0) // check global_bytes_full exists - let tmp%22#0: uint64 = (== app_global_get_ex_value%20#0 "Hello") + let (global_bytes_full_value%20#0: bytes, global_bytes_full_exists%21#0: uint64) = (app_global_get_ex 0u "global_bytes_full") + (assert global_bytes_full_exists%21#0) // check global_bytes_full exists + let tmp%22#0: uint64 = (== global_bytes_full_value%20#0 "Hello") (assert tmp%22#0) let (global_bytes_full_get_ex%23#0: any, global_bytes_full_get_ex%24#0: uint64) = (app_global_get_ex 0u "global_bytes_full") let tmp%25#0: any = (select "default" global_bytes_full_get_ex%23#0 global_bytes_full_get_ex%24#0) diff --git a/examples/global_state/puya.log b/examples/global_state/puya.log index 1ad7df865a..f5d4b6009c 100644 --- a/examples/global_state/puya.log +++ b/examples/global_state/puya.log @@ -426,22 +426,22 @@ debug: Inserted main_entrypoint@2.ops[166]: 'store tmp%38#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[168]: 'load tmp%38#0' with 'load tmp%38#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[171]: 'store tmp%39#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[173]: 'load tmp%39#0' with 'load tmp%39#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[3]: 'store app_global_get_ex_did_exist%2#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[6]: 'load app_global_get_ex_did_exist%2#0' with 'load app_global_get_ex_did_exist%2#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[3]: 'store global_int_simplified_exists%2#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[6]: 'load global_int_simplified_exists%2#0' with 'load global_int_simplified_exists%2#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[18]: 'store global_int_full_exists%5#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[21]: 'load global_int_full_exists%5#0' with 'load global_int_full_exists%5#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[26]: 'store app_global_get_ex_did_exist%7#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[29]: 'load app_global_get_ex_did_exist%7#0' with 'load app_global_get_ex_did_exist%7#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[26]: 'store global_int_full_exists%7#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[29]: 'load global_int_full_exists%7#0' with 'load global_int_full_exists%7#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[41]: 'store global_int_no_default_exists%10#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[44]: 'load global_int_no_default_exists%10#0' with 'load global_int_no_default_exists%10#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[56]: 'store i_exists#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[59]: 'load i_exists#0' with 'load i_exists#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[71]: 'store app_global_get_ex_did_exist%16#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[74]: 'load app_global_get_ex_did_exist%16#0' with 'load app_global_get_ex_did_exist%16#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[71]: 'store global_bytes_simplified_exists%16#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[74]: 'load global_bytes_simplified_exists%16#0' with 'load global_bytes_simplified_exists%16#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[86]: 'store global_bytes_full_exists%19#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[89]: 'load global_bytes_full_exists%19#0' with 'load global_bytes_full_exists%19#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[94]: 'store app_global_get_ex_did_exist%21#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[97]: 'load app_global_get_ex_did_exist%21#0' with 'load app_global_get_ex_did_exist%21#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[94]: 'store global_bytes_full_exists%21#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[97]: 'load global_bytes_full_exists%21#0' with 'load global_bytes_full_exists%21#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[110]: 'store global_bytes_full_get_ex%23#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[113]: 'load global_bytes_full_get_ex%23#0' with 'load global_bytes_full_get_ex%23#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[128]: 'store global_bytes_no_default_exists%28#0 to l-stack (copy)' @@ -452,16 +452,16 @@ debug: Inserted main_entrypoint@2.ops[160]: 'store b_exists#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[163]: 'load b_exists#0' with 'load b_exists#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[173]: 'store global_bytes_no_default_get_ex%36#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[176]: 'load global_bytes_no_default_get_ex%36#0' with 'load global_bytes_no_default_get_ex%36#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[5]: 'store app_global_get_ex_value%1#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[9]: 'load app_global_get_ex_value%1#0' with 'load app_global_get_ex_value%1#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[29]: 'store app_global_get_ex_value%6#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[33]: 'load app_global_get_ex_value%6#0' with 'load app_global_get_ex_value%6#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[5]: 'store global_int_simplified_value%1#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[9]: 'load global_int_simplified_value%1#0' with 'load global_int_simplified_value%1#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[29]: 'store global_int_full_value%6#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[33]: 'load global_int_full_value%6#0' with 'load global_int_full_value%6#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[60]: 'store i_value#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[64]: 'load i_value#0' with 'load i_value#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[76]: 'store app_global_get_ex_value%15#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[80]: 'load app_global_get_ex_value%15#0' with 'load app_global_get_ex_value%15#0 from l-stack (no copy)' -debug: Inserted main_entrypoint@2.ops[100]: 'store app_global_get_ex_value%20#0 to l-stack (copy)' -debug: Replaced main_entrypoint@2.ops[104]: 'load app_global_get_ex_value%20#0' with 'load app_global_get_ex_value%20#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[76]: 'store global_bytes_simplified_value%15#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[80]: 'load global_bytes_simplified_value%15#0' with 'load global_bytes_simplified_value%15#0 from l-stack (no copy)' +debug: Inserted main_entrypoint@2.ops[100]: 'store global_bytes_full_value%20#0 to l-stack (copy)' +debug: Replaced main_entrypoint@2.ops[104]: 'load global_bytes_full_value%20#0' with 'load global_bytes_full_value%20#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[150]: 'store b_value#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[154]: 'load b_value#0' with 'load b_value#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[114]: 'store global_bytes_full_get_ex%24#0 to l-stack (copy)' diff --git a/examples/local_state/out/LocalStateContract.approval.mir b/examples/local_state/out/LocalStateContract.approval.mir index a2c5f010d5..63d64e3f01 100644 --- a/examples/local_state/out/LocalStateContract.approval.mir +++ b/examples/local_state/out/LocalStateContract.approval.mir @@ -1,270 +1,270 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.local_state.local_state_contract.LocalStateContract.approval_program() -> uint64: main: - int 0 // allocate 1 to stack (𝕗) method#0 | + int 0 // allocate 1 to stack (𝕗) method#0 | main_block@0: - txn ApplicationID // (𝕗) method#0 | {txn} Txn.application_id local_state/local_state_contract.py:18 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕗) method#0 | tmp%0#0 Txn.application_id local_state/local_state_contract.py:18 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕗) method#0 | tmp%0#0 if Txn.application_id == 0: local_state/local_state_contract.py:18 - bnz main_after_if_else@2 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 - // Implicit fall through to main_if_body@1 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 + txn ApplicationID // (𝕗) method#0 | {txn} Txn.application_id local_state/local_state_contract.py:18 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕗) method#0 | tmp%0#0 Txn.application_id local_state/local_state_contract.py:18 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕗) method#0 | tmp%0#0 if Txn.application_id == 0: local_state/local_state_contract.py:18 + bnz main_after_if_else@2 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 + // Implicit fall through to main_if_body@1 // (𝕗) method#0 | if Txn.application_id == 0: local_state/local_state_contract.py:18 main_if_body@1: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:19 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:19 + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:19 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:19 main_after_if_else@2: - txn OnCompletion // (𝕗) method#0 | {txn} Txn.on_completion local_state/local_state_contract.py:20 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) method#0 | tmp%2#0 Txn.on_completion local_state/local_state_contract.py:20 - dup // load tmp%2#0 from l-stack (copy) (𝕗) method#0 | tmp%2#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - ! // (𝕗) method#0 | tmp%2#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - swap // store contains%3#0 to l-stack (no copy) (𝕗) method#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) method#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - int OptIn // (𝕗) method#0 | contains%3#0,tmp%2#0,OptIn OnCompleteAction.OptIn local_state/local_state_contract.py:20 - == // (𝕗) method#0 | contains%3#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: store is_equal%4#0 to l-stack (no copy) (𝕗) method#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load contains%3#0 from l-stack (no copy) (𝕗) method#0 | is_equal%4#0,contains%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) method#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - || // (𝕗) method#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) method#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) method#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - bnz main_after_if_else@4 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 - // Implicit fall through to main_if_body@3 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + txn OnCompletion // (𝕗) method#0 | {txn} Txn.on_completion local_state/local_state_contract.py:20 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) method#0 | tmp%2#0 Txn.on_completion local_state/local_state_contract.py:20 + dup // load tmp%2#0 from l-stack (copy) (𝕗) method#0 | tmp%2#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + ! // (𝕗) method#0 | tmp%2#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + swap // store contains%3#0 to l-stack (no copy) (𝕗) method#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) method#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + int OptIn // (𝕗) method#0 | contains%3#0,tmp%2#0,OptIn OnCompleteAction.OptIn local_state/local_state_contract.py:20 + == // (𝕗) method#0 | contains%3#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: store is_equal%4#0 to l-stack (no copy) (𝕗) method#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load contains%3#0 from l-stack (no copy) (𝕗) method#0 | is_equal%4#0,contains%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) method#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + || // (𝕗) method#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) method#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) method#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + bnz main_after_if_else@4 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 + // Implicit fall through to main_if_body@3 // (𝕗) method#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_contract.py:20 main_if_body@3: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:21 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:21 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:21 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:21 main_after_if_else@4: - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:22 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.num_app_args local_state/local_state_contract.py:22 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0 | tmp%6#0 if Txn.num_app_args == 0: local_state/local_state_contract.py:22 - bnz main_after_if_else@6 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 - // Implicit fall through to main_if_body@5 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:22 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0 | tmp%6#0 Txn.num_app_args local_state/local_state_contract.py:22 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0 | tmp%6#0 if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + bnz main_after_if_else@6 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 + // Implicit fall through to main_if_body@5 // (𝕗) method#0 | if Txn.num_app_args == 0: local_state/local_state_contract.py:22 main_if_body@5: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:23 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:23 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:23 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:23 main_after_if_else@6: - txna ApplicationArgs 0 // (𝕗) method#0 | {txna} Txn.application_args(0) local_state/local_state_contract.py:25 - bury 1 // store method#0 to f-stack (𝕗) method#0 | method = Txn.application_args(0) local_state/local_state_contract.py:25 - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:26 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0 | tmp%8#0 Txn.num_app_args local_state/local_state_contract.py:26 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0 | tmp%8#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 - int 1 // (𝕗) method#0 | tmp%8#0,1 1 local_state/local_state_contract.py:26 - == // (𝕗) method#0 | {==} Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0 | tmp%9#0 if Txn.num_app_args == 1: local_state/local_state_contract.py:26 - bz main_else_body@17 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 - // Implicit fall through to main_if_body@7 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + txna ApplicationArgs 0 // (𝕗) method#0 | {txna} Txn.application_args(0) local_state/local_state_contract.py:25 + bury 1 // store method#0 to f-stack (𝕗) method#0 | method = Txn.application_args(0) local_state/local_state_contract.py:25 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:26 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0 | tmp%8#0 Txn.num_app_args local_state/local_state_contract.py:26 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0 | tmp%8#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 + int 1 // (𝕗) method#0 | tmp%8#0,1 1 local_state/local_state_contract.py:26 + == // (𝕗) method#0 | {==} Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0 | tmp%9#0 Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0 | tmp%9#0 if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + bz main_else_body@17 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 + // Implicit fall through to main_if_body@7 // (𝕗) method#0 | if Txn.num_app_args == 1: local_state/local_state_contract.py:26 main_if_body@7: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - byte "get_guaranteed_data" // (𝕗) method#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_contract.py:27 - == // (𝕗) method#0 | {==} method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0 | tmp%10#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0 | tmp%10#0 if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - bz main_else_body@9 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 - // Implicit fall through to main_if_body@8 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + byte "get_guaranteed_data" // (𝕗) method#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_contract.py:27 + == // (𝕗) method#0 | {==} method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0 | tmp%10#0 method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0 | tmp%10#0 if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + bz main_else_body@9 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 + // Implicit fall through to main_if_body@8 // (𝕗) method#0 | if method == b"get_guaranteed_data": local_state/local_state_contract.py:27 main_if_body@8: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:28 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0 | tmp%11#0 Txn.sender local_state/local_state_contract.py:28 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0 | tmp%11#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - callsub get_guaranteed_data // (𝕗) method#0 | {get_guaranteed_data} self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0 | tmp%12#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0 | tmp%12#0 log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 - log // (𝕗) method#0 | log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 - b main_after_if_else@16 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:28 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0 | tmp%11#0 Txn.sender local_state/local_state_contract.py:28 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0 | tmp%11#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + callsub get_guaranteed_data // (𝕗) method#0 | {get_guaranteed_data} self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0 | tmp%12#0 self.get_guaranteed_data(Txn.sender) local_state/local_state_contract.py:28 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0 | tmp%12#0 log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 + log // (𝕗) method#0 | log(self.get_guaranteed_data(Txn.sender)) local_state/local_state_contract.py:28 + b main_after_if_else@16 // (𝕗) method#0 | main_else_body@9: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 - byte "get_data_or_assert" // (𝕗) method#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_contract.py:29 - == // (𝕗) method#0 | {==} method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0 | tmp%13#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0 | tmp%13#0 elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 - bz main_else_body@11 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 - // Implicit fall through to main_if_body@10 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 + byte "get_data_or_assert" // (𝕗) method#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_contract.py:29 + == // (𝕗) method#0 | {==} method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0 | tmp%13#0 method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0 | tmp%13#0 elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + bz main_else_body@11 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 + // Implicit fall through to main_if_body@10 // (𝕗) method#0 | elif method == b"get_data_or_assert": local_state/local_state_contract.py:29 main_if_body@10: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:30 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0 | tmp%14#0 Txn.sender local_state/local_state_contract.py:30 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0 | tmp%14#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - callsub get_data_or_assert // (𝕗) method#0 | {get_data_or_assert} self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0 | tmp%15#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0 | tmp%15#0 log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 - log // (𝕗) method#0 | log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 - b main_after_if_else@16 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:30 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0 | tmp%14#0 Txn.sender local_state/local_state_contract.py:30 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0 | tmp%14#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + callsub get_data_or_assert // (𝕗) method#0 | {get_data_or_assert} self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0 | tmp%15#0 self.get_data_or_assert(Txn.sender) local_state/local_state_contract.py:30 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0 | tmp%15#0 log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 + log // (𝕗) method#0 | log(self.get_data_or_assert(Txn.sender)) local_state/local_state_contract.py:30 + b main_after_if_else@16 // (𝕗) method#0 | main_else_body@11: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"delete_data": local_state/local_state_contract.py:31 - byte "delete_data" // (𝕗) method#0 | method#0,"delete_data" b"delete_data" local_state/local_state_contract.py:31 - == // (𝕗) method#0 | {==} method == b"delete_data": local_state/local_state_contract.py:31 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0 | tmp%16#0 method == b"delete_data": local_state/local_state_contract.py:31 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0 | tmp%16#0 elif method == b"delete_data": local_state/local_state_contract.py:31 - bz main_else_body@13 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 - // Implicit fall through to main_if_body@12 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"delete_data": local_state/local_state_contract.py:31 + byte "delete_data" // (𝕗) method#0 | method#0,"delete_data" b"delete_data" local_state/local_state_contract.py:31 + == // (𝕗) method#0 | {==} method == b"delete_data": local_state/local_state_contract.py:31 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0 | tmp%16#0 method == b"delete_data": local_state/local_state_contract.py:31 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0 | tmp%16#0 elif method == b"delete_data": local_state/local_state_contract.py:31 + bz main_else_body@13 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 + // Implicit fall through to main_if_body@12 // (𝕗) method#0 | elif method == b"delete_data": local_state/local_state_contract.py:31 main_if_body@12: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:32 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0 | tmp%17#0 Txn.sender local_state/local_state_contract.py:32 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0 | tmp%17#0 self.delete_data(Txn.sender) local_state/local_state_contract.py:32 - callsub delete_data // (𝕗) method#0 | self.delete_data(Txn.sender) local_state/local_state_contract.py:32 - byte "Deleted" // (𝕗) method#0 | "Deleted" b"Deleted" local_state/local_state_contract.py:33 - log // (𝕗) method#0 | log(b"Deleted") local_state/local_state_contract.py:33 - b main_after_if_else@16 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:32 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0 | tmp%17#0 Txn.sender local_state/local_state_contract.py:32 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0 | tmp%17#0 self.delete_data(Txn.sender) local_state/local_state_contract.py:32 + callsub delete_data // (𝕗) method#0 | self.delete_data(Txn.sender) local_state/local_state_contract.py:32 + byte "Deleted" // (𝕗) method#0 | "Deleted" b"Deleted" local_state/local_state_contract.py:33 + log // (𝕗) method#0 | log(b"Deleted") local_state/local_state_contract.py:33 + b main_after_if_else@16 // (𝕗) method#0 | main_else_body@13: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:35 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:35 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:35 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:35 main_after_if_else@16: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:36 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:36 + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:36 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:36 main_else_body@17: - txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:37 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.num_app_args local_state/local_state_contract.py:37 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 - int 2 // (𝕗) method#0 | tmp%18#0,2 2 local_state/local_state_contract.py:37 - == // (𝕗) method#0 | {==} Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0 | tmp%19#0 elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 - bz main_else_body@25 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 - // Implicit fall through to main_if_body@18 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + txn NumAppArgs // (𝕗) method#0 | {txn} Txn.num_app_args local_state/local_state_contract.py:37 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.num_app_args local_state/local_state_contract.py:37 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0 | tmp%18#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 + int 2 // (𝕗) method#0 | tmp%18#0,2 2 local_state/local_state_contract.py:37 + == // (𝕗) method#0 | {==} Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0 | tmp%19#0 Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) method#0 | tmp%19#0 elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + bz main_else_body@25 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 + // Implicit fall through to main_if_body@18 // (𝕗) method#0 | elif Txn.num_app_args == 2: local_state/local_state_contract.py:37 main_if_body@18: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"set_data": local_state/local_state_contract.py:38 - byte "set_data" // (𝕗) method#0 | method#0,"set_data" b"set_data" local_state/local_state_contract.py:38 - == // (𝕗) method#0 | {==} method == b"set_data": local_state/local_state_contract.py:38 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0 | tmp%20#0 method == b"set_data": local_state/local_state_contract.py:38 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0 | tmp%20#0 if method == b"set_data": local_state/local_state_contract.py:38 - bz main_else_body@20 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 - // Implicit fall through to main_if_body@19 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"set_data": local_state/local_state_contract.py:38 + byte "set_data" // (𝕗) method#0 | method#0,"set_data" b"set_data" local_state/local_state_contract.py:38 + == // (𝕗) method#0 | {==} method == b"set_data": local_state/local_state_contract.py:38 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0 | tmp%20#0 method == b"set_data": local_state/local_state_contract.py:38 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0 | tmp%20#0 if method == b"set_data": local_state/local_state_contract.py:38 + bz main_else_body@20 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 + // Implicit fall through to main_if_body@19 // (𝕗) method#0 | if method == b"set_data": local_state/local_state_contract.py:38 main_if_body@19: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:39 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0 Txn.sender local_state/local_state_contract.py:39 - txna ApplicationArgs 1 // (𝕗) method#0 | tmp%21#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:39 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0,tmp%22#0 Txn.application_args(1) local_state/local_state_contract.py:39 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%21#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0 | tmp%21#0,tmp%22#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - callsub set_data // (𝕗) method#0 | self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 - b main_after_if_else@24 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:39 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0 Txn.sender local_state/local_state_contract.py:39 + txna ApplicationArgs 1 // (𝕗) method#0 | tmp%21#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:39 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0 | tmp%21#0,tmp%22#0 Txn.application_args(1) local_state/local_state_contract.py:39 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕗) method#0 | tmp%22#0,tmp%21#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0 | tmp%21#0,tmp%22#0 self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + callsub set_data // (𝕗) method#0 | self.set_data(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:39 + b main_after_if_else@24 // (𝕗) method#0 | main_else_body@20: - dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 - byte "get_data_with_default" // (𝕗) method#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_contract.py:40 - == // (𝕗) method#0 | {==} method == b"get_data_with_default": local_state/local_state_contract.py:40 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0 | tmp%23#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0 | tmp%23#0 elif method == b"get_data_with_default": local_state/local_state_contract.py:40 - bz main_else_body@22 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 - // Implicit fall through to main_if_body@21 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + dup // load method#0 from f-stack (𝕗) method#0 | method#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 + byte "get_data_with_default" // (𝕗) method#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_contract.py:40 + == // (𝕗) method#0 | {==} method == b"get_data_with_default": local_state/local_state_contract.py:40 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) method#0 | tmp%23#0 method == b"get_data_with_default": local_state/local_state_contract.py:40 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) method#0 | tmp%23#0 elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + bz main_else_body@22 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 + // Implicit fall through to main_if_body@21 // (𝕗) method#0 | elif method == b"get_data_with_default": local_state/local_state_contract.py:40 main_if_body@21: - txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:41 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0 Txn.sender local_state/local_state_contract.py:41 - txna ApplicationArgs 1 // (𝕗) method#0 | tmp%24#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:41 - // virtual: store tmp%25#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0,tmp%25#0 Txn.application_args(1) local_state/local_state_contract.py:41 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%24#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: load tmp%25#0 from l-stack (no copy) (𝕗) method#0 | tmp%24#0,tmp%25#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - callsub get_data_with_default // (𝕗) method#0 | {get_data_with_default} self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) method#0 | tmp%26#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 - // virtual: load tmp%26#0 from l-stack (no copy) (𝕗) method#0 | tmp%26#0 log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 - log // (𝕗) method#0 | log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 - b main_after_if_else@24 // (𝕗) method#0 | + txn Sender // (𝕗) method#0 | {txn} Txn.sender local_state/local_state_contract.py:41 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0 Txn.sender local_state/local_state_contract.py:41 + txna ApplicationArgs 1 // (𝕗) method#0 | tmp%24#0,{txna} Txn.application_args(1) local_state/local_state_contract.py:41 + // virtual: store tmp%25#0 to l-stack (no copy) (𝕗) method#0 | tmp%24#0,tmp%25#0 Txn.application_args(1) local_state/local_state_contract.py:41 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) method#0 | tmp%25#0,tmp%24#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: load tmp%25#0 from l-stack (no copy) (𝕗) method#0 | tmp%24#0,tmp%25#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + callsub get_data_with_default // (𝕗) method#0 | {get_data_with_default} self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) method#0 | tmp%26#0 self.get_data_with_default(Txn.sender, Txn.application_args(1)) local_state/local_state_contract.py:41 + // virtual: load tmp%26#0 from l-stack (no copy) (𝕗) method#0 | tmp%26#0 log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 + log // (𝕗) method#0 | log(self.get_data_with_default(Txn.sender, Txn.application_args(1))) local_state/local_state_contract.py:41 + b main_after_if_else@24 // (𝕗) method#0 | main_else_body@22: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:43 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:43 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:43 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:43 main_after_if_else@24: - int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:44 - return // (𝕗) method#0 | return True local_state/local_state_contract.py:44 + int 1 // (𝕗) method#0 | 1 True local_state/local_state_contract.py:44 + return // (𝕗) method#0 | return True local_state/local_state_contract.py:44 main_else_body@25: - int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:46 - return // (𝕗) method#0 | return False local_state/local_state_contract.py:46 + int 0 // (𝕗) method#0 | 0 False local_state/local_state_contract.py:46 + return // (𝕗) method#0 | return False local_state/local_state_contract.py:46 // examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: get_guaranteed_data: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:51-52 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:51-52 get_guaranteed_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_contract.py:53 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_contract.py:53 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_contract.py:53 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_contract.py:53 - assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_contract.py:53 - // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 - retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_contract.py:53 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_contract.py:53 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_contract.py:53 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: store local_exists%1#0 to l-stack (no copy) (𝕡) for_account#0 | local_exists%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: store local_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | local_value%0#0,local_exists%1#0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: load local_exists%1#0 from l-stack (no copy) (𝕡) for_account#0 | local_value%0#0,local_exists%1#0 self.local[for_account] local_state/local_state_contract.py:53 + assert // check local exists for account // (𝕡) for_account#0 | local_value%0#0 self.local[for_account] local_state/local_state_contract.py:53 + // virtual: load local_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | local_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 + retsub // local_value%0#0 return self.local[for_account] local_state/local_state_contract.py:53 // examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: get_data_or_assert: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:59-60 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: Account) -> Bytes: local_state/local_state_contract.py:59-60 get_data_or_assert_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_contract.py:61 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 - // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_contract.py:62 - assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_contract.py:62 - // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_contract.py:63 - retsub // result#0 return result local_state/local_state_contract.py:63 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_contract.py:61 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_contract.py:61 + // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_contract.py:62 + assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_contract.py:62 + // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_contract.py:63 + retsub // result#0 return result local_state/local_state_contract.py:63 // examples.local_state.local_state_contract.LocalStateContract.delete_data(for_account: bytes) -> void: delete_data: - proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: Account) -> None: local_state/local_state_contract.py:69-70 + proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: Account) -> None: local_state/local_state_contract.py:69-70 delete_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_contract.py:71 - byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:71 - app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_contract.py:71 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_contract.py:71 + byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:71 + app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_contract.py:71 retsub // // examples.local_state.local_state_contract.LocalStateContract.set_data(for_account: bytes, value: bytes) -> void: set_data: - proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: Account, value: Bytes) -> None: local_state/local_state_contract.py:65-66 + proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: Account, value: Bytes) -> None: local_state/local_state_contract.py:65-66 set_data_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_contract.py:67 - byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:67 - frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_contract.py:67 - app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_contract.py:67 + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_contract.py:67 + byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_contract.py:67 + frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_contract.py:67 + app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_contract.py:67 retsub // // examples.local_state.local_state_contract.LocalStateContract.get_data_with_default(for_account: bytes, default: bytes) -> bytes: get_data_with_default: - proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: Account, default: Bytes) -> Bytes: local_state/local_state_contract.py:55-56 + proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: Account, default: Bytes) -> Bytes: local_state/local_state_contract.py:55-56 get_data_with_default_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_contract.py:57 - app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_contract.py:57 - swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 - retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_contract.py:57 + app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_contract.py:57 + swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_contract.py:57 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 + retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_contract.py:57 diff --git a/examples/local_state/out/LocalStateContract.destructured.ir b/examples/local_state/out/LocalStateContract.destructured.ir index 374b9f1523..e63ee8c7ef 100644 --- a/examples/local_state/out/LocalStateContract.destructured.ir +++ b/examples/local_state/out/LocalStateContract.destructured.ir @@ -82,9 +82,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: block@0: // L59 diff --git a/examples/local_state/out/LocalStateContract.ssa.ir b/examples/local_state/out/LocalStateContract.ssa.ir index 40b3106205..b22d2722fb 100644 --- a/examples/local_state/out/LocalStateContract.ssa.ir +++ b/examples/local_state/out/LocalStateContract.ssa.ir @@ -90,9 +90,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: block@0: // L59 diff --git a/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir b/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir index 9faf0b5357..c0d686a2b2 100644 --- a/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir +++ b/examples/local_state/out/LocalStateContract.ssa.opt_pass_1.ir @@ -84,9 +84,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: block@0: // L59 diff --git a/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir b/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir index 374b9f1523..e63ee8c7ef 100644 --- a/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir +++ b/examples/local_state/out/LocalStateContract.ssa.opt_pass_2.ir @@ -82,9 +82,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: block@0: // L59 diff --git a/examples/local_state/out/LocalStateWithOffsets.approval.mir b/examples/local_state/out/LocalStateWithOffsets.approval.mir index 0d56ade568..2aa56ca9aa 100644 --- a/examples/local_state/out/LocalStateWithOffsets.approval.mir +++ b/examples/local_state/out/LocalStateWithOffsets.approval.mir @@ -1,270 +1,270 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // examples.local_state.local_state_with_offsets.LocalStateContract.approval_program() -> uint64: main: int 0 - byte "" // allocate 2 to stack (𝕗) method#0,offset#0 | + byte "" // allocate 2 to stack (𝕗) method#0,offset#0 | main_block@0: - txn ApplicationID // (𝕗) method#0,offset#0 | {txn} Txn.application_id local_state/local_state_with_offsets.py:19 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%0#0 Txn.application_id local_state/local_state_with_offsets.py:19 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%0#0 if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 - bnz main_after_if_else@2 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 - // Implicit fall through to main_if_body@1 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + txn ApplicationID // (𝕗) method#0,offset#0 | {txn} Txn.application_id local_state/local_state_with_offsets.py:19 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%0#0 Txn.application_id local_state/local_state_with_offsets.py:19 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%0#0 if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + bnz main_after_if_else@2 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 + // Implicit fall through to main_if_body@1 // (𝕗) method#0,offset#0 | if Txn.application_id == 0: local_state/local_state_with_offsets.py:19 main_if_body@1: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:20 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:20 + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:20 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:20 main_after_if_else@2: - txn OnCompletion // (𝕗) method#0,offset#0 | {txn} Txn.on_completion local_state/local_state_with_offsets.py:21 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%2#0 Txn.on_completion local_state/local_state_with_offsets.py:21 - dup // load tmp%2#0 from l-stack (copy) (𝕗) method#0,offset#0 | tmp%2#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - ! // (𝕗) method#0,offset#0 | tmp%2#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - swap // store contains%3#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - int OptIn // (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0,OptIn OnCompleteAction.OptIn local_state/local_state_with_offsets.py:21 - == // (𝕗) method#0,offset#0 | contains%3#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: store is_equal%4#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load contains%3#0 from l-stack (no copy) (𝕗) method#0,offset#0 | is_equal%4#0,contains%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - || // (𝕗) method#0,offset#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - bnz main_after_if_else@4 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 - // Implicit fall through to main_if_body@3 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + txn OnCompletion // (𝕗) method#0,offset#0 | {txn} Txn.on_completion local_state/local_state_with_offsets.py:21 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%2#0 Txn.on_completion local_state/local_state_with_offsets.py:21 + dup // load tmp%2#0 from l-stack (copy) (𝕗) method#0,offset#0 | tmp%2#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + ! // (𝕗) method#0,offset#0 | tmp%2#0,{!} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + swap // store contains%3#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + int OptIn // (𝕗) method#0,offset#0 | contains%3#0,tmp%2#0,OptIn OnCompleteAction.OptIn local_state/local_state_with_offsets.py:21 + == // (𝕗) method#0,offset#0 | contains%3#0,{==} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: store is_equal%4#0 to l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load contains%3#0 from l-stack (no copy) (𝕗) method#0,offset#0 | is_equal%4#0,contains%3#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) method#0,offset#0 | contains%3#0,is_equal%4#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + || // (𝕗) method#0,offset#0 | {||} Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%5#0 Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + bnz main_after_if_else@4 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 + // Implicit fall through to main_if_body@3 // (𝕗) method#0,offset#0 | Txn.on_completion not in (OnCompleteAction.NoOp, OnCompleteAction.OptIn): local_state/local_state_with_offsets.py:21 main_if_body@3: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:22 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:22 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:22 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:22 main_after_if_else@4: - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:23 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.num_app_args local_state/local_state_with_offsets.py:23 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - int 1 // (𝕗) method#0,offset#0 | tmp%6#0,1 1 local_state/local_state_with_offsets.py:23 - < // (𝕗) method#0,offset#0 | {<} Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - bz main_after_if_else@6 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 - // Implicit fall through to main_if_body@5 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:23 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.num_app_args local_state/local_state_with_offsets.py:23 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%6#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + int 1 // (𝕗) method#0,offset#0 | tmp%6#0,1 1 local_state/local_state_with_offsets.py:23 + < // (𝕗) method#0,offset#0 | {<} Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%7#0 if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + bz main_after_if_else@6 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 + // Implicit fall through to main_if_body@5 // (𝕗) method#0,offset#0 | if Txn.num_app_args < 1: local_state/local_state_with_offsets.py:23 main_if_body@5: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:24 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:24 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:24 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:24 main_after_if_else@6: - txna ApplicationArgs 0 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(0) local_state/local_state_with_offsets.py:26 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 Txn.application_args(0) local_state/local_state_with_offsets.py:26 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - btoi // (𝕗) method#0,offset#0 | {btoi} op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - bury 1 // store offset#0 to f-stack (𝕗) method#0,offset#0 | offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 - txna ApplicationArgs 1 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(1) local_state/local_state_with_offsets.py:27 - bury 2 // store method#0 to f-stack (𝕗) method#0,offset#0 | method = Txn.application_args(1) local_state/local_state_with_offsets.py:27 - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:28 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.num_app_args local_state/local_state_with_offsets.py:28 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - int 2 // (𝕗) method#0,offset#0 | tmp%9#0,2 2 local_state/local_state_with_offsets.py:28 - == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - bz main_else_body@17 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 - // Implicit fall through to main_if_body@7 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + txna ApplicationArgs 0 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(0) local_state/local_state_with_offsets.py:26 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 Txn.application_args(0) local_state/local_state_with_offsets.py:26 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%8#0 offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + btoi // (𝕗) method#0,offset#0 | {btoi} op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + bury 1 // store offset#0 to f-stack (𝕗) method#0,offset#0 | offset = op.btoi(Txn.application_args(0)) local_state/local_state_with_offsets.py:26 + txna ApplicationArgs 1 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(1) local_state/local_state_with_offsets.py:27 + bury 2 // store method#0 to f-stack (𝕗) method#0,offset#0 | method = Txn.application_args(1) local_state/local_state_with_offsets.py:27 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:28 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.num_app_args local_state/local_state_with_offsets.py:28 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%9#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + int 2 // (𝕗) method#0,offset#0 | tmp%9#0,2 2 local_state/local_state_with_offsets.py:28 + == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%10#0 if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + bz main_else_body@17 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 + // Implicit fall through to main_if_body@7 // (𝕗) method#0,offset#0 | if Txn.num_app_args == 2: local_state/local_state_with_offsets.py:28 main_if_body@7: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - byte "get_guaranteed_data" // (𝕗) method#0,offset#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_with_offsets.py:29 - == // (𝕗) method#0,offset#0 | {==} method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - bz main_else_body@9 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 - // Implicit fall through to main_if_body@8 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + byte "get_guaranteed_data" // (𝕗) method#0,offset#0 | method#0,"get_guaranteed_data" b"get_guaranteed_data" local_state/local_state_with_offsets.py:29 + == // (𝕗) method#0,offset#0 | {==} method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%11#0 if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + bz main_else_body@9 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 + // Implicit fall through to main_if_body@8 // (𝕗) method#0,offset#0 | if method == b"get_guaranteed_data": local_state/local_state_with_offsets.py:29 main_if_body@8: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - callsub get_guaranteed_data // (𝕗) method#0,offset#0 | {get_guaranteed_data} self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 - log // (𝕗) method#0,offset#0 | log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 - b main_after_if_else@16 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + callsub get_guaranteed_data // (𝕗) method#0,offset#0 | {get_guaranteed_data} self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 self.get_guaranteed_data(offset) local_state/local_state_with_offsets.py:30 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%12#0 log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 + log // (𝕗) method#0,offset#0 | log(self.get_guaranteed_data(offset)) local_state/local_state_with_offsets.py:30 + b main_after_if_else@16 // (𝕗) method#0,offset#0 | main_else_body@9: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - byte "get_data_or_assert" // (𝕗) method#0,offset#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_with_offsets.py:31 - == // (𝕗) method#0,offset#0 | {==} method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - bz main_else_body@11 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 - // Implicit fall through to main_if_body@10 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + byte "get_data_or_assert" // (𝕗) method#0,offset#0 | method#0,"get_data_or_assert" b"get_data_or_assert" local_state/local_state_with_offsets.py:31 + == // (𝕗) method#0,offset#0 | {==} method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%13#0 elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + bz main_else_body@11 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 + // Implicit fall through to main_if_body@10 // (𝕗) method#0,offset#0 | elif method == b"get_data_or_assert": local_state/local_state_with_offsets.py:31 main_if_body@10: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - callsub get_data_or_assert // (𝕗) method#0,offset#0 | {get_data_or_assert} self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 - log // (𝕗) method#0,offset#0 | log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 - b main_after_if_else@16 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + callsub get_data_or_assert // (𝕗) method#0,offset#0 | {get_data_or_assert} self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 self.get_data_or_assert(offset) local_state/local_state_with_offsets.py:32 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%14#0 log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 + log // (𝕗) method#0,offset#0 | log(self.get_data_or_assert(offset)) local_state/local_state_with_offsets.py:32 + b main_after_if_else@16 // (𝕗) method#0,offset#0 | main_else_body@11: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 - byte "delete_data" // (𝕗) method#0,offset#0 | method#0,"delete_data" b"delete_data" local_state/local_state_with_offsets.py:33 - == // (𝕗) method#0,offset#0 | {==} method == b"delete_data": local_state/local_state_with_offsets.py:33 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 elif method == b"delete_data": local_state/local_state_with_offsets.py:33 - bz main_else_body@13 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 - // Implicit fall through to main_if_body@12 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 + byte "delete_data" // (𝕗) method#0,offset#0 | method#0,"delete_data" b"delete_data" local_state/local_state_with_offsets.py:33 + == // (𝕗) method#0,offset#0 | {==} method == b"delete_data": local_state/local_state_with_offsets.py:33 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 method == b"delete_data": local_state/local_state_with_offsets.py:33 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%15#0 elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + bz main_else_body@13 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 + // Implicit fall through to main_if_body@12 // (𝕗) method#0,offset#0 | elif method == b"delete_data": local_state/local_state_with_offsets.py:33 main_if_body@12: - dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.delete_data(offset) local_state/local_state_with_offsets.py:34 - callsub delete_data // (𝕗) method#0,offset#0 | self.delete_data(offset) local_state/local_state_with_offsets.py:34 - byte "Deleted" // (𝕗) method#0,offset#0 | "Deleted" b"Deleted" local_state/local_state_with_offsets.py:35 - log // (𝕗) method#0,offset#0 | log(b"Deleted") local_state/local_state_with_offsets.py:35 - b main_after_if_else@16 // (𝕗) method#0,offset#0 | + dup // load offset#0 from f-stack (𝕗) method#0,offset#0 | offset#0 self.delete_data(offset) local_state/local_state_with_offsets.py:34 + callsub delete_data // (𝕗) method#0,offset#0 | self.delete_data(offset) local_state/local_state_with_offsets.py:34 + byte "Deleted" // (𝕗) method#0,offset#0 | "Deleted" b"Deleted" local_state/local_state_with_offsets.py:35 + log // (𝕗) method#0,offset#0 | log(b"Deleted") local_state/local_state_with_offsets.py:35 + b main_after_if_else@16 // (𝕗) method#0,offset#0 | main_else_body@13: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:37 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:37 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:37 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:37 main_after_if_else@16: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:38 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:38 + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:38 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:38 main_else_body@17: - txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:39 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 Txn.num_app_args local_state/local_state_with_offsets.py:39 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - int 3 // (𝕗) method#0,offset#0 | tmp%16#0,3 3 local_state/local_state_with_offsets.py:39 - == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - bz main_else_body@25 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 - // Implicit fall through to main_if_body@18 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + txn NumAppArgs // (𝕗) method#0,offset#0 | {txn} Txn.num_app_args local_state/local_state_with_offsets.py:39 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 Txn.num_app_args local_state/local_state_with_offsets.py:39 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%16#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + int 3 // (𝕗) method#0,offset#0 | tmp%16#0,3 3 local_state/local_state_with_offsets.py:39 + == // (𝕗) method#0,offset#0 | {==} Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%17#0 elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + bz main_else_body@25 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 + // Implicit fall through to main_if_body@18 // (𝕗) method#0,offset#0 | elif Txn.num_app_args == 3: local_state/local_state_with_offsets.py:39 main_if_body@18: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"set_data": local_state/local_state_with_offsets.py:40 - byte "set_data" // (𝕗) method#0,offset#0 | method#0,"set_data" b"set_data" local_state/local_state_with_offsets.py:40 - == // (𝕗) method#0,offset#0 | {==} method == b"set_data": local_state/local_state_with_offsets.py:40 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 method == b"set_data": local_state/local_state_with_offsets.py:40 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 if method == b"set_data": local_state/local_state_with_offsets.py:40 - bz main_else_body@20 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 - // Implicit fall through to main_if_body@19 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"set_data": local_state/local_state_with_offsets.py:40 + byte "set_data" // (𝕗) method#0,offset#0 | method#0,"set_data" b"set_data" local_state/local_state_with_offsets.py:40 + == // (𝕗) method#0,offset#0 | {==} method == b"set_data": local_state/local_state_with_offsets.py:40 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 method == b"set_data": local_state/local_state_with_offsets.py:40 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%18#0 if method == b"set_data": local_state/local_state_with_offsets.py:40 + bz main_else_body@20 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 + // Implicit fall through to main_if_body@19 // (𝕗) method#0,offset#0 | if method == b"set_data": local_state/local_state_with_offsets.py:40 main_if_body@19: - txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:41 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 Txn.application_args(2) local_state/local_state_with_offsets.py:41 - dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%19#0,offset#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - swap // load tmp%19#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%19#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - callsub set_data // (𝕗) method#0,offset#0 | self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 - b main_after_if_else@24 // (𝕗) method#0,offset#0 | + txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:41 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%19#0 Txn.application_args(2) local_state/local_state_with_offsets.py:41 + dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%19#0,offset#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + swap // load tmp%19#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%19#0 self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + callsub set_data // (𝕗) method#0,offset#0 | self.set_data(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:41 + b main_after_if_else@24 // (𝕗) method#0,offset#0 | main_else_body@20: - dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - byte "get_data_with_default" // (𝕗) method#0,offset#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_with_offsets.py:42 - == // (𝕗) method#0,offset#0 | {==} method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - bz main_else_body@22 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 - // Implicit fall through to main_if_body@21 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + dig 1 // load method#0 from f-stack (𝕗) method#0,offset#0 | method#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + byte "get_data_with_default" // (𝕗) method#0,offset#0 | method#0,"get_data_with_default" b"get_data_with_default" local_state/local_state_with_offsets.py:42 + == // (𝕗) method#0,offset#0 | {==} method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%20#0 elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + bz main_else_body@22 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 + // Implicit fall through to main_if_body@21 // (𝕗) method#0,offset#0 | elif method == b"get_data_with_default": local_state/local_state_with_offsets.py:42 main_if_body@21: - txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:43 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 Txn.application_args(2) local_state/local_state_with_offsets.py:43 - dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%21#0,offset#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - swap // load tmp%21#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%21#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - callsub get_data_with_default // (𝕗) method#0,offset#0 | {get_data_with_default} self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 - log // (𝕗) method#0,offset#0 | log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 - b main_after_if_else@24 // (𝕗) method#0,offset#0 | + txna ApplicationArgs 2 // (𝕗) method#0,offset#0 | {txna} Txn.application_args(2) local_state/local_state_with_offsets.py:43 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%21#0 Txn.application_args(2) local_state/local_state_with_offsets.py:43 + dig 1 // load offset#0 from f-stack (𝕗) method#0,offset#0 | tmp%21#0,offset#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + swap // load tmp%21#0 from l-stack (no copy) (𝕗) method#0,offset#0 | offset#0,tmp%21#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + callsub get_data_with_default // (𝕗) method#0,offset#0 | {get_data_with_default} self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 self.get_data_with_default(offset, Txn.application_args(2)) local_state/local_state_with_offsets.py:43 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) method#0,offset#0 | tmp%22#0 log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 + log // (𝕗) method#0,offset#0 | log(self.get_data_with_default(offset, Txn.application_args(2))) local_state/local_state_with_offsets.py:43 + b main_after_if_else@24 // (𝕗) method#0,offset#0 | main_else_body@22: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:45 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:45 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:45 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:45 main_after_if_else@24: - int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:46 - return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:46 + int 1 // (𝕗) method#0,offset#0 | 1 True local_state/local_state_with_offsets.py:46 + return // (𝕗) method#0,offset#0 | return True local_state/local_state_with_offsets.py:46 main_else_body@25: - int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:48 - return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:48 + int 0 // (𝕗) method#0,offset#0 | 0 False local_state/local_state_with_offsets.py:48 + return // (𝕗) method#0,offset#0 | return False local_state/local_state_with_offsets.py:48 // examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: get_guaranteed_data: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:53-54 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_guaranteed_data(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:53-54 get_guaranteed_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_with_offsets.py:55 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_with_offsets.py:55 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: store app_local_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_did_exist%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: store app_local_get_ex_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: load app_local_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0,app_local_get_ex_did_exist%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - assert // check local exists for account // (𝕡) for_account#0 | app_local_get_ex_value%0#0 self.local[for_account] local_state/local_state_with_offsets.py:55 - // virtual: load app_local_get_ex_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 - retsub // app_local_get_ex_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local[for_account] local_state/local_state_with_offsets.py:55 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local[for_account] local_state/local_state_with_offsets.py:55 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: store local_exists%1#0 to l-stack (no copy) (𝕡) for_account#0 | local_exists%1#0,{app_local_get_ex}.0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: store local_value%0#0 to l-stack (no copy) (𝕡) for_account#0 | local_value%0#0,local_exists%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: load local_exists%1#0 from l-stack (no copy) (𝕡) for_account#0 | local_value%0#0,local_exists%1#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + assert // check local exists for account // (𝕡) for_account#0 | local_value%0#0 self.local[for_account] local_state/local_state_with_offsets.py:55 + // virtual: load local_value%0#0 from l-stack (no copy) (𝕡) for_account#0 | local_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 + retsub // local_value%0#0 return self.local[for_account] local_state/local_state_with_offsets.py:55 // examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: get_data_or_assert: - proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:61-62 + proto 1 1 // (𝕡) for_account#0 | @subroutine\ndef get_data_or_assert(self, for_account: UInt64) -> Bytes: local_state/local_state_with_offsets.py:61-62 get_data_or_assert_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 - // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 - assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 - // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_with_offsets.py:65 - retsub // result#0 return result local_state/local_state_with_offsets.py:65 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + int 0 // (𝕡) for_account#0 | for_account#0,0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + byte "local" // (𝕡) for_account#0 | for_account#0,0,"local" self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + app_local_get_ex // (𝕡) for_account#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: store exists#0 to l-stack (no copy) (𝕡) for_account#0 | exists#0,{app_local_get_ex}.0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: store result#0 to l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 self.local.maybe(for_account) local_state/local_state_with_offsets.py:63 + // virtual: load exists#0 from l-stack (no copy) (𝕡) for_account#0 | result#0,exists#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 + assert // no data for account // (𝕡) for_account#0 | result#0 assert exists, "no data for account" local_state/local_state_with_offsets.py:64 + // virtual: load result#0 from l-stack (no copy) (𝕡) for_account#0 | result#0 return result local_state/local_state_with_offsets.py:65 + retsub // result#0 return result local_state/local_state_with_offsets.py:65 // examples.local_state.local_state_with_offsets.LocalStateContract.delete_data(for_account: uint64) -> void: delete_data: - proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: UInt64) -> None: local_state/local_state_with_offsets.py:71-72 + proto 1 0 // (𝕡) for_account#0 | @subroutine\ndef delete_data(self, for_account: UInt64) -> None: local_state/local_state_with_offsets.py:71-72 delete_data_block@0: - frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_with_offsets.py:73 - byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:73 - app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_with_offsets.py:73 + frame_dig -1 // load for_account#0 from parameters (𝕡) for_account#0 | for_account#0 del self.local[for_account] local_state/local_state_with_offsets.py:73 + byte "local" // (𝕡) for_account#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:73 + app_local_del // (𝕡) for_account#0 | del self.local[for_account] local_state/local_state_with_offsets.py:73 retsub // // examples.local_state.local_state_with_offsets.LocalStateContract.set_data(for_account: uint64, value: bytes) -> void: set_data: - proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: UInt64, value: Bytes) -> None: local_state/local_state_with_offsets.py:67-68 + proto 2 0 // (𝕡) for_account#0,value#0 | @subroutine\ndef set_data(self, for_account: UInt64, value: Bytes) -> None: local_state/local_state_with_offsets.py:67-68 set_data_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 - byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:69 - frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 - app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_with_offsets.py:69 + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,value#0 | for_account#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 + byte "local" // (𝕡) for_account#0,value#0 | for_account#0,"local" self.local[for_account] local_state/local_state_with_offsets.py:69 + frame_dig -1 // load value#0 from parameters (𝕡) for_account#0,value#0 | for_account#0,"local",value#0 self.local[for_account] = value local_state/local_state_with_offsets.py:69 + app_local_put // (𝕡) for_account#0,value#0 | self.local[for_account] = value local_state/local_state_with_offsets.py:69 retsub // // examples.local_state.local_state_with_offsets.LocalStateContract.get_data_with_default(for_account: uint64, default: bytes) -> bytes: get_data_with_default: - proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: UInt64, default: Bytes) -> Bytes: local_state/local_state_with_offsets.py:57-58 + proto 2 1 // (𝕡) for_account#0,default#0 | @subroutine\ndef get_data_with_default(self, for_account: UInt64, default: Bytes) -> Bytes: local_state/local_state_with_offsets.py:57-58 get_data_with_default_block@0: - frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 - retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + frame_dig -2 // load for_account#0 from parameters (𝕡) for_account#0,default#0 | for_account#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + int 0 // (𝕡) for_account#0,default#0 | for_account#0,0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + byte "local" // (𝕡) for_account#0,default#0 | for_account#0,0,"local" self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + app_local_get_ex // (𝕡) for_account#0,default#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + swap // store local_get_ex%1#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,{app_local_get_ex}.0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: store local_get_ex%0#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + frame_dig -1 // load default#0 from parameters (𝕡) for_account#0,default#0 | local_get_ex%1#0,local_get_ex%0#0,default#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + swap // load local_get_ex%0#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | local_get_ex%1#0,default#0,local_get_ex%0#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + uncover 2 // load local_get_ex%1#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | default#0,local_get_ex%0#0,local_get_ex%1#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + select // (𝕡) for_account#0,default#0 | {select} self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) for_account#0,default#0 | tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 + retsub // tmp%2#0 return self.local.get(for_account, default) local_state/local_state_with_offsets.py:59 diff --git a/examples/local_state/out/LocalStateWithOffsets.destructured.ir b/examples/local_state/out/LocalStateWithOffsets.destructured.ir index 3abd1702d7..f9d35fef00 100644 --- a/examples/local_state/out/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out/LocalStateWithOffsets.destructured.ir @@ -80,9 +80,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: block@0: // L61 diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.ir index e46be0f113..6462030c0e 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.ir @@ -87,9 +87,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: block@0: // L61 diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir index 1e9351afe4..534331c01b 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_1.ir @@ -81,9 +81,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: block@0: // L61 diff --git a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir index 3abd1702d7..f9d35fef00 100644 --- a/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir +++ b/examples/local_state/out/LocalStateWithOffsets.ssa.opt_pass_2.ir @@ -80,9 +80,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: block@0: // L61 diff --git a/examples/local_state/out_O2/LocalStateContract.destructured.ir b/examples/local_state/out_O2/LocalStateContract.destructured.ir index 4cccc11777..409fa0fd2d 100644 --- a/examples/local_state/out_O2/LocalStateContract.destructured.ir +++ b/examples/local_state/out_O2/LocalStateContract.destructured.ir @@ -70,9 +70,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: block@0: // L59 diff --git a/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir b/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir index 84c3cc99bc..a5728b2014 100644 --- a/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out_O2/LocalStateWithOffsets.destructured.ir @@ -68,9 +68,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: block@0: // L61 diff --git a/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir b/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir index 40b3106205..b22d2722fb 100644 --- a/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir +++ b/examples/local_state/out_unoptimized/LocalStateContract.destructured.ir @@ -90,9 +90,9 @@ contract examples.local_state.local_state_contract.LocalStateContract: subroutine examples.local_state.local_state_contract.LocalStateContract.get_guaranteed_data(for_account: bytes) -> bytes: block@0: // L51 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_contract.LocalStateContract.get_data_or_assert(for_account: bytes) -> bytes: block@0: // L59 diff --git a/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir b/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir index e46be0f113..6462030c0e 100644 --- a/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir +++ b/examples/local_state/out_unoptimized/LocalStateWithOffsets.destructured.ir @@ -87,9 +87,9 @@ contract examples.local_state.local_state_with_offsets.LocalStateContract: subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_guaranteed_data(for_account: uint64) -> bytes: block@0: // L53 - let (app_local_get_ex_value%0#0: bytes, app_local_get_ex_did_exist%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") - (assert app_local_get_ex_did_exist%1#0) // check local exists for account - return app_local_get_ex_value%0#0 + let (local_value%0#0: bytes, local_exists%1#0: uint64) = (app_local_get_ex for_account#0 0u "local") + (assert local_exists%1#0) // check local exists for account + return local_value%0#0 subroutine examples.local_state.local_state_with_offsets.LocalStateContract.get_data_or_assert(for_account: uint64) -> bytes: block@0: // L61 diff --git a/examples/local_state/puya.log b/examples/local_state/puya.log index c575b5f9aa..ad8667b14d 100644 --- a/examples/local_state/puya.log +++ b/examples/local_state/puya.log @@ -769,10 +769,10 @@ debug: Replaced main_if_body@21.ops[6]: 'load tmp%24#0' with 'load tmp%24#0 from debug: Found 12 edge set/s for examples.local_state.local_state_contract.LocalStateContract.approval_program debug: examples.local_state.local_state_contract.LocalStateContract.approval_program f-stack entry: ['method#0'] debug: examples.local_state.local_state_contract.LocalStateContract.approval_program f-stack on first store: [] -debug: Inserted get_guaranteed_data_block@0.ops[4]: 'store app_local_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced get_guaranteed_data_block@0.ops[7]: 'load app_local_get_ex_did_exist%1#0' with 'load app_local_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted get_guaranteed_data_block@0.ops[6]: 'store app_local_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced get_guaranteed_data_block@0.ops[10]: 'load app_local_get_ex_value%0#0' with 'load app_local_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted get_guaranteed_data_block@0.ops[4]: 'store local_exists%1#0 to l-stack (copy)' +debug: Replaced get_guaranteed_data_block@0.ops[7]: 'load local_exists%1#0' with 'load local_exists%1#0 from l-stack (no copy)' +debug: Inserted get_guaranteed_data_block@0.ops[6]: 'store local_value%0#0 to l-stack (copy)' +debug: Replaced get_guaranteed_data_block@0.ops[10]: 'load local_value%0#0' with 'load local_value%0#0 from l-stack (no copy)' debug: Inserted get_data_or_assert_block@0.ops[4]: 'store exists#0 to l-stack (copy)' debug: Replaced get_data_or_assert_block@0.ops[7]: 'load exists#0' with 'load exists#0 from l-stack (no copy)' debug: Inserted get_data_or_assert_block@0.ops[6]: 'store result#0 to l-stack (copy)' @@ -1120,10 +1120,10 @@ debug: Replaced main_if_body@21.ops[4]: 'load tmp%21#0' with 'load tmp%21#0 from debug: Found 12 edge set/s for examples.local_state.local_state_with_offsets.LocalStateContract.approval_program debug: examples.local_state.local_state_with_offsets.LocalStateContract.approval_program f-stack entry: ['method#0', 'offset#0'] debug: examples.local_state.local_state_with_offsets.LocalStateContract.approval_program f-stack on first store: [] -debug: Inserted get_guaranteed_data_block@0.ops[4]: 'store app_local_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced get_guaranteed_data_block@0.ops[7]: 'load app_local_get_ex_did_exist%1#0' with 'load app_local_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted get_guaranteed_data_block@0.ops[6]: 'store app_local_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced get_guaranteed_data_block@0.ops[10]: 'load app_local_get_ex_value%0#0' with 'load app_local_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted get_guaranteed_data_block@0.ops[4]: 'store local_exists%1#0 to l-stack (copy)' +debug: Replaced get_guaranteed_data_block@0.ops[7]: 'load local_exists%1#0' with 'load local_exists%1#0 from l-stack (no copy)' +debug: Inserted get_guaranteed_data_block@0.ops[6]: 'store local_value%0#0 to l-stack (copy)' +debug: Replaced get_guaranteed_data_block@0.ops[10]: 'load local_value%0#0' with 'load local_value%0#0 from l-stack (no copy)' debug: Inserted get_data_or_assert_block@0.ops[4]: 'store exists#0 to l-stack (copy)' debug: Replaced get_data_or_assert_block@0.ops[7]: 'load exists#0' with 'load exists#0 from l-stack (no copy)' debug: Inserted get_data_or_assert_block@0.ops[6]: 'store result#0 to l-stack (copy)' diff --git a/examples/voting/out/VotingRoundApp.approval.mir b/examples/voting/out/VotingRoundApp.approval.mir index b1f11e1ba7..28cae7349b 100644 --- a/examples/voting/out/VotingRoundApp.approval.mir +++ b/examples/voting/out/VotingRoundApp.approval.mir @@ -1,10 +1,10 @@ -// Op // Op Description Stack (out) Live (out) X stack Source code Source line +// Op // Op Description Stack (out) Live (out) X stack Source code Source line #pragma version 10 // examples.voting.voting.VotingRoundApp.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} + txn ApplicationID // {txn} // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // @@ -15,766 +15,766 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txna ApplicationArgs 0 // {txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - method "create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 - method "bootstrap(pay)void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 - method "close()void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 - method "get_preconditions(byte[])(uint64,uint64,uint64,uint64)" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void">,method<"get_preconditions(byte[])(uint64,uint64,uint64,uint64)"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 - method "vote(pay,byte[],uint8[])void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void">,method<"get_preconditions(byte[])(uint64,uint64,uint64,uint64)">,method<"vote(pay,byte[],uint8[])void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 - uncover 5 // load tmp%1#0 from l-stack (no copy) method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void">,method<"get_preconditions(byte[])(uint64,uint64,uint64,uint64)">,method<"vote(pay,byte[],uint8[])void">,tmp%1#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - match main_create_route@3 main_bootstrap_route@4 main_close_route@5 main_get_preconditions_route@6 main_vote_route@7 // class VotingRoundApp(ARC4Contract): voting/voting.py:48 - err // reject transaction // class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 0 // {txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + method "create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 + method "bootstrap(pay)void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 + method "close()void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 + method "get_preconditions(byte[])(uint64,uint64,uint64,uint64)" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void">,method<"get_preconditions(byte[])(uint64,uint64,uint64,uint64)"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 + method "vote(pay,byte[],uint8[])void" // tmp%1#0,method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void">,method<"get_preconditions(byte[])(uint64,uint64,uint64,uint64)">,method<"vote(pay,byte[],uint8[])void"> class VotingRoundApp(ARC4Contract): voting/voting.py:48 + uncover 5 // load tmp%1#0 from l-stack (no copy) method<"create(string,byte[],string,uint64,uint64,uint8[],uint64,string)void">,method<"bootstrap(pay)void">,method<"close()void">,method<"get_preconditions(byte[])(uint64,uint64,uint64,uint64)">,method<"vote(pay,byte[],uint8[])void">,tmp%1#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + match main_create_route@3 main_bootstrap_route@4 main_close_route@5 main_get_preconditions_route@6 main_vote_route@7 // class VotingRoundApp(ARC4Contract): voting/voting.py:48 + err // reject transaction // class VotingRoundApp(ARC4Contract): voting/voting.py:48 main_create_route@3: - txn OnCompletion // {txn} arc4.abimethod(create=True) voting/voting.py:55 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 arc4.abimethod(create=True) voting/voting.py:55 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 arc4.abimethod(create=True) voting/voting.py:55 - ! // {!} arc4.abimethod(create=True) voting/voting.py:55 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod(create=True) voting/voting.py:55 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod(create=True) voting/voting.py:55 - assert // OnCompletion is NoOp // arc4.abimethod(create=True) voting/voting.py:55 - txn ApplicationID // {txn} arc4.abimethod(create=True) voting/voting.py:55 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod(create=True) voting/voting.py:55 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod(create=True) voting/voting.py:55 - ! // {!} arc4.abimethod(create=True) voting/voting.py:55 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod(create=True) voting/voting.py:55 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod(create=True) voting/voting.py:55 - assert // is creating // arc4.abimethod(create=True) voting/voting.py:55 - txna ApplicationArgs 1 // {txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 2 // tmp%6#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%7#0 to l-stack (no copy) tmp%6#0,tmp%7#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%7#0 from l-stack (no copy) tmp%6#0,tmp%7#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - extract 2 0 // tmp%6#0,{extract} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%6#0,tmp%8#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 3 // tmp%6#0,tmp%8#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 4 // tmp%6#0,tmp%8#0,tmp%9#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%10#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%10#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%10#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - btoi // tmp%6#0,tmp%8#0,tmp%9#0,{btoi} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%11#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 5 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%12#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%12#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%12#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%12#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - btoi // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,{btoi} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%13#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 6 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 7 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%15#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%15#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%15#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%15#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - btoi // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,{btoi} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%16#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 8 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%17#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - uncover 7 // load tmp%6#0 from l-stack (no copy) tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0 arc4.abimethod(create=True) voting/voting.py:55 - uncover 7 // load tmp%8#0 from l-stack (no copy) tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0 arc4.abimethod(create=True) voting/voting.py:55 - uncover 7 // load tmp%9#0 from l-stack (no copy) tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0 arc4.abimethod(create=True) voting/voting.py:55 - uncover 7 // load tmp%11#0 from l-stack (no copy) tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0 arc4.abimethod(create=True) voting/voting.py:55 - uncover 7 // load tmp%13#0 from l-stack (no copy) tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0 arc4.abimethod(create=True) voting/voting.py:55 - uncover 7 // load tmp%14#0 from l-stack (no copy) tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0 arc4.abimethod(create=True) voting/voting.py:55 - uncover 7 // load tmp%16#0 from l-stack (no copy) tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0 arc4.abimethod(create=True) voting/voting.py:55 - uncover 7 // load tmp%17#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0 arc4.abimethod(create=True) voting/voting.py:55 - callsub create // arc4.abimethod(create=True) voting/voting.py:55 - int 1 // 1 arc4.abimethod(create=True) voting/voting.py:55 - return // arc4.abimethod(create=True) voting/voting.py:55 + txn OnCompletion // {txn} arc4.abimethod(create=True) voting/voting.py:55 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 arc4.abimethod(create=True) voting/voting.py:55 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 arc4.abimethod(create=True) voting/voting.py:55 + ! // {!} arc4.abimethod(create=True) voting/voting.py:55 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod(create=True) voting/voting.py:55 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod(create=True) voting/voting.py:55 + assert // OnCompletion is NoOp // arc4.abimethod(create=True) voting/voting.py:55 + txn ApplicationID // {txn} arc4.abimethod(create=True) voting/voting.py:55 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod(create=True) voting/voting.py:55 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod(create=True) voting/voting.py:55 + ! // {!} arc4.abimethod(create=True) voting/voting.py:55 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod(create=True) voting/voting.py:55 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod(create=True) voting/voting.py:55 + assert // is creating // arc4.abimethod(create=True) voting/voting.py:55 + txna ApplicationArgs 1 // {txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 2 // tmp%6#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%7#0 to l-stack (no copy) tmp%6#0,tmp%7#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%7#0 from l-stack (no copy) tmp%6#0,tmp%7#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + extract 2 0 // tmp%6#0,{extract} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%6#0,tmp%8#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 3 // tmp%6#0,tmp%8#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 4 // tmp%6#0,tmp%8#0,tmp%9#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%10#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%10#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%10#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%10#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + btoi // tmp%6#0,tmp%8#0,tmp%9#0,{btoi} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 5 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%12#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%12#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%12#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%12#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + btoi // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,{btoi} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%13#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 6 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 7 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%15#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%15#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%15#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%15#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + btoi // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,{btoi} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%16#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 8 // tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + uncover 7 // load tmp%6#0 from l-stack (no copy) tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0 arc4.abimethod(create=True) voting/voting.py:55 + uncover 7 // load tmp%8#0 from l-stack (no copy) tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0 arc4.abimethod(create=True) voting/voting.py:55 + uncover 7 // load tmp%9#0 from l-stack (no copy) tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0 arc4.abimethod(create=True) voting/voting.py:55 + uncover 7 // load tmp%11#0 from l-stack (no copy) tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0 arc4.abimethod(create=True) voting/voting.py:55 + uncover 7 // load tmp%13#0 from l-stack (no copy) tmp%14#0,tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0 arc4.abimethod(create=True) voting/voting.py:55 + uncover 7 // load tmp%14#0 from l-stack (no copy) tmp%16#0,tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0 arc4.abimethod(create=True) voting/voting.py:55 + uncover 7 // load tmp%16#0 from l-stack (no copy) tmp%17#0,tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0 arc4.abimethod(create=True) voting/voting.py:55 + uncover 7 // load tmp%17#0 from l-stack (no copy) tmp%6#0,tmp%8#0,tmp%9#0,tmp%11#0,tmp%13#0,tmp%14#0,tmp%16#0,tmp%17#0 arc4.abimethod(create=True) voting/voting.py:55 + callsub create // arc4.abimethod(create=True) voting/voting.py:55 + int 1 // 1 arc4.abimethod(create=True) voting/voting.py:55 + return // arc4.abimethod(create=True) voting/voting.py:55 main_bootstrap_route@4: - txn OnCompletion // {txn} arc4.abimethod voting/voting.py:79 - // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 arc4.abimethod voting/voting.py:79 - // virtual: load tmp%18#0 from l-stack (no copy) tmp%18#0 arc4.abimethod voting/voting.py:79 - ! // {!} arc4.abimethod voting/voting.py:79 - // virtual: store tmp%19#0 to l-stack (no copy) tmp%19#0 arc4.abimethod voting/voting.py:79 - // virtual: load tmp%19#0 from l-stack (no copy) tmp%19#0 arc4.abimethod voting/voting.py:79 - assert // OnCompletion is NoOp // arc4.abimethod voting/voting.py:79 - txn ApplicationID // {txn} arc4.abimethod voting/voting.py:79 - // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 arc4.abimethod voting/voting.py:79 - // virtual: load tmp%20#0 from l-stack (no copy) tmp%20#0 arc4.abimethod voting/voting.py:79 - assert // is not creating // arc4.abimethod voting/voting.py:79 - txn GroupIndex // {txn} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int 1 // tmp%23#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - - // {-} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store awst_tmp%24#0 to l-stack (no copy) awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - dup // load awst_tmp%24#0 from l-stack (copy) awst_tmp%24#0,awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - gtxns TypeEnum // awst_tmp%24#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%25#0 to l-stack (no copy) awst_tmp%24#0,tmp%25#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%25#0 from l-stack (no copy) awst_tmp%24#0,tmp%25#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int pay // awst_tmp%24#0,tmp%25#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 - == // awst_tmp%24#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%26#0 to l-stack (no copy) awst_tmp%24#0,tmp%26#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%26#0 from l-stack (no copy) awst_tmp%24#0,tmp%26#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - assert // transaction type is pay // awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load awst_tmp%24#0 from l-stack (no copy) awst_tmp%24#0 arc4.abimethod voting/voting.py:79 - callsub bootstrap // arc4.abimethod voting/voting.py:79 - int 1 // 1 arc4.abimethod voting/voting.py:79 - return // arc4.abimethod voting/voting.py:79 + txn OnCompletion // {txn} arc4.abimethod voting/voting.py:79 + // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 arc4.abimethod voting/voting.py:79 + // virtual: load tmp%18#0 from l-stack (no copy) tmp%18#0 arc4.abimethod voting/voting.py:79 + ! // {!} arc4.abimethod voting/voting.py:79 + // virtual: store tmp%19#0 to l-stack (no copy) tmp%19#0 arc4.abimethod voting/voting.py:79 + // virtual: load tmp%19#0 from l-stack (no copy) tmp%19#0 arc4.abimethod voting/voting.py:79 + assert // OnCompletion is NoOp // arc4.abimethod voting/voting.py:79 + txn ApplicationID // {txn} arc4.abimethod voting/voting.py:79 + // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 arc4.abimethod voting/voting.py:79 + // virtual: load tmp%20#0 from l-stack (no copy) tmp%20#0 arc4.abimethod voting/voting.py:79 + assert // is not creating // arc4.abimethod voting/voting.py:79 + txn GroupIndex // {txn} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int 1 // tmp%23#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + - // {-} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store awst_tmp%24#0 to l-stack (no copy) awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + dup // load awst_tmp%24#0 from l-stack (copy) awst_tmp%24#0,awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + gtxns TypeEnum // awst_tmp%24#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%25#0 to l-stack (no copy) awst_tmp%24#0,tmp%25#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%25#0 from l-stack (no copy) awst_tmp%24#0,tmp%25#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int pay // awst_tmp%24#0,tmp%25#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 + == // awst_tmp%24#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%26#0 to l-stack (no copy) awst_tmp%24#0,tmp%26#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%26#0 from l-stack (no copy) awst_tmp%24#0,tmp%26#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + assert // transaction type is pay // awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load awst_tmp%24#0 from l-stack (no copy) awst_tmp%24#0 arc4.abimethod voting/voting.py:79 + callsub bootstrap // arc4.abimethod voting/voting.py:79 + int 1 // 1 arc4.abimethod voting/voting.py:79 + return // arc4.abimethod voting/voting.py:79 main_close_route@5: - txn OnCompletion // {txn} arc4.abimethod voting/voting.py:107 - // virtual: store tmp%27#0 to l-stack (no copy) tmp%27#0 arc4.abimethod voting/voting.py:107 - // virtual: load tmp%27#0 from l-stack (no copy) tmp%27#0 arc4.abimethod voting/voting.py:107 - ! // {!} arc4.abimethod voting/voting.py:107 - // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 arc4.abimethod voting/voting.py:107 - // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 arc4.abimethod voting/voting.py:107 - assert // OnCompletion is NoOp // arc4.abimethod voting/voting.py:107 - txn ApplicationID // {txn} arc4.abimethod voting/voting.py:107 - // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 arc4.abimethod voting/voting.py:107 - // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 arc4.abimethod voting/voting.py:107 - assert // is not creating // arc4.abimethod voting/voting.py:107 - callsub close // arc4.abimethod voting/voting.py:107 - int 1 // 1 arc4.abimethod voting/voting.py:107 - return // arc4.abimethod voting/voting.py:107 + txn OnCompletion // {txn} arc4.abimethod voting/voting.py:107 + // virtual: store tmp%27#0 to l-stack (no copy) tmp%27#0 arc4.abimethod voting/voting.py:107 + // virtual: load tmp%27#0 from l-stack (no copy) tmp%27#0 arc4.abimethod voting/voting.py:107 + ! // {!} arc4.abimethod voting/voting.py:107 + // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 arc4.abimethod voting/voting.py:107 + // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 arc4.abimethod voting/voting.py:107 + assert // OnCompletion is NoOp // arc4.abimethod voting/voting.py:107 + txn ApplicationID // {txn} arc4.abimethod voting/voting.py:107 + // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 arc4.abimethod voting/voting.py:107 + // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 arc4.abimethod voting/voting.py:107 + assert // is not creating // arc4.abimethod voting/voting.py:107 + callsub close // arc4.abimethod voting/voting.py:107 + int 1 // 1 arc4.abimethod voting/voting.py:107 + return // arc4.abimethod voting/voting.py:107 main_get_preconditions_route@6: - txn OnCompletion // {txn} arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: store tmp%30#0 to l-stack (no copy) tmp%30#0 arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: load tmp%30#0 from l-stack (no copy) tmp%30#0 arc4.abimethod(readonly=True) voting/voting.py:157 - ! // {!} arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: store tmp%31#0 to l-stack (no copy) tmp%31#0 arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: load tmp%31#0 from l-stack (no copy) tmp%31#0 arc4.abimethod(readonly=True) voting/voting.py:157 - assert // OnCompletion is NoOp // arc4.abimethod(readonly=True) voting/voting.py:157 - txn ApplicationID // {txn} arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: store tmp%32#0 to l-stack (no copy) tmp%32#0 arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 arc4.abimethod(readonly=True) voting/voting.py:157 - assert // is not creating // arc4.abimethod(readonly=True) voting/voting.py:157 - txna ApplicationArgs 1 // {txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%33#0 to l-stack (no copy) tmp%33#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%33#0 from l-stack (no copy) tmp%33#0 arc4.abimethod(readonly=True) voting/voting.py:157 - callsub get_preconditions // {get_preconditions} arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: store tmp%34#0 to l-stack (no copy) tmp%34#0 arc4.abimethod(readonly=True) voting/voting.py:157 - byte 0x151f7c75 // tmp%34#0,0x151f7c75 arc4.abimethod(readonly=True) voting/voting.py:157 - swap // load tmp%34#0 from l-stack (no copy) 0x151f7c75,tmp%34#0 arc4.abimethod(readonly=True) voting/voting.py:157 - concat // {concat} arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 arc4.abimethod(readonly=True) voting/voting.py:157 - // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 arc4.abimethod(readonly=True) voting/voting.py:157 - log // arc4.abimethod(readonly=True) voting/voting.py:157 - int 1 // 1 arc4.abimethod(readonly=True) voting/voting.py:157 - return // arc4.abimethod(readonly=True) voting/voting.py:157 + txn OnCompletion // {txn} arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: store tmp%30#0 to l-stack (no copy) tmp%30#0 arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: load tmp%30#0 from l-stack (no copy) tmp%30#0 arc4.abimethod(readonly=True) voting/voting.py:157 + ! // {!} arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: store tmp%31#0 to l-stack (no copy) tmp%31#0 arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: load tmp%31#0 from l-stack (no copy) tmp%31#0 arc4.abimethod(readonly=True) voting/voting.py:157 + assert // OnCompletion is NoOp // arc4.abimethod(readonly=True) voting/voting.py:157 + txn ApplicationID // {txn} arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: store tmp%32#0 to l-stack (no copy) tmp%32#0 arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 arc4.abimethod(readonly=True) voting/voting.py:157 + assert // is not creating // arc4.abimethod(readonly=True) voting/voting.py:157 + txna ApplicationArgs 1 // {txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%33#0 to l-stack (no copy) tmp%33#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%33#0 from l-stack (no copy) tmp%33#0 arc4.abimethod(readonly=True) voting/voting.py:157 + callsub get_preconditions // {get_preconditions} arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: store tmp%34#0 to l-stack (no copy) tmp%34#0 arc4.abimethod(readonly=True) voting/voting.py:157 + byte 0x151f7c75 // tmp%34#0,0x151f7c75 arc4.abimethod(readonly=True) voting/voting.py:157 + swap // load tmp%34#0 from l-stack (no copy) 0x151f7c75,tmp%34#0 arc4.abimethod(readonly=True) voting/voting.py:157 + concat // {concat} arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 arc4.abimethod(readonly=True) voting/voting.py:157 + // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 arc4.abimethod(readonly=True) voting/voting.py:157 + log // arc4.abimethod(readonly=True) voting/voting.py:157 + int 1 // 1 arc4.abimethod(readonly=True) voting/voting.py:157 + return // arc4.abimethod(readonly=True) voting/voting.py:157 main_vote_route@7: - txn OnCompletion // {txn} arc4.abimethod voting/voting.py:166 - // virtual: store tmp%36#0 to l-stack (no copy) tmp%36#0 arc4.abimethod voting/voting.py:166 - // virtual: load tmp%36#0 from l-stack (no copy) tmp%36#0 arc4.abimethod voting/voting.py:166 - ! // {!} arc4.abimethod voting/voting.py:166 - // virtual: store tmp%37#0 to l-stack (no copy) tmp%37#0 arc4.abimethod voting/voting.py:166 - // virtual: load tmp%37#0 from l-stack (no copy) tmp%37#0 arc4.abimethod voting/voting.py:166 - assert // OnCompletion is NoOp // arc4.abimethod voting/voting.py:166 - txn ApplicationID // {txn} arc4.abimethod voting/voting.py:166 - // virtual: store tmp%38#0 to l-stack (no copy) tmp%38#0 arc4.abimethod voting/voting.py:166 - // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 arc4.abimethod voting/voting.py:166 - assert // is not creating // arc4.abimethod voting/voting.py:166 - txn GroupIndex // {txn} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int 1 // tmp%41#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - - // {-} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store awst_tmp%24#0 to l-stack (no copy) awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - dup // load awst_tmp%24#0 from l-stack (copy) awst_tmp%24#0,awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - gtxns TypeEnum // awst_tmp%24#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%24#0,tmp%42#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%42#0 from l-stack (no copy) awst_tmp%24#0,tmp%42#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int pay // awst_tmp%24#0,tmp%42#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 - == // awst_tmp%24#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%24#0,tmp%43#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%24#0,tmp%43#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - assert // transaction type is pay // awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 1 // awst_tmp%24#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%24#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%24#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - extract 2 0 // awst_tmp%24#0,{extract} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%24#0,tmp%45#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 2 // awst_tmp%24#0,tmp%45#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%24#0,tmp%45#0,tmp%46#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - uncover 2 // load awst_tmp%24#0 from l-stack (no copy) tmp%45#0,tmp%46#0,awst_tmp%24#0 arc4.abimethod voting/voting.py:166 - uncover 2 // load tmp%45#0 from l-stack (no copy) tmp%46#0,awst_tmp%24#0,tmp%45#0 arc4.abimethod voting/voting.py:166 - uncover 2 // load tmp%46#0 from l-stack (no copy) awst_tmp%24#0,tmp%45#0,tmp%46#0 arc4.abimethod voting/voting.py:166 - callsub vote // arc4.abimethod voting/voting.py:166 - int 1 // 1 arc4.abimethod voting/voting.py:166 - return // arc4.abimethod voting/voting.py:166 + txn OnCompletion // {txn} arc4.abimethod voting/voting.py:166 + // virtual: store tmp%36#0 to l-stack (no copy) tmp%36#0 arc4.abimethod voting/voting.py:166 + // virtual: load tmp%36#0 from l-stack (no copy) tmp%36#0 arc4.abimethod voting/voting.py:166 + ! // {!} arc4.abimethod voting/voting.py:166 + // virtual: store tmp%37#0 to l-stack (no copy) tmp%37#0 arc4.abimethod voting/voting.py:166 + // virtual: load tmp%37#0 from l-stack (no copy) tmp%37#0 arc4.abimethod voting/voting.py:166 + assert // OnCompletion is NoOp // arc4.abimethod voting/voting.py:166 + txn ApplicationID // {txn} arc4.abimethod voting/voting.py:166 + // virtual: store tmp%38#0 to l-stack (no copy) tmp%38#0 arc4.abimethod voting/voting.py:166 + // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 arc4.abimethod voting/voting.py:166 + assert // is not creating // arc4.abimethod voting/voting.py:166 + txn GroupIndex // {txn} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int 1 // tmp%41#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + - // {-} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store awst_tmp%24#0 to l-stack (no copy) awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + dup // load awst_tmp%24#0 from l-stack (copy) awst_tmp%24#0,awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + gtxns TypeEnum // awst_tmp%24#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%24#0,tmp%42#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%42#0 from l-stack (no copy) awst_tmp%24#0,tmp%42#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int pay // awst_tmp%24#0,tmp%42#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 + == // awst_tmp%24#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%24#0,tmp%43#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%24#0,tmp%43#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + assert // transaction type is pay // awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 1 // awst_tmp%24#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%24#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%24#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + extract 2 0 // awst_tmp%24#0,{extract} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%24#0,tmp%45#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 2 // awst_tmp%24#0,tmp%45#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%24#0,tmp%45#0,tmp%46#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + uncover 2 // load awst_tmp%24#0 from l-stack (no copy) tmp%45#0,tmp%46#0,awst_tmp%24#0 arc4.abimethod voting/voting.py:166 + uncover 2 // load tmp%45#0 from l-stack (no copy) tmp%46#0,awst_tmp%24#0,tmp%45#0 arc4.abimethod voting/voting.py:166 + uncover 2 // load tmp%46#0 from l-stack (no copy) awst_tmp%24#0,tmp%45#0,tmp%46#0 arc4.abimethod voting/voting.py:166 + callsub vote // arc4.abimethod voting/voting.py:166 + int 1 // 1 arc4.abimethod voting/voting.py:166 + return // arc4.abimethod voting/voting.py:166 // examples.voting.voting.VotingRoundApp.create(vote_id: bytes, snapshot_public_key: bytes, metadata_ipfs_cid: bytes, start_time: uint64, end_time: uint64, option_counts: bytes, quorum: uint64, nft_image_url: bytes) -> void: create: - proto 8 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | @arc4.abimethod(create=True)\ndef create(\nself,\nvote_id: arc4.String,\nsnapshot_public_key: Byt... voting/voting.py:55-66 + proto 8 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | @arc4.abimethod(create=True)\ndef create(\nself,\nvote_id: arc4.String,\nsnapshot_public_key: Byt... voting/voting.py:55-66 create_block@0: - frame_dig -5 // load start_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | start_time#0 start_time < end_time, "End time should be after start time" voting/voting.py:67 - frame_dig -4 // load end_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | start_time#0,end_time#0 start_time < end_time, "End time should be after start time" voting/voting.py:67 - < // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {<} start_time < end_time, "End time should be after start time" voting/voting.py:67 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%0#0 start_time < end_time, "End time should be after start time" voting/voting.py:67 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%0#0 assert start_time < end_time, "End time should be after start time" voting/voting.py:67 - assert // End time should be after start time // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | assert start_time < end_time, "End time should be after start time" voting/voting.py:67 - global LatestTimestamp // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {global} Global.latest_timestamp voting/voting.py:68 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%1#0 Global.latest_timestamp voting/voting.py:68 - frame_dig -4 // load end_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%1#0,end_time#0 end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 - swap // load tmp%1#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | end_time#0,tmp%1#0 end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 - >= // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {>=} end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%2#0 end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%2#0 assert end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 - assert // End time should be in the future // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | assert end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 - frame_dig -8 // load vote_id#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | vote_id#0 vote_id.decode() voting/voting.py:70 - extract 2 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {extract} vote_id.decode() voting/voting.py:70 - // virtual: store new_state_value%3#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%3#0 vote_id.decode() voting/voting.py:70 - byte "vote_id" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%3#0,"vote_id" self.vote_id voting/voting.py:70 - swap // load new_state_value%3#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "vote_id",new_state_value%3#0 self.vote_id = vote_id.decode() voting/voting.py:70 - app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.vote_id = vote_id.decode() voting/voting.py:70 - byte "snapshot_public_key" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "snapshot_public_key" self.snapshot_public_key voting/voting.py:71 - frame_dig -7 // load snapshot_public_key#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "snapshot_public_key",snapshot_public_key#0 self.snapshot_public_key = snapshot_public_key voting/voting.py:71 - app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.snapshot_public_key = snapshot_public_key voting/voting.py:71 - frame_dig -6 // load metadata_ipfs_cid#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | metadata_ipfs_cid#0 metadata_ipfs_cid.decode() voting/voting.py:72 - extract 2 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {extract} metadata_ipfs_cid.decode() voting/voting.py:72 - // virtual: store new_state_value%4#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%4#0 metadata_ipfs_cid.decode() voting/voting.py:72 - byte "metadata_ipfs_cid" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%4#0,"metadata_ipfs_cid" self.metadata_ipfs_cid voting/voting.py:72 - swap // load new_state_value%4#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "metadata_ipfs_cid",new_state_value%4#0 self.metadata_ipfs_cid = metadata_ipfs_cid.decode() voting/voting.py:72 - app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.metadata_ipfs_cid = metadata_ipfs_cid.decode() voting/voting.py:72 - byte "start_time" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "start_time" self.start_time voting/voting.py:73 - frame_dig -5 // load start_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "start_time",start_time#0 self.start_time = start_time voting/voting.py:73 - app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.start_time = start_time voting/voting.py:73 - byte "end_time" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "end_time" self.end_time voting/voting.py:74 - frame_dig -4 // load end_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "end_time",end_time#0 self.end_time = end_time voting/voting.py:74 - app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.end_time = end_time voting/voting.py:74 - byte "quorum" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "quorum" self.quorum voting/voting.py:75 - frame_dig -2 // load quorum#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "quorum",quorum#0 self.quorum = quorum voting/voting.py:75 - app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.quorum = quorum voting/voting.py:75 - frame_dig -1 // load nft_image_url#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | nft_image_url#0 nft_image_url.decode() voting/voting.py:76 - extract 2 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {extract} nft_image_url.decode() voting/voting.py:76 - // virtual: store new_state_value%5#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%5#0 nft_image_url.decode() voting/voting.py:76 - byte "nft_image_url" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%5#0,"nft_image_url" self.nft_image_url voting/voting.py:76 - swap // load new_state_value%5#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "nft_image_url",new_state_value%5#0 self.nft_image_url = nft_image_url.decode() voting/voting.py:76 - app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.nft_image_url = nft_image_url.decode() voting/voting.py:76 - frame_dig -3 // load option_counts#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | option_counts#0 self.store_option_counts(option_counts.copy()) voting/voting.py:77 - callsub store_option_counts // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.store_option_counts(option_counts.copy()) voting/voting.py:77 + frame_dig -5 // load start_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | start_time#0 start_time < end_time, "End time should be after start time" voting/voting.py:67 + frame_dig -4 // load end_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | start_time#0,end_time#0 start_time < end_time, "End time should be after start time" voting/voting.py:67 + < // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {<} start_time < end_time, "End time should be after start time" voting/voting.py:67 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%0#0 start_time < end_time, "End time should be after start time" voting/voting.py:67 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%0#0 assert start_time < end_time, "End time should be after start time" voting/voting.py:67 + assert // End time should be after start time // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | assert start_time < end_time, "End time should be after start time" voting/voting.py:67 + global LatestTimestamp // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {global} Global.latest_timestamp voting/voting.py:68 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%1#0 Global.latest_timestamp voting/voting.py:68 + frame_dig -4 // load end_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%1#0,end_time#0 end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 + swap // load tmp%1#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | end_time#0,tmp%1#0 end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 + >= // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {>=} end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%2#0 end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | tmp%2#0 assert end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 + assert // End time should be in the future // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | assert end_time >= Global.latest_timestamp, "End time should be in the future" voting/voting.py:68 + frame_dig -8 // load vote_id#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | vote_id#0 vote_id.decode() voting/voting.py:70 + extract 2 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {extract} vote_id.decode() voting/voting.py:70 + // virtual: store new_state_value%3#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%3#0 vote_id.decode() voting/voting.py:70 + byte "vote_id" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%3#0,"vote_id" self.vote_id voting/voting.py:70 + swap // load new_state_value%3#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "vote_id",new_state_value%3#0 self.vote_id = vote_id.decode() voting/voting.py:70 + app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.vote_id = vote_id.decode() voting/voting.py:70 + byte "snapshot_public_key" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "snapshot_public_key" self.snapshot_public_key voting/voting.py:71 + frame_dig -7 // load snapshot_public_key#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "snapshot_public_key",snapshot_public_key#0 self.snapshot_public_key = snapshot_public_key voting/voting.py:71 + app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.snapshot_public_key = snapshot_public_key voting/voting.py:71 + frame_dig -6 // load metadata_ipfs_cid#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | metadata_ipfs_cid#0 metadata_ipfs_cid.decode() voting/voting.py:72 + extract 2 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {extract} metadata_ipfs_cid.decode() voting/voting.py:72 + // virtual: store new_state_value%4#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%4#0 metadata_ipfs_cid.decode() voting/voting.py:72 + byte "metadata_ipfs_cid" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%4#0,"metadata_ipfs_cid" self.metadata_ipfs_cid voting/voting.py:72 + swap // load new_state_value%4#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "metadata_ipfs_cid",new_state_value%4#0 self.metadata_ipfs_cid = metadata_ipfs_cid.decode() voting/voting.py:72 + app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.metadata_ipfs_cid = metadata_ipfs_cid.decode() voting/voting.py:72 + byte "start_time" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "start_time" self.start_time voting/voting.py:73 + frame_dig -5 // load start_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "start_time",start_time#0 self.start_time = start_time voting/voting.py:73 + app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.start_time = start_time voting/voting.py:73 + byte "end_time" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "end_time" self.end_time voting/voting.py:74 + frame_dig -4 // load end_time#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "end_time",end_time#0 self.end_time = end_time voting/voting.py:74 + app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.end_time = end_time voting/voting.py:74 + byte "quorum" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "quorum" self.quorum voting/voting.py:75 + frame_dig -2 // load quorum#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "quorum",quorum#0 self.quorum = quorum voting/voting.py:75 + app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.quorum = quorum voting/voting.py:75 + frame_dig -1 // load nft_image_url#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | nft_image_url#0 nft_image_url.decode() voting/voting.py:76 + extract 2 0 // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | {extract} nft_image_url.decode() voting/voting.py:76 + // virtual: store new_state_value%5#0 to l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%5#0 nft_image_url.decode() voting/voting.py:76 + byte "nft_image_url" // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | new_state_value%5#0,"nft_image_url" self.nft_image_url voting/voting.py:76 + swap // load new_state_value%5#0 from l-stack (no copy) (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | "nft_image_url",new_state_value%5#0 self.nft_image_url = nft_image_url.decode() voting/voting.py:76 + app_global_put // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.nft_image_url = nft_image_url.decode() voting/voting.py:76 + frame_dig -3 // load option_counts#0 from parameters (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | option_counts#0 self.store_option_counts(option_counts.copy()) voting/voting.py:77 + callsub store_option_counts // (𝕡) vote_id#0,snapshot_public_key#0,metadata_ipfs_cid#0,start_time#0,end_time#0,option_counts#0,quorum#0,nft_image_url#0 | self.store_option_counts(option_counts.copy()) voting/voting.py:77 retsub // // examples.voting.voting.VotingRoundApp.store_option_counts(option_counts: bytes) -> void: store_option_counts: - proto 1 0 // (𝕡) option_counts#0 | @subroutine\ndef store_option_counts(self, option_counts: VoteIndexArray) -> None: voting/voting.py:215-216 + proto 1 0 // (𝕡) option_counts#0 | @subroutine\ndef store_option_counts(self, option_counts: VoteIndexArray) -> None: voting/voting.py:215-216 store_option_counts_block@0: - frame_dig -1 // load option_counts#0 from parameters (𝕡) option_counts#0 | option_counts#0 option_counts.length voting/voting.py:217 - int 0 // (𝕡) option_counts#0 | option_counts#0,0 option_counts.length voting/voting.py:217 - extract_uint16 // (𝕡) option_counts#0 | {extract_uint16} option_counts.length voting/voting.py:217 - dup // store tmp%0#0 to l-stack (copy) (𝕡) option_counts#0 | tmp%0#0,tmp%0#0 option_counts.length voting/voting.py:217 - swap // store tmp%0#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0 option_counts.length voting/voting.py:217 - dup // load tmp%0#0 from l-stack (copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0,tmp%0#0 assert option_counts.length, "option_counts should be non-empty" voting/voting.py:217 - assert // option_counts should be non-empty // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0 assert option_counts.length, "option_counts should be non-empty" voting/voting.py:217 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0 option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 - int 112 // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0,112 112 voting/voting.py:218 - <= // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | {<=} option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%2#0 option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%2#0 assert option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 - assert // Can't have more than 112 questions // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | assert option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 - int 0 // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | 0 0 voting/voting.py:220 - // virtual: store total_options#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0 | total_options = UInt64(0) voting/voting.py:220 - frame_dig -1 // load option_counts#0 from parameters (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0 | option_counts#0 for item in option_counts: voting/voting.py:221 - extract 2 0 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0 | {extract} for item in option_counts: voting/voting.py:221 - // virtual: store array_value%4#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0 | for item in option_counts: voting/voting.py:221 - int 0 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0 | 0 + frame_dig -1 // load option_counts#0 from parameters (𝕡) option_counts#0 | option_counts#0 option_counts.length voting/voting.py:217 + int 0 // (𝕡) option_counts#0 | option_counts#0,0 option_counts.length voting/voting.py:217 + extract_uint16 // (𝕡) option_counts#0 | {extract_uint16} option_counts.length voting/voting.py:217 + dup // store tmp%0#0 to l-stack (copy) (𝕡) option_counts#0 | tmp%0#0,tmp%0#0 option_counts.length voting/voting.py:217 + swap // store tmp%0#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0 option_counts.length voting/voting.py:217 + dup // load tmp%0#0 from l-stack (copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0,tmp%0#0 assert option_counts.length, "option_counts should be non-empty" voting/voting.py:217 + assert // option_counts should be non-empty // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0 assert option_counts.length, "option_counts should be non-empty" voting/voting.py:217 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0 option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 + int 112 // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%0#0,112 112 voting/voting.py:218 + <= // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | {<=} option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%2#0 option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0 | tmp%2#0 assert option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 + assert // Can't have more than 112 questions // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | assert option_counts.length <= 112, "Can't have more than 112 questions" voting/voting.py:218 + int 0 // (𝕡) option_counts#0 | (𝕗) tmp%0#0 | 0 0 voting/voting.py:220 + // virtual: store total_options#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0 | total_options = UInt64(0) voting/voting.py:220 + frame_dig -1 // load option_counts#0 from parameters (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0 | option_counts#0 for item in option_counts: voting/voting.py:221 + extract 2 0 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0 | {extract} for item in option_counts: voting/voting.py:221 + // virtual: store array_value%4#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0 | for item in option_counts: voting/voting.py:221 + int 0 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0 | 0 // virtual: store item_index_internal%5#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | - // Implicit fall through to store_option_counts_for_header@1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | + // Implicit fall through to store_option_counts_for_header@1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | store_option_counts_for_header@1: - frame_dig 3 // load item_index_internal%5#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0 for item in option_counts: voting/voting.py:221 - frame_dig 0 // load tmp%0#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,tmp%0#0 for item in option_counts: voting/voting.py:221 - < // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | {<} for item in option_counts: voting/voting.py:221 - // virtual: store continue_looping%7#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | continue_looping%7#0 for item in option_counts: voting/voting.py:221 - // virtual: load continue_looping%7#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | continue_looping%7#0 for item in option_counts: voting/voting.py:221 - bz store_option_counts_after_for@4 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | for item in option_counts: voting/voting.py:221 - // Implicit fall through to store_option_counts_for_body@2 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | for item in option_counts: voting/voting.py:221 + frame_dig 3 // load item_index_internal%5#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0 for item in option_counts: voting/voting.py:221 + frame_dig 0 // load tmp%0#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,tmp%0#0 for item in option_counts: voting/voting.py:221 + < // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | {<} for item in option_counts: voting/voting.py:221 + // virtual: store continue_looping%7#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | continue_looping%7#0 for item in option_counts: voting/voting.py:221 + // virtual: load continue_looping%7#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | continue_looping%7#0 for item in option_counts: voting/voting.py:221 + bz store_option_counts_after_for@4 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | for item in option_counts: voting/voting.py:221 + // Implicit fall through to store_option_counts_for_body@2 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | for item in option_counts: voting/voting.py:221 store_option_counts_for_body@2: - frame_dig 2 // load array_value%4#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | array_value%4#0 item voting/voting.py:221 - frame_dig 3 // load item_index_internal%5#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | array_value%4#0,item_index_internal%5#0 item voting/voting.py:221 + frame_dig 2 // load array_value%4#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | array_value%4#0 item voting/voting.py:221 + frame_dig 3 // load item_index_internal%5#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | array_value%4#0,item_index_internal%5#0 item voting/voting.py:221 dup - cover 2 // store item_index_internal%5#0 to l-stack (copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,array_value%4#0,item_index_internal%5#0 item voting/voting.py:221 - int 1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,array_value%4#0,item_index_internal%5#0,1 for item in option_counts: voting/voting.py:221 - extract3 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,{extract3} for item in option_counts: voting/voting.py:221 - // virtual: store item#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,item#0 item voting/voting.py:221 - // virtual: load item#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,item#0 item.decode() voting/voting.py:222 - btoi // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,{btoi} item.decode() voting/voting.py:222 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,tmp%9#0 item.decode() voting/voting.py:222 - frame_dig 1 // load total_options#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,tmp%9#0,total_options#0 total_options += item.decode() voting/voting.py:222 - swap // load tmp%9#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,total_options#0,tmp%9#0 total_options += item.decode() voting/voting.py:222 - + // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,{+} total_options += item.decode() voting/voting.py:222 - frame_bury 1 // store total_options#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0 total_options += item.decode() voting/voting.py:222 + cover 2 // store item_index_internal%5#0 to l-stack (copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,array_value%4#0,item_index_internal%5#0 item voting/voting.py:221 + int 1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,array_value%4#0,item_index_internal%5#0,1 for item in option_counts: voting/voting.py:221 + extract3 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,{extract3} for item in option_counts: voting/voting.py:221 + // virtual: store item#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,item#0 item voting/voting.py:221 + // virtual: load item#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,item#0 item.decode() voting/voting.py:222 + btoi // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,{btoi} item.decode() voting/voting.py:222 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,tmp%9#0 item.decode() voting/voting.py:222 + frame_dig 1 // load total_options#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,tmp%9#0,total_options#0 total_options += item.decode() voting/voting.py:222 + swap // load tmp%9#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,total_options#0,tmp%9#0 total_options += item.decode() voting/voting.py:222 + + // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,{+} total_options += item.decode() voting/voting.py:222 + frame_bury 1 // store total_options#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0 total_options += item.decode() voting/voting.py:222 // virtual: load item_index_internal%5#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0 - int 1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,1 - + // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | {+} - frame_bury 3 // store item_index_internal%5#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | - b store_option_counts_for_header@1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | + int 1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | item_index_internal%5#0,1 + + // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | {+} + frame_bury 3 // store item_index_internal%5#0 to f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | + b store_option_counts_for_header@1 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | store_option_counts_after_for@4: - frame_dig 1 // load total_options#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0 total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 - dup // store total_options#0 to l-stack (copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,total_options#0 total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 - int 128 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,total_options#0,128 128 voting/voting.py:223 - <= // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,{<=} total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,tmp%10#0 total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,tmp%10#0 assert total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 - assert // Can't have more than 128 vote options // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0 assert total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 - byte "option_counts" // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,"option_counts" self.option_counts voting/voting.py:225 - frame_dig -1 // load option_counts#0 from parameters (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,"option_counts",option_counts#0 self.option_counts = option_counts.copy() voting/voting.py:225 - app_global_put // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0 self.option_counts = option_counts.copy() voting/voting.py:225 - byte "total_options" // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,"total_options" self.total_options voting/voting.py:226 - swap // load total_options#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | "total_options",total_options#0 self.total_options = total_options voting/voting.py:226 - app_global_put // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | self.total_options = total_options voting/voting.py:226 + frame_dig 1 // load total_options#0 from f-stack (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0 total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 + dup // store total_options#0 to l-stack (copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,total_options#0 total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 + int 128 // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,total_options#0,128 128 voting/voting.py:223 + <= // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,{<=} total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,tmp%10#0 total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,tmp%10#0 assert total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 + assert // Can't have more than 128 vote options // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0 assert total_options <= 128, "Can't have more than 128 vote options" voting/voting.py:223 + byte "option_counts" // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,"option_counts" self.option_counts voting/voting.py:225 + frame_dig -1 // load option_counts#0 from parameters (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,"option_counts",option_counts#0 self.option_counts = option_counts.copy() voting/voting.py:225 + app_global_put // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0 self.option_counts = option_counts.copy() voting/voting.py:225 + byte "total_options" // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | total_options#0,"total_options" self.total_options voting/voting.py:226 + swap // load total_options#0 from l-stack (no copy) (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | "total_options",total_options#0 self.total_options = total_options voting/voting.py:226 + app_global_put // (𝕡) option_counts#0 | (𝕗) tmp%0#0,total_options#0,array_value%4#0,item_index_internal%5#0 | self.total_options = total_options voting/voting.py:226 retsub // // examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: bootstrap: - proto 1 0 // (𝕡) fund_min_bal_req#0 | @arc4.abimethod\ndef bootstrap(self, fund_min_bal_req: gtxn.PaymentTransaction) -> None: voting/voting.py:79-80 + proto 1 0 // (𝕡) fund_min_bal_req#0 | @arc4.abimethod\ndef bootstrap(self, fund_min_bal_req: gtxn.PaymentTransaction) -> None: voting/voting.py:79-80 bootstrap_block@0: - int 0 // (𝕡) fund_min_bal_req#0 | 0 self.is_bootstrapped voting/voting.py:81 - byte "is_bootstrapped" // (𝕡) fund_min_bal_req#0 | 0,"is_bootstrapped" self.is_bootstrapped voting/voting.py:81 - app_global_get_ex // (𝕡) fund_min_bal_req#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.is_bootstrapped voting/voting.py:81 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.is_bootstrapped voting/voting.py:81 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:81 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:81 - assert // check is_bootstrapped exists // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0 self.is_bootstrapped voting/voting.py:81 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%0#0 not self.is_bootstrapped voting/voting.py:81 - ! // (𝕡) fund_min_bal_req#0 | {!} not self.is_bootstrapped voting/voting.py:81 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%2#0 not self.is_bootstrapped voting/voting.py:81 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%2#0 assert not self.is_bootstrapped, "Must not be already bootstrapped" voting/voting.py:81 - assert // Must not be already bootstrapped // (𝕡) fund_min_bal_req#0 | assert not self.is_bootstrapped, "Must not be already bootstrapped" voting/voting.py:81 - byte "is_bootstrapped" // (𝕡) fund_min_bal_req#0 | "is_bootstrapped" self.is_bootstrapped voting/voting.py:82 - int 1 // (𝕡) fund_min_bal_req#0 | "is_bootstrapped",1 True voting/voting.py:82 - app_global_put // (𝕡) fund_min_bal_req#0 | self.is_bootstrapped = True voting/voting.py:82 - frame_dig -1 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0 | fund_min_bal_req#0 fund_min_bal_req.receiver voting/voting.py:85 - gtxns Receiver // (𝕡) fund_min_bal_req#0 | {gtxns} fund_min_bal_req.receiver voting/voting.py:85 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%3#0 fund_min_bal_req.receiver voting/voting.py:85 - global CurrentApplicationAddress // (𝕡) fund_min_bal_req#0 | tmp%3#0,{global} Global.current_application_address voting/voting.py:85 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%3#0,tmp%4#0 Global.current_application_address voting/voting.py:85 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%4#0,tmp%3#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%3#0,tmp%4#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 - == // (𝕡) fund_min_bal_req#0 | {==} fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%5#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%5#0 assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:84-86 - assert // Payment must be to app address // (𝕡) fund_min_bal_req#0 | assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:84-86 - int 0 // (𝕡) fund_min_bal_req#0 | 0 self.total_options voting/voting.py:88 - byte "total_options" // (𝕡) fund_min_bal_req#0 | 0,"total_options" self.total_options voting/voting.py:88 - app_global_get_ex // (𝕡) fund_min_bal_req#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.total_options voting/voting.py:88 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.total_options voting/voting.py:88 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.total_options voting/voting.py:88 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.total_options voting/voting.py:88 - assert // check total_options exists // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0 self.total_options voting/voting.py:88 - // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0 tally_box_size = self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 - int 8 // (𝕡) fund_min_bal_req#0 | app_global_get_ex_value%6#0,8 VOTE_COUNT_BYTES voting/voting.py:88 - * // (𝕡) fund_min_bal_req#0 | {*} self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 - // virtual: store tally_box_size#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0 tally_box_size = self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 - dup // load tally_box_size#0 from l-stack (copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tally_box_size#0 ally box value\n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 - int 400 // (𝕡) fund_min_bal_req#0 | tally_box_size#0,tally_box_size#0,400 \n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 - * // (𝕡) fund_min_bal_req#0 | tally_box_size#0,{*} ally box value\n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%8#0 ally box value\n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 - int 203900 // (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%8#0,203900 # minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE * 2\n# create NFT fee... voting/voting.py:90-97 - swap // load tmp%8#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,203900,tmp%8#0 min_balance_req = (\n# minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE ... voting/voting.py:89-100 - + // (𝕡) fund_min_bal_req#0 | tally_box_size#0,{+} # minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE * 2\n# create NFT fee... voting/voting.py:90-99 - // virtual: store min_balance_req#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0 min_balance_req = (\n# minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE ... voting/voting.py:89-100 - dup // load min_balance_req#0 from l-stack (copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,min_balance_req#0 min_balance_req voting/voting.py:101 - itob // (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,{itob} min_balance_req voting/voting.py:101 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%9#0 min_balance_req voting/voting.py:101 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%9#0 log(min_balance_req) voting/voting.py:101 - log // (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0 log(min_balance_req) voting/voting.py:101 - frame_dig -1 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,fund_min_bal_req#0 fund_min_bal_req.amount voting/voting.py:103 - gtxns Amount // (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,{gtxns} fund_min_bal_req.amount voting/voting.py:103 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%10#0 fund_min_bal_req.amount voting/voting.py:103 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%10#0 fund_min_bal_req.amount == min_balance_req voting/voting.py:103 - swap // load min_balance_req#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%10#0,min_balance_req#0 fund_min_bal_req.amount == min_balance_req voting/voting.py:103 - == // (𝕡) fund_min_bal_req#0 | tally_box_size#0,{==} fund_min_bal_req.amount == min_balance_req voting/voting.py:103 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%11#0 fund_min_bal_req.amount == min_balance_req voting/voting.py:103 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%11#0 assert (\nfund_min_bal_req.amount == min_balance_req\n), "Payment must be for the exact min balan... voting/voting.py:102-104 - assert // Payment must be for the exact min balance requirement // (𝕡) fund_min_bal_req#0 | tally_box_size#0 assert (\nfund_min_bal_req.amount == min_balance_req\n), "Payment must be for the exact min balan... voting/voting.py:102-104 - byte "V" // (𝕡) fund_min_bal_req#0 | tally_box_size#0,"V" TALLY_BOX_KEY voting/voting.py:105 - swap // load tally_box_size#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | "V",tally_box_size#0 op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 - box_create // (𝕡) fund_min_bal_req#0 | {box_create} op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%12#0 op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%12#0 assert op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 - assert // (𝕡) fund_min_bal_req#0 | assert op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 + int 0 // (𝕡) fund_min_bal_req#0 | 0 self.is_bootstrapped voting/voting.py:81 + byte "is_bootstrapped" // (𝕡) fund_min_bal_req#0 | 0,"is_bootstrapped" self.is_bootstrapped voting/voting.py:81 + app_global_get_ex // (𝕡) fund_min_bal_req#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.is_bootstrapped voting/voting.py:81 + // virtual: store is_bootstrapped_exists%1#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | is_bootstrapped_exists%1#0,{app_global_get_ex}.0 self.is_bootstrapped voting/voting.py:81 + // virtual: store is_bootstrapped_value%0#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | is_bootstrapped_value%0#0,is_bootstrapped_exists%1#0 self.is_bootstrapped voting/voting.py:81 + // virtual: load is_bootstrapped_exists%1#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | is_bootstrapped_value%0#0,is_bootstrapped_exists%1#0 self.is_bootstrapped voting/voting.py:81 + assert // check is_bootstrapped exists // (𝕡) fund_min_bal_req#0 | is_bootstrapped_value%0#0 self.is_bootstrapped voting/voting.py:81 + // virtual: load is_bootstrapped_value%0#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | is_bootstrapped_value%0#0 not self.is_bootstrapped voting/voting.py:81 + ! // (𝕡) fund_min_bal_req#0 | {!} not self.is_bootstrapped voting/voting.py:81 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%2#0 not self.is_bootstrapped voting/voting.py:81 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%2#0 assert not self.is_bootstrapped, "Must not be already bootstrapped" voting/voting.py:81 + assert // Must not be already bootstrapped // (𝕡) fund_min_bal_req#0 | assert not self.is_bootstrapped, "Must not be already bootstrapped" voting/voting.py:81 + byte "is_bootstrapped" // (𝕡) fund_min_bal_req#0 | "is_bootstrapped" self.is_bootstrapped voting/voting.py:82 + int 1 // (𝕡) fund_min_bal_req#0 | "is_bootstrapped",1 True voting/voting.py:82 + app_global_put // (𝕡) fund_min_bal_req#0 | self.is_bootstrapped = True voting/voting.py:82 + frame_dig -1 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0 | fund_min_bal_req#0 fund_min_bal_req.receiver voting/voting.py:85 + gtxns Receiver // (𝕡) fund_min_bal_req#0 | {gtxns} fund_min_bal_req.receiver voting/voting.py:85 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%3#0 fund_min_bal_req.receiver voting/voting.py:85 + global CurrentApplicationAddress // (𝕡) fund_min_bal_req#0 | tmp%3#0,{global} Global.current_application_address voting/voting.py:85 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%3#0,tmp%4#0 Global.current_application_address voting/voting.py:85 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%4#0,tmp%3#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%3#0,tmp%4#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 + == // (𝕡) fund_min_bal_req#0 | {==} fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%5#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:85 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%5#0 assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:84-86 + assert // Payment must be to app address // (𝕡) fund_min_bal_req#0 | assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:84-86 + int 0 // (𝕡) fund_min_bal_req#0 | 0 self.total_options voting/voting.py:88 + byte "total_options" // (𝕡) fund_min_bal_req#0 | 0,"total_options" self.total_options voting/voting.py:88 + app_global_get_ex // (𝕡) fund_min_bal_req#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.total_options voting/voting.py:88 + // virtual: store total_options_exists%7#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | total_options_exists%7#0,{app_global_get_ex}.0 self.total_options voting/voting.py:88 + // virtual: store total_options_value%6#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | total_options_value%6#0,total_options_exists%7#0 self.total_options voting/voting.py:88 + // virtual: load total_options_exists%7#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | total_options_value%6#0,total_options_exists%7#0 self.total_options voting/voting.py:88 + assert // check total_options exists // (𝕡) fund_min_bal_req#0 | total_options_value%6#0 self.total_options voting/voting.py:88 + // virtual: load total_options_value%6#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | total_options_value%6#0 tally_box_size = self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 + int 8 // (𝕡) fund_min_bal_req#0 | total_options_value%6#0,8 VOTE_COUNT_BYTES voting/voting.py:88 + * // (𝕡) fund_min_bal_req#0 | {*} self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 + // virtual: store tally_box_size#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0 tally_box_size = self.total_options * VOTE_COUNT_BYTES voting/voting.py:88 + dup // load tally_box_size#0 from l-stack (copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tally_box_size#0 ally box value\n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 + int 400 // (𝕡) fund_min_bal_req#0 | tally_box_size#0,tally_box_size#0,400 \n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 + * // (𝕡) fund_min_bal_req#0 | tally_box_size#0,{*} ally box value\n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%8#0 ally box value\n+ (tally_box_size * BOX_BYTE_MIN_BALANCE voting/voting.py:98-99 + int 203900 // (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%8#0,203900 # minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE * 2\n# create NFT fee... voting/voting.py:90-97 + swap // load tmp%8#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,203900,tmp%8#0 min_balance_req = (\n# minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE ... voting/voting.py:89-100 + + // (𝕡) fund_min_bal_req#0 | tally_box_size#0,{+} # minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE * 2\n# create NFT fee... voting/voting.py:90-99 + // virtual: store min_balance_req#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0 min_balance_req = (\n# minimum balance req for: ALGOs + Vote result NFT asset\nASSET_MIN_BALANCE ... voting/voting.py:89-100 + dup // load min_balance_req#0 from l-stack (copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,min_balance_req#0 min_balance_req voting/voting.py:101 + itob // (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,{itob} min_balance_req voting/voting.py:101 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%9#0 min_balance_req voting/voting.py:101 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%9#0 log(min_balance_req) voting/voting.py:101 + log // (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0 log(min_balance_req) voting/voting.py:101 + frame_dig -1 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,fund_min_bal_req#0 fund_min_bal_req.amount voting/voting.py:103 + gtxns Amount // (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,{gtxns} fund_min_bal_req.amount voting/voting.py:103 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%10#0 fund_min_bal_req.amount voting/voting.py:103 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,min_balance_req#0,tmp%10#0 fund_min_bal_req.amount == min_balance_req voting/voting.py:103 + swap // load min_balance_req#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%10#0,min_balance_req#0 fund_min_bal_req.amount == min_balance_req voting/voting.py:103 + == // (𝕡) fund_min_bal_req#0 | tally_box_size#0,{==} fund_min_bal_req.amount == min_balance_req voting/voting.py:103 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%11#0 fund_min_bal_req.amount == min_balance_req voting/voting.py:103 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tally_box_size#0,tmp%11#0 assert (\nfund_min_bal_req.amount == min_balance_req\n), "Payment must be for the exact min balan... voting/voting.py:102-104 + assert // Payment must be for the exact min balance requirement // (𝕡) fund_min_bal_req#0 | tally_box_size#0 assert (\nfund_min_bal_req.amount == min_balance_req\n), "Payment must be for the exact min balan... voting/voting.py:102-104 + byte "V" // (𝕡) fund_min_bal_req#0 | tally_box_size#0,"V" TALLY_BOX_KEY voting/voting.py:105 + swap // load tally_box_size#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | "V",tally_box_size#0 op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 + box_create // (𝕡) fund_min_bal_req#0 | {box_create} op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%12#0 op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0 | tmp%12#0 assert op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 + assert // (𝕡) fund_min_bal_req#0 | assert op.Box.create(TALLY_BOX_KEY, tally_box_size) voting/voting.py:105 retsub // // examples.voting.voting.VotingRoundApp.close() -> void: close: - proto 0 0 // @arc4.abimethod\ndef close(self) -> None: voting/voting.py:107-108 + proto 0 0 // @arc4.abimethod\ndef close(self) -> None: voting/voting.py:107-108 int 0 dup byte "" - dupn 2 // allocate 5 to stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | + dupn 2 // allocate 5 to stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_block@0: - int 20000 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 20000 20000 voting/voting.py:109 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 20000,0 OpUpFeeSource.GroupCredit voting/voting.py:109 - callsub ensure_budget // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | ensure_budget(20000, fee_source=OpUpFeeSource.GroupCredit) voting/voting.py:109 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0 not self.close_time voting/voting.py:110 - byte "close_time" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0,"close_time" not self.close_time voting/voting.py:110 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.close_time voting/voting.py:110 - swap // store close_time_exists%1#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:110 - pop // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0 not self.close_time voting/voting.py:110 - // virtual: load close_time_exists%1#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0 not self.close_time voting/voting.py:110 - ! // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {!} not self.close_time voting/voting.py:110 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%2#0 not self.close_time voting/voting.py:110 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%2#0 assert not self.close_time, "Already closed" voting/voting.py:110 - assert // Already closed // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | assert not self.close_time, "Already closed" voting/voting.py:110 - global LatestTimestamp // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {global} Global.latest_timestamp voting/voting.py:111 - // virtual: store new_state_value%3#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | new_state_value%3#0 Global.latest_timestamp voting/voting.py:111 - byte "close_time" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | new_state_value%3#0,"close_time" self.close_time voting/voting.py:111 - swap // load new_state_value%3#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | "close_time",new_state_value%3#0 self.close_time.value = Global.latest_timestamp voting/voting.py:111 - app_global_put // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | self.close_time.value = Global.latest_timestamp voting/voting.py:111 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0 self.vote_id voting/voting.py:116 - byte "vote_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0,"vote_id" self.vote_id voting/voting.py:116 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.vote_id voting/voting.py:116 - // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:116 - // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.vote_id voting/voting.py:116 - // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.vote_id voting/voting.py:116 - assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0 self.vote_id voting/voting.py:116 - byte "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%4#0,"{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID ' voting/voting.py:114-115 - swap // load app_global_get_ex_value%4#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID ",app_global_get_ex_value%4#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%6#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%6#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-117 - byte ".\",\"properties\":{\"metadata\":\"ipfs://" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%6#0,".\",\"properties\":{\"metadata\":\"ipfs://" b'.","properties":{"metadata":"ipfs://' voting/voting.py:117 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-117 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-117 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,0 self.metadata_ipfs_cid voting/voting.py:118 - byte "metadata_ipfs_cid" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,0,"metadata_ipfs_cid" self.metadata_ipfs_cid voting/voting.py:118 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.metadata_ipfs_cid voting/voting.py:118 - // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.metadata_ipfs_cid voting/voting.py:118 - // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.metadata_ipfs_cid voting/voting.py:118 - // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.metadata_ipfs_cid voting/voting.py:118 - assert // check metadata_ipfs_cid exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0 self.metadata_ipfs_cid voting/voting.py:118 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%8#0,tmp%7#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 - // virtual: load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,app_global_get_ex_value%8#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%10#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%10#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-119 - byte "\",\"id\":\"" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%10#0,"\",\"id\":\"" b'","id":"' voting/voting.py:119 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-119 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-119 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,0 self.vote_id voting/voting.py:120 - byte "vote_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,0,"vote_id" self.vote_id voting/voting.py:120 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.vote_id voting/voting.py:120 - // virtual: store app_global_get_ex_did_exist%13#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_did_exist%13#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:120 - // virtual: store app_global_get_ex_value%12#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.vote_id voting/voting.py:120 - // virtual: load app_global_get_ex_did_exist%13#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.vote_id voting/voting.py:120 - assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0 self.vote_id voting/voting.py:120 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | app_global_get_ex_value%12#0,tmp%11#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 - // virtual: load app_global_get_ex_value%12#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,app_global_get_ex_value%12#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%14#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%14#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-121 - byte "\",\"quorum\":" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%14#0,"\",\"quorum\":" b'","quorum":' voting/voting.py:121 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-121 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-121 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,0 self.quorum voting/voting.py:122 - byte "quorum" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,0,"quorum" self.quorum voting/voting.py:122 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.quorum voting/voting.py:122 - // virtual: store app_global_get_ex_did_exist%17#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_did_exist%17#0,{app_global_get_ex}.0 self.quorum voting/voting.py:122 - // virtual: store app_global_get_ex_value%16#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.quorum voting/voting.py:122 - // virtual: load app_global_get_ex_did_exist%17#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0,app_global_get_ex_did_exist%17#0 self.quorum voting/voting.py:122 - assert // check quorum exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0 self.quorum voting/voting.py:122 - // virtual: load app_global_get_ex_value%16#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,app_global_get_ex_value%16#0 itoa(self.quorum) voting/voting.py:122 - callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,{itoa} itoa(self.quorum) voting/voting.py:122 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,tmp%18#0 itoa(self.quorum) voting/voting.py:122 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%18#0,tmp%15#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,tmp%18#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%19#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%19#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-123 - byte ",\"voterCount\":" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%19#0,",\"voterCount\":" b',"voterCount":' voting/voting.py:123 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-123 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-123 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,0 self.voter_count voting/voting.py:124 - byte "voter_count" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,0,"voter_count" self.voter_count voting/voting.py:124 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.voter_count voting/voting.py:124 - // virtual: store app_global_get_ex_did_exist%22#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_did_exist%22#0,{app_global_get_ex}.0 self.voter_count voting/voting.py:124 - // virtual: store app_global_get_ex_value%21#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0,app_global_get_ex_did_exist%22#0 self.voter_count voting/voting.py:124 - // virtual: load app_global_get_ex_did_exist%22#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0,app_global_get_ex_did_exist%22#0 self.voter_count voting/voting.py:124 - assert // check voter_count exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0 self.voter_count voting/voting.py:124 - // virtual: load app_global_get_ex_value%21#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,app_global_get_ex_value%21#0 itoa(self.voter_count) voting/voting.py:124 - callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,{itoa} itoa(self.voter_count) voting/voting.py:124 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,tmp%23#0 itoa(self.voter_count) voting/voting.py:124 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%23#0,tmp%20#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,tmp%23#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%24#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%24#0 note = (\nb'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round ... voting/voting.py:113-126 - byte ",\"tallies\":[" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%24#0,",\"tallies\":[" b',"tallies":[' voting/voting.py:125 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-125 - // virtual: store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0 | note = (\nb'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round ... voting/voting.py:113-126 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0 | 0 0 voting/voting.py:128 - // virtual: store current_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | current_index = UInt64(0) voting/voting.py:128 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | 0 self.option_counts voting/voting.py:129 - byte "option_counts" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | 0,"option_counts" self.option_counts voting/voting.py:129 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.option_counts voting/voting.py:129 - // virtual: store app_global_get_ex_did_exist%26#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_did_exist%26#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:129 - // virtual: store app_global_get_ex_value%25#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:129 - // virtual: load app_global_get_ex_did_exist%26#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:129 - assert // check option_counts exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0 self.option_counts voting/voting.py:129 - dup // load app_global_get_ex_value%25#0 from l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_value%25#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,app_global_get_ex_value%25#0,0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - extract_uint16 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | app_global_get_ex_value%25#0,{extract_uint16} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - swap // store array_length%27#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0 | app_global_get_ex_value%25#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - // virtual: load app_global_get_ex_value%25#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0 | app_global_get_ex_value%25#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - extract 2 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0 | {extract} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - // virtual: store array_value%28#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0 | for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0 | 0 + int 20000 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 20000 20000 voting/voting.py:109 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 20000,0 OpUpFeeSource.GroupCredit voting/voting.py:109 + callsub ensure_budget // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | ensure_budget(20000, fee_source=OpUpFeeSource.GroupCredit) voting/voting.py:109 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0 not self.close_time voting/voting.py:110 + byte "close_time" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0,"close_time" not self.close_time voting/voting.py:110 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.close_time voting/voting.py:110 + swap // store close_time_exists%1#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:110 + pop // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0 not self.close_time voting/voting.py:110 + // virtual: load close_time_exists%1#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | close_time_exists%1#0 not self.close_time voting/voting.py:110 + ! // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {!} not self.close_time voting/voting.py:110 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%2#0 not self.close_time voting/voting.py:110 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%2#0 assert not self.close_time, "Already closed" voting/voting.py:110 + assert // Already closed // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | assert not self.close_time, "Already closed" voting/voting.py:110 + global LatestTimestamp // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {global} Global.latest_timestamp voting/voting.py:111 + // virtual: store new_state_value%3#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | new_state_value%3#0 Global.latest_timestamp voting/voting.py:111 + byte "close_time" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | new_state_value%3#0,"close_time" self.close_time voting/voting.py:111 + swap // load new_state_value%3#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | "close_time",new_state_value%3#0 self.close_time.value = Global.latest_timestamp voting/voting.py:111 + app_global_put // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | self.close_time.value = Global.latest_timestamp voting/voting.py:111 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0 self.vote_id voting/voting.py:116 + byte "vote_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | 0,"vote_id" self.vote_id voting/voting.py:116 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.vote_id voting/voting.py:116 + // virtual: store vote_id_exists%5#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | vote_id_exists%5#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:116 + // virtual: store vote_id_value%4#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | vote_id_value%4#0,vote_id_exists%5#0 self.vote_id voting/voting.py:116 + // virtual: load vote_id_exists%5#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | vote_id_value%4#0,vote_id_exists%5#0 self.vote_id voting/voting.py:116 + assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | vote_id_value%4#0 self.vote_id voting/voting.py:116 + byte "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | vote_id_value%4#0,"{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID ' voting/voting.py:114-115 + swap // load vote_id_value%4#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID ",vote_id_value%4#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%6#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-116 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%6#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-117 + byte ".\",\"properties\":{\"metadata\":\"ipfs://" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%6#0,".\",\"properties\":{\"metadata\":\"ipfs://" b'.","properties":{"metadata":"ipfs://' voting/voting.py:117 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-117 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-117 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,0 self.metadata_ipfs_cid voting/voting.py:118 + byte "metadata_ipfs_cid" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,0,"metadata_ipfs_cid" self.metadata_ipfs_cid voting/voting.py:118 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.metadata_ipfs_cid voting/voting.py:118 + // virtual: store metadata_ipfs_cid_exists%9#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,metadata_ipfs_cid_exists%9#0,{app_global_get_ex}.0 self.metadata_ipfs_cid voting/voting.py:118 + // virtual: store metadata_ipfs_cid_value%8#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,metadata_ipfs_cid_value%8#0,metadata_ipfs_cid_exists%9#0 self.metadata_ipfs_cid voting/voting.py:118 + // virtual: load metadata_ipfs_cid_exists%9#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,metadata_ipfs_cid_value%8#0,metadata_ipfs_cid_exists%9#0 self.metadata_ipfs_cid voting/voting.py:118 + assert // check metadata_ipfs_cid exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,metadata_ipfs_cid_value%8#0 self.metadata_ipfs_cid voting/voting.py:118 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | metadata_ipfs_cid_value%8#0,tmp%7#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 + // virtual: load metadata_ipfs_cid_value%8#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%7#0,metadata_ipfs_cid_value%8#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%10#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-118 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%10#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-119 + byte "\",\"id\":\"" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%10#0,"\",\"id\":\"" b'","id":"' voting/voting.py:119 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-119 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-119 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,0 self.vote_id voting/voting.py:120 + byte "vote_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,0,"vote_id" self.vote_id voting/voting.py:120 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.vote_id voting/voting.py:120 + // virtual: store vote_id_exists%13#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,vote_id_exists%13#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:120 + // virtual: store vote_id_value%12#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,vote_id_value%12#0,vote_id_exists%13#0 self.vote_id voting/voting.py:120 + // virtual: load vote_id_exists%13#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,vote_id_value%12#0,vote_id_exists%13#0 self.vote_id voting/voting.py:120 + assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,vote_id_value%12#0 self.vote_id voting/voting.py:120 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | vote_id_value%12#0,tmp%11#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 + // virtual: load vote_id_value%12#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%11#0,vote_id_value%12#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%14#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-120 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%14#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-121 + byte "\",\"quorum\":" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%14#0,"\",\"quorum\":" b'","quorum":' voting/voting.py:121 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-121 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-121 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,0 self.quorum voting/voting.py:122 + byte "quorum" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,0,"quorum" self.quorum voting/voting.py:122 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.quorum voting/voting.py:122 + // virtual: store quorum_exists%17#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,quorum_exists%17#0,{app_global_get_ex}.0 self.quorum voting/voting.py:122 + // virtual: store quorum_value%16#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,quorum_value%16#0,quorum_exists%17#0 self.quorum voting/voting.py:122 + // virtual: load quorum_exists%17#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,quorum_value%16#0,quorum_exists%17#0 self.quorum voting/voting.py:122 + assert // check quorum exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,quorum_value%16#0 self.quorum voting/voting.py:122 + // virtual: load quorum_value%16#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,quorum_value%16#0 itoa(self.quorum) voting/voting.py:122 + callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,{itoa} itoa(self.quorum) voting/voting.py:122 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,tmp%18#0 itoa(self.quorum) voting/voting.py:122 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%18#0,tmp%15#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%15#0,tmp%18#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%19#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-122 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%19#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-123 + byte ",\"voterCount\":" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%19#0,",\"voterCount\":" b',"voterCount":' voting/voting.py:123 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-123 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-123 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,0 self.voter_count voting/voting.py:124 + byte "voter_count" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,0,"voter_count" self.voter_count voting/voting.py:124 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.voter_count voting/voting.py:124 + // virtual: store voter_count_exists%22#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,voter_count_exists%22#0,{app_global_get_ex}.0 self.voter_count voting/voting.py:124 + // virtual: store voter_count_value%21#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,voter_count_value%21#0,voter_count_exists%22#0 self.voter_count voting/voting.py:124 + // virtual: load voter_count_exists%22#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,voter_count_value%21#0,voter_count_exists%22#0 self.voter_count voting/voting.py:124 + assert // check voter_count exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,voter_count_value%21#0 self.voter_count voting/voting.py:124 + // virtual: load voter_count_value%21#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,voter_count_value%21#0 itoa(self.voter_count) voting/voting.py:124 + callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,{itoa} itoa(self.voter_count) voting/voting.py:124 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,tmp%23#0 itoa(self.voter_count) voting/voting.py:124 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%23#0,tmp%20#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%20#0,tmp%23#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%24#0 b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-124 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%24#0 note = (\nb'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round ... voting/voting.py:113-126 + byte ",\"tallies\":[" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | tmp%24#0,",\"tallies\":[" b',"tallies":[' voting/voting.py:125 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0 | {concat} b'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round with ID '\... voting/voting.py:114-125 + // virtual: store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0 | note = (\nb'{"standard":"arc69",'\nb'"description":"This is a voting result NFT for voting round ... voting/voting.py:113-126 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0 | 0 0 voting/voting.py:128 + // virtual: store current_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | current_index = UInt64(0) voting/voting.py:128 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | 0 self.option_counts voting/voting.py:129 + byte "option_counts" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | 0,"option_counts" self.option_counts voting/voting.py:129 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.option_counts voting/voting.py:129 + // virtual: store option_counts_exists%26#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | option_counts_exists%26#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:129 + // virtual: store option_counts_value%25#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | option_counts_value%25#0,option_counts_exists%26#0 self.option_counts voting/voting.py:129 + // virtual: load option_counts_exists%26#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | option_counts_value%25#0,option_counts_exists%26#0 self.option_counts voting/voting.py:129 + assert // check option_counts exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | option_counts_value%25#0 self.option_counts voting/voting.py:129 + dup // load option_counts_value%25#0 from l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | option_counts_value%25#0,option_counts_value%25#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | option_counts_value%25#0,option_counts_value%25#0,0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + extract_uint16 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0 | option_counts_value%25#0,{extract_uint16} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + swap // store array_length%27#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0 | option_counts_value%25#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + // virtual: load option_counts_value%25#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0 | option_counts_value%25#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + extract 2 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0 | {extract} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + // virtual: store array_value%28#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0 | for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0 | 0 // virtual: store item_index_internal%29#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0 | item_index_internal%29#0 // virtual: load item_index_internal%29#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0 | item_index_internal%29#0 // virtual: store question_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - // Implicit fall through to close_for_header@1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + // Implicit fall through to close_for_header@1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | close_for_header@1: - frame_dig 9 // load question_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - frame_dig 7 // load array_length%27#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,array_length%27#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - < // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {<} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - // virtual: store continue_looping%31#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%31#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - // virtual: load continue_looping%31#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%31#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - bz close_after_for@15 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - // Implicit fall through to close_for_body@2 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + frame_dig 9 // load question_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + frame_dig 7 // load array_length%27#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,array_length%27#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + < // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {<} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + // virtual: store continue_looping%31#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%31#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + // virtual: load continue_looping%31#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%31#0 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + bz close_after_for@15 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + // Implicit fall through to close_for_body@2 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 close_for_body@2: - frame_dig 8 // load array_value%28#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | array_value%28#0 question_options_arc voting/voting.py:129 - frame_dig 9 // load question_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | array_value%28#0,question_index#0 question_options_arc voting/voting.py:129 + frame_dig 8 // load array_value%28#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | array_value%28#0 question_options_arc voting/voting.py:129 + frame_dig 9 // load question_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | array_value%28#0,question_index#0 question_options_arc voting/voting.py:129 dup - cover 2 // store question_index#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,array_value%28#0,question_index#0 question_options_arc voting/voting.py:129 - int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,array_value%28#0,question_index#0,1 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - extract3 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,{extract3} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 - frame_bury 1 // store question_options_arc#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 question_options_arc voting/voting.py:129 - // virtual: load question_index#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 question_index > 0: voting/voting.py:130 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,0 0 voting/voting.py:130 - > // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {>} question_index > 0: voting/voting.py:130 - // virtual: store tmp%33#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0 question_index > 0: voting/voting.py:130 - frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0,note#0 - frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0 - // virtual: load tmp%33#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0 if question_index > 0: voting/voting.py:130 - bz close_after_if_else@4 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_index > 0: voting/voting.py:130 - // Implicit fall through to close_if_body@3 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_index > 0: voting/voting.py:130 + cover 2 // store question_index#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,array_value%28#0,question_index#0 question_options_arc voting/voting.py:129 + int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,array_value%28#0,question_index#0,1 for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + extract3 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,{extract3} for question_index, question_options_arc in uenumerate(self.option_counts): voting/voting.py:129 + frame_bury 1 // store question_options_arc#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 question_options_arc voting/voting.py:129 + // virtual: load question_index#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 question_index > 0: voting/voting.py:130 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,0 0 voting/voting.py:130 + > // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {>} question_index > 0: voting/voting.py:130 + // virtual: store tmp%33#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0 question_index > 0: voting/voting.py:130 + frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0,note#0 + frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0 + // virtual: load tmp%33#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%33#0 if question_index > 0: voting/voting.py:130 + bz close_after_if_else@4 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_index > 0: voting/voting.py:130 + // Implicit fall through to close_if_body@3 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_index > 0: voting/voting.py:130 close_if_body@3: - frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:131 - byte "," // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"," b"," voting/voting.py:131 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"," voting/voting.py:131 - // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:131 + frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:131 + byte "," // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"," b"," voting/voting.py:131 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"," voting/voting.py:131 + // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:131 // virtual: load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 - frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - // Implicit fall through to close_after_if_else@4 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + // Implicit fall through to close_after_if_else@4 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | close_after_if_else@4: - frame_dig 0 // load note#18 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#18 - dup // store note#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,note#0 - frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 - frame_dig 1 // load question_options_arc#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options_arc#0 question_options = question_options_arc.decode() voting/voting.py:132 - btoi // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{btoi} question_options_arc.decode() voting/voting.py:132 - dup // store question_options#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0,question_options#0 question_options = question_options_arc.decode() voting/voting.py:132 - frame_bury 4 // store question_options#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0 question_options = question_options_arc.decode() voting/voting.py:132 - // virtual: load question_options#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0 question_options > 0: voting/voting.py:133 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0,0 0 voting/voting.py:133 - > // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{>} question_options > 0: voting/voting.py:133 - // virtual: store tmp%34#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,tmp%34#0 question_options > 0: voting/voting.py:133 - frame_dig 6 // load current_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,tmp%34#0,current_index#0 - frame_bury 2 // store current_index#16 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,tmp%34#0 - swap // load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%34#0,note#0 - frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%34#0 - // virtual: load tmp%34#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%34#0 if question_options > 0: voting/voting.py:133 - bz close_after_if_else@13 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_options > 0: voting/voting.py:133 - // Implicit fall through to close_if_body@5 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_options > 0: voting/voting.py:133 + frame_dig 0 // load note#18 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#18 + dup // store note#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,note#0 + frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 + frame_dig 1 // load question_options_arc#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options_arc#0 question_options = question_options_arc.decode() voting/voting.py:132 + btoi // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{btoi} question_options_arc.decode() voting/voting.py:132 + dup // store question_options#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0,question_options#0 question_options = question_options_arc.decode() voting/voting.py:132 + frame_bury 4 // store question_options#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0 question_options = question_options_arc.decode() voting/voting.py:132 + // virtual: load question_options#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0 question_options > 0: voting/voting.py:133 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,question_options#0,0 0 voting/voting.py:133 + > // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{>} question_options > 0: voting/voting.py:133 + // virtual: store tmp%34#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,tmp%34#0 question_options > 0: voting/voting.py:133 + frame_dig 6 // load current_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,tmp%34#0,current_index#0 + frame_bury 2 // store current_index#16 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,tmp%34#0 + swap // load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%34#0,note#0 + frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%34#0 + // virtual: load tmp%34#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%34#0 if question_options > 0: voting/voting.py:133 + bz close_after_if_else@13 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_options > 0: voting/voting.py:133 + // Implicit fall through to close_if_body@5 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if question_options > 0: voting/voting.py:133 close_if_body@5: - frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"[" voting/voting.py:134 - byte "[" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"[" b"[" voting/voting.py:134 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"[" voting/voting.py:134 - frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note += b"[" voting/voting.py:134 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | 0 urange(question_options) voting/voting.py:135 - // virtual: store range_item%35#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | range_item%35#0 option_index voting/voting.py:135 + frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"[" voting/voting.py:134 + byte "[" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"[" b"[" voting/voting.py:134 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"[" voting/voting.py:134 + frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note += b"[" voting/voting.py:134 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | 0 urange(question_options) voting/voting.py:135 + // virtual: store range_item%35#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | range_item%35#0 option_index voting/voting.py:135 // virtual: load range_item%35#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | range_item%35#0 - frame_bury 3 // store option_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - // Implicit fall through to close_for_header@6 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_bury 3 // store option_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + // Implicit fall through to close_for_header@6 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | close_for_header@6: - frame_dig 3 // load option_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0 urange(question_options) voting/voting.py:135 - frame_dig 4 // load question_options#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0,question_options#0 urange(question_options) voting/voting.py:135 - < // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {<} urange(question_options) voting/voting.py:135 - // virtual: store continue_looping%36#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%36#0 urange(question_options) voting/voting.py:135 - // virtual: load continue_looping%36#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%36#0 for option_index in urange(question_options): voting/voting.py:135 - bz close_after_for@12 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for option_index in urange(question_options): voting/voting.py:135 - // Implicit fall through to close_for_body@7 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for option_index in urange(question_options): voting/voting.py:135 + frame_dig 3 // load option_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0 urange(question_options) voting/voting.py:135 + frame_dig 4 // load question_options#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0,question_options#0 urange(question_options) voting/voting.py:135 + < // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {<} urange(question_options) voting/voting.py:135 + // virtual: store continue_looping%36#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%36#0 urange(question_options) voting/voting.py:135 + // virtual: load continue_looping%36#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | continue_looping%36#0 for option_index in urange(question_options): voting/voting.py:135 + bz close_after_for@12 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for option_index in urange(question_options): voting/voting.py:135 + // Implicit fall through to close_for_body@7 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | for option_index in urange(question_options): voting/voting.py:135 close_for_body@7: - frame_dig 3 // load option_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0 option_index > 0: voting/voting.py:136 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0,0 0 voting/voting.py:136 - > // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {>} option_index > 0: voting/voting.py:136 - // virtual: store tmp%37#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0 option_index > 0: voting/voting.py:136 - frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0,note#0 - frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0 - // virtual: load tmp%37#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0 if option_index > 0: voting/voting.py:136 - bz close_after_if_else@9 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if option_index > 0: voting/voting.py:136 - // Implicit fall through to close_if_body@8 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if option_index > 0: voting/voting.py:136 + frame_dig 3 // load option_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0 option_index > 0: voting/voting.py:136 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0,0 0 voting/voting.py:136 + > // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {>} option_index > 0: voting/voting.py:136 + // virtual: store tmp%37#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0 option_index > 0: voting/voting.py:136 + frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0,note#0 + frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0 + // virtual: load tmp%37#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | tmp%37#0 if option_index > 0: voting/voting.py:136 + bz close_after_if_else@9 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if option_index > 0: voting/voting.py:136 + // Implicit fall through to close_if_body@8 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | if option_index > 0: voting/voting.py:136 close_if_body@8: - frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:137 - byte "," // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"," b"," voting/voting.py:137 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"," voting/voting.py:137 - // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:137 + frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:137 + byte "," // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"," b"," voting/voting.py:137 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"," voting/voting.py:137 + // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"," voting/voting.py:137 // virtual: load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 - frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - // Implicit fall through to close_after_if_else@9 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + // Implicit fall through to close_after_if_else@9 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | close_after_if_else@9: - frame_dig 0 // load note#18 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#18 + frame_dig 0 // load note#18 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#18 // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 - frame_dig 6 // load current_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,current_index#0 votes_for_option = get_vote_from_box(current_index) voting/voting.py:138 + frame_dig 6 // load current_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,current_index#0 votes_for_option = get_vote_from_box(current_index) voting/voting.py:138 dup - cover 2 // store current_index#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,current_index#0 votes_for_option = get_vote_from_box(current_index) voting/voting.py:138 - callsub get_vote_from_box // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,{get_vote_from_box} get_vote_from_box(current_index) voting/voting.py:138 - // virtual: store votes_for_option#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,votes_for_option#0 votes_for_option = get_vote_from_box(current_index) voting/voting.py:138 - // virtual: load votes_for_option#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,votes_for_option#0 itoa(votes_for_option) voting/voting.py:139 - callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,{itoa} itoa(votes_for_option) voting/voting.py:139 - // virtual: store tmp%38#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,tmp%38#0 itoa(votes_for_option) voting/voting.py:139 - // virtual: load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,tmp%38#0,note#0 note += itoa(votes_for_option) voting/voting.py:139 - // virtual: load tmp%38#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,tmp%38#0 note += itoa(votes_for_option) voting/voting.py:139 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,{concat} note += itoa(votes_for_option) voting/voting.py:139 - frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0 note += itoa(votes_for_option) voting/voting.py:139 - // virtual: load current_index#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0 current_index += 1 voting/voting.py:140 - int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,1 1 voting/voting.py:140 - + // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {+} current_index += 1 voting/voting.py:140 - frame_bury 6 // store current_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index += 1 voting/voting.py:140 - frame_dig 3 // load option_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0 for option_index in urange(question_options): voting/voting.py:135 - int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0,1 urange(question_options) voting/voting.py:135 - + // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {+} urange(question_options) voting/voting.py:135 - // virtual: store range_item%35#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | range_item%35#0 for option_index in urange(question_options): voting/voting.py:135 + cover 2 // store current_index#0 to l-stack (copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,current_index#0 votes_for_option = get_vote_from_box(current_index) voting/voting.py:138 + callsub get_vote_from_box // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,{get_vote_from_box} get_vote_from_box(current_index) voting/voting.py:138 + // virtual: store votes_for_option#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,votes_for_option#0 votes_for_option = get_vote_from_box(current_index) voting/voting.py:138 + // virtual: load votes_for_option#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,votes_for_option#0 itoa(votes_for_option) voting/voting.py:139 + callsub itoa // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,{itoa} itoa(votes_for_option) voting/voting.py:139 + // virtual: store tmp%38#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,tmp%38#0 itoa(votes_for_option) voting/voting.py:139 + // virtual: load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,tmp%38#0,note#0 note += itoa(votes_for_option) voting/voting.py:139 + // virtual: load tmp%38#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,note#0,tmp%38#0 note += itoa(votes_for_option) voting/voting.py:139 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,{concat} note += itoa(votes_for_option) voting/voting.py:139 + frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0 note += itoa(votes_for_option) voting/voting.py:139 + // virtual: load current_index#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0 current_index += 1 voting/voting.py:140 + int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#0,1 1 voting/voting.py:140 + + // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {+} current_index += 1 voting/voting.py:140 + frame_bury 6 // store current_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index += 1 voting/voting.py:140 + frame_dig 3 // load option_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0 for option_index in urange(question_options): voting/voting.py:135 + int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | option_index#0,1 urange(question_options) voting/voting.py:135 + + // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {+} urange(question_options) voting/voting.py:135 + // virtual: store range_item%35#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | range_item%35#0 for option_index in urange(question_options): voting/voting.py:135 // virtual: load range_item%35#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | range_item%35#0 - frame_bury 3 // store option_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - b close_for_header@6 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_bury 3 // store option_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + b close_for_header@6 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | close_after_for@12: - frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]" voting/voting.py:141 - byte "]" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"]" b"]" voting/voting.py:141 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"]" voting/voting.py:141 - // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]" voting/voting.py:141 - frame_dig 6 // load current_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,current_index#0 - frame_bury 2 // store current_index#16 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 + frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]" voting/voting.py:141 + byte "]" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"]" b"]" voting/voting.py:141 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"]" voting/voting.py:141 + // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]" voting/voting.py:141 + frame_dig 6 // load current_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,current_index#0 + frame_bury 2 // store current_index#16 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 // virtual: load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 - frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - // Implicit fall through to close_after_if_else@13 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_bury 0 // store note#18 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + // Implicit fall through to close_after_if_else@13 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | close_after_if_else@13: - frame_dig 2 // load current_index#16 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#16 - frame_bury 6 // store current_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - frame_dig 0 // load note#18 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#18 - frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - frame_dig 9 // load question_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 - int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,1 - + // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {+} + frame_dig 2 // load current_index#16 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | current_index#16 + frame_bury 6 // store current_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_dig 0 // load note#18 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#18 + frame_bury 5 // store note#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_dig 9 // load question_index#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0 + int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | question_index#0,1 + + // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {+} // virtual: store item_index_internal%29#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | item_index_internal%29#0 // virtual: load item_index_internal%29#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | item_index_internal%29#0 - frame_bury 9 // store question_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - b close_for_header@1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + frame_bury 9 // store question_index#0 to f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + b close_for_header@1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | close_after_for@15: - frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]}}" voting/voting.py:142 - byte "]}}" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"]}}" b"]}}" voting/voting.py:142 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"]}}" voting/voting.py:142 - // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]}}" voting/voting.py:142 - itxn_begin // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,0 self.vote_id voting/voting.py:148 - byte "vote_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,0,"vote_id" self.vote_id voting/voting.py:148 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.vote_id voting/voting.py:148 - // virtual: store app_global_get_ex_did_exist%42#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_did_exist%42#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:148 - // virtual: store app_global_get_ex_value%41#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0,app_global_get_ex_did_exist%42#0 self.vote_id voting/voting.py:148 - // virtual: load app_global_get_ex_did_exist%42#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0,app_global_get_ex_did_exist%42#0 self.vote_id voting/voting.py:148 - assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0 self.vote_id voting/voting.py:148 - byte "[VOTE RESULT] " // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,app_global_get_ex_value%41#0,"[VOTE RESULT] " b"[VOTE RESULT] " voting/voting.py:148 - swap // load app_global_get_ex_value%41#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"[VOTE RESULT] ",app_global_get_ex_value%41#0 b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 - concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{concat} b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 - // virtual: store inner_txn_params%40%%param_ConfigAssetName_idx_0#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0 self.nft_image_url voting/voting.py:150 - byte "nft_image_url" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0,"nft_image_url" self.nft_image_url voting/voting.py:150 - app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.nft_image_url voting/voting.py:150 - // virtual: store app_global_get_ex_did_exist%44#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_did_exist%44#0,{app_global_get_ex}.0 self.nft_image_url voting/voting.py:150 - // virtual: store app_global_get_ex_value%43#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0,app_global_get_ex_did_exist%44#0 self.nft_image_url voting/voting.py:150 - // virtual: load app_global_get_ex_did_exist%44#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0,app_global_get_ex_did_exist%44#0 self.nft_image_url voting/voting.py:150 - assert // check nft_image_url exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0 self.nft_image_url voting/voting.py:150 - // virtual: load app_global_get_ex_value%43#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,app_global_get_ex_value%43#0 - itxn_field ConfigAssetURL // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 - byte "VOTERSLT" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,"VOTERSLT" b"VOTERSLT" voting/voting.py:149 - itxn_field ConfigAssetUnitName // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 - int acfg // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,acfg itxn.AssetConfig voting/voting.py:144 - itxn_field TypeEnum // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 - int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,1 1 voting/voting.py:145 - itxn_field ConfigAssetTotal // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 - swap // load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0,note#0 - itxn_field Note // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0 False voting/voting.py:147 - itxn_field ConfigAssetDefaultFrozen // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0 - int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0 0 voting/voting.py:146 - itxn_field ConfigAssetDecimals // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0 + frame_dig 5 // load note#0 from f-stack (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]}}" voting/voting.py:142 + byte "]}}" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"]}}" b"]}}" voting/voting.py:142 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {concat} note += b"]}}" voting/voting.py:142 + // virtual: store note#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 note += b"]}}" voting/voting.py:142 + itxn_begin // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0 itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,0 self.vote_id voting/voting.py:148 + byte "vote_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,0,"vote_id" self.vote_id voting/voting.py:148 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.vote_id voting/voting.py:148 + // virtual: store vote_id_exists%42#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,vote_id_exists%42#0,{app_global_get_ex}.0 self.vote_id voting/voting.py:148 + // virtual: store vote_id_value%41#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,vote_id_value%41#0,vote_id_exists%42#0 self.vote_id voting/voting.py:148 + // virtual: load vote_id_exists%42#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,vote_id_value%41#0,vote_id_exists%42#0 self.vote_id voting/voting.py:148 + assert // check vote_id exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,vote_id_value%41#0 self.vote_id voting/voting.py:148 + byte "[VOTE RESULT] " // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,vote_id_value%41#0,"[VOTE RESULT] " b"[VOTE RESULT] " voting/voting.py:148 + swap // load vote_id_value%41#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,"[VOTE RESULT] ",vote_id_value%41#0 b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 + concat // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,{concat} b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 + // virtual: store inner_txn_params%40%%param_ConfigAssetName_idx_0#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 b"[VOTE RESULT] " + self.vote_id voting/voting.py:148 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0 self.nft_image_url voting/voting.py:150 + byte "nft_image_url" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0,"nft_image_url" self.nft_image_url voting/voting.py:150 + app_global_get_ex // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.nft_image_url voting/voting.py:150 + // virtual: store nft_image_url_exists%44#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,nft_image_url_exists%44#0,{app_global_get_ex}.0 self.nft_image_url voting/voting.py:150 + // virtual: store nft_image_url_value%43#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,nft_image_url_value%43#0,nft_image_url_exists%44#0 self.nft_image_url voting/voting.py:150 + // virtual: load nft_image_url_exists%44#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,nft_image_url_value%43#0,nft_image_url_exists%44#0 self.nft_image_url voting/voting.py:150 + assert // check nft_image_url exists // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,nft_image_url_value%43#0 self.nft_image_url voting/voting.py:150 + // virtual: load nft_image_url_value%43#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,nft_image_url_value%43#0 + itxn_field ConfigAssetURL // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 + byte "VOTERSLT" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,"VOTERSLT" b"VOTERSLT" voting/voting.py:149 + itxn_field ConfigAssetUnitName // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 + int acfg // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,acfg itxn.AssetConfig voting/voting.py:144 + itxn_field TypeEnum // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 + int 1 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0,1 1 voting/voting.py:145 + itxn_field ConfigAssetTotal // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | note#0,inner_txn_params%40%%param_ConfigAssetName_idx_0#0 + swap // load note#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0,note#0 + itxn_field Note // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0 False voting/voting.py:147 + itxn_field ConfigAssetDefaultFrozen // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0 + int 0 // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0,0 0 voting/voting.py:146 + itxn_field ConfigAssetDecimals // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0 // virtual: load inner_txn_params%40%%param_ConfigAssetName_idx_0#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | inner_txn_params%40%%param_ConfigAssetName_idx_0#0 - itxn_field ConfigAssetName // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | - itxn_submit // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 - itxn CreatedAssetID // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {itxn} itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 - // virtual: store submit_result_0%39%%CreatedAssetID#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | submit_result_0%39%%CreatedAssetID#0 itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 - byte "nft_asset_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | submit_result_0%39%%CreatedAssetID#0,"nft_asset_id" self.nft_asset_id voting/voting.py:143 - swap // load submit_result_0%39%%CreatedAssetID#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | "nft_asset_id",submit_result_0%39%%CreatedAssetID#0 self.nft_asset_id = (\nitxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_nam... voting/voting.py:143-155 - app_global_put // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | self.nft_asset_id = (\nitxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_nam... voting/voting.py:143-155 + itxn_field ConfigAssetName // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | + itxn_submit // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 + itxn CreatedAssetID // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | {itxn} itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 + // virtual: store submit_result_0%39%%CreatedAssetID#0 to l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | submit_result_0%39%%CreatedAssetID#0 itxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_name=b"[VOTE RESULT] " + s... voting/voting.py:144-153 + byte "nft_asset_id" // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | submit_result_0%39%%CreatedAssetID#0,"nft_asset_id" self.nft_asset_id voting/voting.py:143 + swap // load submit_result_0%39%%CreatedAssetID#0 from l-stack (no copy) (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | "nft_asset_id",submit_result_0%39%%CreatedAssetID#0 self.nft_asset_id = (\nitxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_nam... voting/voting.py:143-155 + app_global_put // (𝕗) note#18,question_options_arc#0,current_index#16,option_index#0,question_options#0,note#0,current_index#0,array_length%27#0,array_value%28#0,question_index#0 | self.nft_asset_id = (\nitxn.AssetConfig(\ntotal=1,\ndecimals=0,\ndefault_frozen=False,\nasset_nam... voting/voting.py:143-155 retsub // // puyapy.ensure_budget(required_budget: uint64, fee_source: uint64) -> void: ensure_budget: - proto 2 0 // (𝕡) required_budget#0,fee_source#0 | /puyapy.py:11-17 + proto 2 0 // (𝕡) required_budget#0,fee_source#0 | /puyapy.py:11-17 ensure_budget_block@0: - frame_dig -2 // load required_budget#0 from parameters (𝕡) required_budget#0,fee_source#0 | required_budget#0 /puyapy.py:18 - int 10 // (𝕡) required_budget#0,fee_source#0 | required_budget#0,10 /puyapy.py:18 - + // (𝕡) required_budget#0,fee_source#0 | {+} /puyapy.py:18 - // virtual: store required_budget_with_buffer#0 to f-stack (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:18 - // Implicit fall through to ensure_budget_while_top@1 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | + frame_dig -2 // load required_budget#0 from parameters (𝕡) required_budget#0,fee_source#0 | required_budget#0 /puyapy.py:18 + int 10 // (𝕡) required_budget#0,fee_source#0 | required_budget#0,10 /puyapy.py:18 + + // (𝕡) required_budget#0,fee_source#0 | {+} /puyapy.py:18 + // virtual: store required_budget_with_buffer#0 to f-stack (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:18 + // Implicit fall through to ensure_budget_while_top@1 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | ensure_budget_while_top@1: - global OpcodeBudget // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | {global} /puyapy.py:19 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%0#0 /puyapy.py:19 - frame_dig 0 // load required_budget_with_buffer#0 from f-stack (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%0#0,required_budget_with_buffer#0 /puyapy.py:19 - swap // load tmp%0#0 from l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | required_budget_with_buffer#0,tmp%0#0 /puyapy.py:19 - > // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | {>} /puyapy.py:19 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%1#0 /puyapy.py:19 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%1#0 /puyapy.py:19 - bz ensure_budget_after_while@7 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:19 - // Implicit fall through to ensure_budget_while_body@2 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:19 + global OpcodeBudget // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | {global} /puyapy.py:19 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%0#0 /puyapy.py:19 + frame_dig 0 // load required_budget_with_buffer#0 from f-stack (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%0#0,required_budget_with_buffer#0 /puyapy.py:19 + swap // load tmp%0#0 from l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | required_budget_with_buffer#0,tmp%0#0 /puyapy.py:19 + > // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | {>} /puyapy.py:19 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%1#0 /puyapy.py:19 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%1#0 /puyapy.py:19 + bz ensure_budget_after_while@7 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:19 + // Implicit fall through to ensure_budget_while_body@2 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:19 ensure_budget_while_body@2: - itxn_begin // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:20 - int appl // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | appl /puyapy.py:21 - itxn_field TypeEnum // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:21 - int DeleteApplication // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | DeleteApplication /puyapy.py:22 - itxn_field OnCompletion // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:22 - byte 0x068101 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | 0x068101 /puyapy.py:23 - itxn_field ApprovalProgram // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:23 - byte 0x068101 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | 0x068101 /puyapy.py:24 - itxn_field ClearStateProgram // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:24 - frame_dig -1 // load fee_source#0 from parameters (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | fee_source#0 /puyapy.py:25-29 - switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:25-29 - b ensure_budget_switch_case_next@6 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | + itxn_begin // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:20 + int appl // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | appl /puyapy.py:21 + itxn_field TypeEnum // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:21 + int DeleteApplication // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | DeleteApplication /puyapy.py:22 + itxn_field OnCompletion // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:22 + byte 0x068101 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | 0x068101 /puyapy.py:23 + itxn_field ApprovalProgram // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:23 + byte 0x068101 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | 0x068101 /puyapy.py:24 + itxn_field ClearStateProgram // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:24 + frame_dig -1 // load fee_source#0 from parameters (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | fee_source#0 /puyapy.py:25-29 + switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:25-29 + b ensure_budget_switch_case_next@6 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | ensure_budget_switch_case_0@3: - int 0 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | 0 /puyapy.py:27 - itxn_field Fee // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:27 - b ensure_budget_switch_case_next@6 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | + int 0 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | 0 /puyapy.py:27 + itxn_field Fee // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:27 + b ensure_budget_switch_case_next@6 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | ensure_budget_switch_case_1@4: - global MinTxnFee // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | {global} /puyapy.py:29 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%2#0 /puyapy.py:29 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%2#0 /puyapy.py:29 - itxn_field Fee // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:29 - // Implicit fall through to ensure_budget_switch_case_next@6 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | + global MinTxnFee // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | {global} /puyapy.py:29 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%2#0 /puyapy.py:29 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | tmp%2#0 /puyapy.py:29 + itxn_field Fee // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:29 + // Implicit fall through to ensure_budget_switch_case_next@6 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | ensure_budget_switch_case_next@6: - itxn_submit // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:30 - b ensure_budget_while_top@1 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | + itxn_submit // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | /puyapy.py:30 + b ensure_budget_while_top@1 // (𝕡) required_budget#0,fee_source#0 | (𝕗) required_budget_with_buffer#0 | ensure_budget_after_while@7: retsub // @@ -782,463 +782,463 @@ ensure_budget_after_while@7: // examples.voting.voting.itoa(i: uint64) -> bytes: itoa: - proto 1 1 // (𝕡) i#0 | @subroutine\ndef itoa(i: UInt64) -> Bytes: voting/voting.py:253-254 + proto 1 1 // (𝕡) i#0 | @subroutine\ndef itoa(i: UInt64) -> Bytes: voting/voting.py:253-254 itoa_block@0: - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i < radix: voting/voting.py:257 - int 10 // (𝕡) i#0 | i#0,10 digits.length voting/voting.py:256 - < // (𝕡) i#0 | {<} i < radix: voting/voting.py:257 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) i#0 | tmp%0#0 i < radix: voting/voting.py:257 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) i#0 | tmp%0#0 if i < radix: voting/voting.py:257 - bz itoa_after_if_else@2 // (𝕡) i#0 | if i < radix: voting/voting.py:257 - // Implicit fall through to itoa_if_body@1 // (𝕡) i#0 | if i < radix: voting/voting.py:257 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i < radix: voting/voting.py:257 + int 10 // (𝕡) i#0 | i#0,10 digits.length voting/voting.py:256 + < // (𝕡) i#0 | {<} i < radix: voting/voting.py:257 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) i#0 | tmp%0#0 i < radix: voting/voting.py:257 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) i#0 | tmp%0#0 if i < radix: voting/voting.py:257 + bz itoa_after_if_else@2 // (𝕡) i#0 | if i < radix: voting/voting.py:257 + // Implicit fall through to itoa_if_body@1 // (𝕡) i#0 | if i < radix: voting/voting.py:257 itoa_if_body@1: - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 digits[i] voting/voting.py:258 - int 1 // (𝕡) i#0 | i#0,1 digits[i] voting/voting.py:258 - + // (𝕡) i#0 | {+} digits[i] voting/voting.py:258 - // virtual: store index_plus_1%1#0 to l-stack (no copy) (𝕡) i#0 | index_plus_1%1#0 digits[i] voting/voting.py:258 - byte "0123456789" // (𝕡) i#0 | index_plus_1%1#0,"0123456789" b"0123456789" voting/voting.py:255 - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | index_plus_1%1#0,"0123456789",i#0 digits[i] voting/voting.py:258 - uncover 2 // load index_plus_1%1#0 from l-stack (no copy) (𝕡) i#0 | "0123456789",i#0,index_plus_1%1#0 digits[i] voting/voting.py:258 - substring3 // (𝕡) i#0 | {substring3} digits[i] voting/voting.py:258 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) i#0 | tmp%2#0 digits[i] voting/voting.py:258 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) i#0 | tmp%2#0 return digits[i] voting/voting.py:258 - retsub // tmp%2#0 return digits[i] voting/voting.py:258 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 digits[i] voting/voting.py:258 + int 1 // (𝕡) i#0 | i#0,1 digits[i] voting/voting.py:258 + + // (𝕡) i#0 | {+} digits[i] voting/voting.py:258 + // virtual: store index_plus_1%1#0 to l-stack (no copy) (𝕡) i#0 | index_plus_1%1#0 digits[i] voting/voting.py:258 + byte "0123456789" // (𝕡) i#0 | index_plus_1%1#0,"0123456789" b"0123456789" voting/voting.py:255 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | index_plus_1%1#0,"0123456789",i#0 digits[i] voting/voting.py:258 + uncover 2 // load index_plus_1%1#0 from l-stack (no copy) (𝕡) i#0 | "0123456789",i#0,index_plus_1%1#0 digits[i] voting/voting.py:258 + substring3 // (𝕡) i#0 | {substring3} digits[i] voting/voting.py:258 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) i#0 | tmp%2#0 digits[i] voting/voting.py:258 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) i#0 | tmp%2#0 return digits[i] voting/voting.py:258 + retsub // tmp%2#0 return digits[i] voting/voting.py:258 itoa_after_if_else@2: - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i // radix voting/voting.py:259 - int 10 // (𝕡) i#0 | i#0,10 digits.length voting/voting.py:256 - / // (𝕡) i#0 | {/} i // radix voting/voting.py:259 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) i#0 | tmp%3#0 i // radix voting/voting.py:259 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) i#0 | tmp%3#0 itoa(i // radix) voting/voting.py:259 - callsub itoa // (𝕡) i#0 | {itoa} itoa(i // radix) voting/voting.py:259 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0 itoa(i // radix) voting/voting.py:259 - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | tmp%4#0,i#0 i % radix voting/voting.py:259 - int 10 // (𝕡) i#0 | tmp%4#0,i#0,10 digits.length voting/voting.py:256 - % // (𝕡) i#0 | tmp%4#0,{%} i % radix voting/voting.py:259 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0 i % radix voting/voting.py:259 - dup // load tmp%5#0 from l-stack (copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0 digits[i % radix] voting/voting.py:259 - int 1 // (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0,1 digits[i % radix] voting/voting.py:259 - + // (𝕡) i#0 | tmp%4#0,tmp%5#0,{+} digits[i % radix] voting/voting.py:259 - // virtual: store index_plus_1%6#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0 digits[i % radix] voting/voting.py:259 - byte "0123456789" // (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0,"0123456789" b"0123456789" voting/voting.py:255 - uncover 2 // load tmp%5#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,index_plus_1%6#0,"0123456789",tmp%5#0 digits[i % radix] voting/voting.py:259 - uncover 2 // load index_plus_1%6#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,"0123456789",tmp%5#0,index_plus_1%6#0 digits[i % radix] voting/voting.py:259 - substring3 // (𝕡) i#0 | tmp%4#0,{substring3} digits[i % radix] voting/voting.py:259 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 digits[i % radix] voting/voting.py:259 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) i#0 | tmp%7#0,tmp%4#0 itoa(i // radix) + digits[i % radix] voting/voting.py:259 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 itoa(i // radix) + digits[i % radix] voting/voting.py:259 - concat // (𝕡) i#0 | {concat} itoa(i // radix) + digits[i % radix] voting/voting.py:259 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) i#0 | tmp%8#0 itoa(i // radix) + digits[i % radix] voting/voting.py:259 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) i#0 | tmp%8#0 return itoa(i // radix) + digits[i % radix] voting/voting.py:259 - retsub // tmp%8#0 return itoa(i // radix) + digits[i % radix] voting/voting.py:259 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i // radix voting/voting.py:259 + int 10 // (𝕡) i#0 | i#0,10 digits.length voting/voting.py:256 + / // (𝕡) i#0 | {/} i // radix voting/voting.py:259 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) i#0 | tmp%3#0 i // radix voting/voting.py:259 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) i#0 | tmp%3#0 itoa(i // radix) voting/voting.py:259 + callsub itoa // (𝕡) i#0 | {itoa} itoa(i // radix) voting/voting.py:259 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0 itoa(i // radix) voting/voting.py:259 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | tmp%4#0,i#0 i % radix voting/voting.py:259 + int 10 // (𝕡) i#0 | tmp%4#0,i#0,10 digits.length voting/voting.py:256 + % // (𝕡) i#0 | tmp%4#0,{%} i % radix voting/voting.py:259 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0 i % radix voting/voting.py:259 + dup // load tmp%5#0 from l-stack (copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0 digits[i % radix] voting/voting.py:259 + int 1 // (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0,1 digits[i % radix] voting/voting.py:259 + + // (𝕡) i#0 | tmp%4#0,tmp%5#0,{+} digits[i % radix] voting/voting.py:259 + // virtual: store index_plus_1%6#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0 digits[i % radix] voting/voting.py:259 + byte "0123456789" // (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0,"0123456789" b"0123456789" voting/voting.py:255 + uncover 2 // load tmp%5#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,index_plus_1%6#0,"0123456789",tmp%5#0 digits[i % radix] voting/voting.py:259 + uncover 2 // load index_plus_1%6#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,"0123456789",tmp%5#0,index_plus_1%6#0 digits[i % radix] voting/voting.py:259 + substring3 // (𝕡) i#0 | tmp%4#0,{substring3} digits[i % radix] voting/voting.py:259 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 digits[i % radix] voting/voting.py:259 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) i#0 | tmp%7#0,tmp%4#0 itoa(i // radix) + digits[i % radix] voting/voting.py:259 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 itoa(i // radix) + digits[i % radix] voting/voting.py:259 + concat // (𝕡) i#0 | {concat} itoa(i // radix) + digits[i % radix] voting/voting.py:259 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) i#0 | tmp%8#0 itoa(i // radix) + digits[i % radix] voting/voting.py:259 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) i#0 | tmp%8#0 return itoa(i // radix) + digits[i % radix] voting/voting.py:259 + retsub // tmp%8#0 return itoa(i // radix) + digits[i % radix] voting/voting.py:259 // examples.voting.voting.get_vote_from_box(index: uint64) -> uint64: get_vote_from_box: - proto 1 1 // (𝕡) index#0 | @subroutine\ndef get_vote_from_box(index: UInt64) -> UInt64: voting/voting.py:238-239 + proto 1 1 // (𝕡) index#0 | @subroutine\ndef get_vote_from_box(index: UInt64) -> UInt64: voting/voting.py:238-239 get_vote_from_box_block@0: - byte "V" // (𝕡) index#0 | "V" TALLY_BOX_KEY voting/voting.py:240 - box_get // (𝕡) index#0 | {box_get}.0,{box_get}.1 op.Box.get(TALLY_BOX_KEY) voting/voting.py:240 - // virtual: store exists#0 to l-stack (no copy) (𝕡) index#0 | exists#0,{box_get}.0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:240 - // virtual: store box_data#0 to l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:240 - // virtual: load exists#0 from l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 assert exists, "Box not created" voting/voting.py:241 - assert // Box not created // (𝕡) index#0 | box_data#0 assert exists, "Box not created" voting/voting.py:241 - // virtual: load box_data#0 from l-stack (no copy) (𝕡) index#0 | box_data#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 - frame_dig -1 // load index#0 from parameters (𝕡) index#0 | box_data#0,index#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 - int 8 // (𝕡) index#0 | box_data#0,index#0,8 VOTE_COUNT_BYTES voting/voting.py:242 - extract3 // (𝕡) index#0 | {extract3} op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) index#0 | tmp%2#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) index#0 | tmp%2#0 op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 - btoi // (𝕡) index#0 | {btoi} op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) index#0 | tmp%3#0 op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) index#0 | tmp%3#0 return op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 - retsub // tmp%3#0 return op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 + byte "V" // (𝕡) index#0 | "V" TALLY_BOX_KEY voting/voting.py:240 + box_get // (𝕡) index#0 | {box_get}.0,{box_get}.1 op.Box.get(TALLY_BOX_KEY) voting/voting.py:240 + // virtual: store exists#0 to l-stack (no copy) (𝕡) index#0 | exists#0,{box_get}.0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:240 + // virtual: store box_data#0 to l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:240 + // virtual: load exists#0 from l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 assert exists, "Box not created" voting/voting.py:241 + assert // Box not created // (𝕡) index#0 | box_data#0 assert exists, "Box not created" voting/voting.py:241 + // virtual: load box_data#0 from l-stack (no copy) (𝕡) index#0 | box_data#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 + frame_dig -1 // load index#0 from parameters (𝕡) index#0 | box_data#0,index#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 + int 8 // (𝕡) index#0 | box_data#0,index#0,8 VOTE_COUNT_BYTES voting/voting.py:242 + extract3 // (𝕡) index#0 | {extract3} op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) index#0 | tmp%2#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:242 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) index#0 | tmp%2#0 op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 + btoi // (𝕡) index#0 | {btoi} op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) index#0 | tmp%3#0 op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) index#0 | tmp%3#0 return op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 + retsub // tmp%3#0 return op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:242 // examples.voting.voting.VotingRoundApp.get_preconditions(signature: bytes) -> bytes: get_preconditions: - proto 1 1 // (𝕡) signature#0 | @arc4.abimethod(readonly=True)\ndef get_preconditions(self, signature: arc4.DynamicBytes) -> Voti... voting/voting.py:157-158 + proto 1 1 // (𝕡) signature#0 | @arc4.abimethod(readonly=True)\ndef get_preconditions(self, signature: arc4.DynamicBytes) -> Voti... voting/voting.py:157-158 get_preconditions_block@0: - callsub voting_open // (𝕡) signature#0 | {voting_open} self.voting_open() voting/voting.py:160 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0 self.voting_open() voting/voting.py:160 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0 arc4.UInt64(self.voting_open()) voting/voting.py:160 - itob // (𝕡) signature#0 | {itob} arc4.UInt64(self.voting_open()) voting/voting.py:160 - // virtual: store val_as_bytes%1#0 to f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | arc4.UInt64(self.voting_open()) voting/voting.py:160 - frame_dig -1 // load signature#0 from parameters (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | signature#0 signature.bytes[2:] voting/voting.py:161 - len // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | {len} signature.bytes[2:] voting/voting.py:161 - dup // store awst_tmp%2#0 to l-stack (copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | awst_tmp%2#0,awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 - swap // store awst_tmp%2#0 to f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 - int 2 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | awst_tmp%2#0,2 2 voting/voting.py:161 - swap // load awst_tmp%2#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | 2,awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 - < // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {<} signature.bytes[2:] voting/voting.py:161 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%3#0 signature.bytes[2:] voting/voting.py:161 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%3#0 signature.bytes[2:] voting/voting.py:161 - bz get_preconditions_ternary_false@2 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature.bytes[2:] voting/voting.py:161 - // Implicit fall through to get_preconditions_ternary_true@1 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature.bytes[2:] voting/voting.py:161 + callsub voting_open // (𝕡) signature#0 | {voting_open} self.voting_open() voting/voting.py:160 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0 self.voting_open() voting/voting.py:160 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0 arc4.UInt64(self.voting_open()) voting/voting.py:160 + itob // (𝕡) signature#0 | {itob} arc4.UInt64(self.voting_open()) voting/voting.py:160 + // virtual: store val_as_bytes%1#0 to f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | arc4.UInt64(self.voting_open()) voting/voting.py:160 + frame_dig -1 // load signature#0 from parameters (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | signature#0 signature.bytes[2:] voting/voting.py:161 + len // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | {len} signature.bytes[2:] voting/voting.py:161 + dup // store awst_tmp%2#0 to l-stack (copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0 | awst_tmp%2#0,awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 + swap // store awst_tmp%2#0 to f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 + int 2 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | awst_tmp%2#0,2 2 voting/voting.py:161 + swap // load awst_tmp%2#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | 2,awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 + < // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {<} signature.bytes[2:] voting/voting.py:161 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%3#0 signature.bytes[2:] voting/voting.py:161 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%3#0 signature.bytes[2:] voting/voting.py:161 + bz get_preconditions_ternary_false@2 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature.bytes[2:] voting/voting.py:161 + // Implicit fall through to get_preconditions_ternary_true@1 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature.bytes[2:] voting/voting.py:161 get_preconditions_ternary_true@1: - int 2 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | 2 2 voting/voting.py:161 - // virtual: store ternary_result%4#0 to x-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | signature.bytes[2:] voting/voting.py:161 - b get_preconditions_ternary_merge@3 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | ternary_result%4#0 + int 2 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | 2 2 voting/voting.py:161 + // virtual: store ternary_result%4#0 to x-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | signature.bytes[2:] voting/voting.py:161 + b get_preconditions_ternary_merge@3 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | ternary_result%4#0 get_preconditions_ternary_false@2: - frame_dig 1 // load awst_tmp%2#0 from f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | awst_tmp%2#0 + frame_dig 1 // load awst_tmp%2#0 from f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | awst_tmp%2#0 // virtual: store ternary_result%4#0 to x-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | - // Implicit fall through to get_preconditions_ternary_merge@3 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | ternary_result%4#0 + // Implicit fall through to get_preconditions_ternary_merge@3 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | ternary_result%4#0 get_preconditions_ternary_merge@3: - frame_dig -1 // load signature#0 from parameters (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | signature#0 ternary_result%4#0 signature.bytes[2:] voting/voting.py:161 - swap // load ternary_result%4#0 from x-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature#0,ternary_result%4#0 signature.bytes[2:] voting/voting.py:161 - frame_dig 1 // load awst_tmp%2#0 from f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature#0,ternary_result%4#0,awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 - substring3 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {substring3} signature.bytes[2:] voting/voting.py:161 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%6#0 signature.bytes[2:] voting/voting.py:161 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%6#0 self.allowed_to_vote(signature.bytes[2:]) voting/voting.py:161 - callsub allowed_to_vote // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {allowed_to_vote} self.allowed_to_vote(signature.bytes[2:]) voting/voting.py:161 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%7#0 self.allowed_to_vote(signature.bytes[2:]) voting/voting.py:161 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%7#0 arc4.UInt64(self.allowed_to_vote(signature.bytes[2:])) voting/voting.py:161 - itob // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {itob} arc4.UInt64(self.allowed_to_vote(signature.bytes[2:])) voting/voting.py:161 - // virtual: store val_as_bytes%8#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0 arc4.UInt64(self.allowed_to_vote(signature.bytes[2:])) voting/voting.py:161 - callsub already_voted // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,{already_voted} self.already_voted() voting/voting.py:162 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,tmp%9#0 self.already_voted() voting/voting.py:162 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,tmp%9#0 arc4.UInt64(self.already_voted()) voting/voting.py:162 - itob // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,{itob} arc4.UInt64(self.already_voted()) voting/voting.py:162 - // virtual: store val_as_bytes%10#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0 arc4.UInt64(self.already_voted()) voting/voting.py:162 - global LatestTimestamp // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,{global} Global.latest_timestamp voting/voting.py:163 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,tmp%11#0 Global.latest_timestamp voting/voting.py:163 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,tmp%11#0 arc4.UInt64(Global.latest_timestamp) voting/voting.py:163 - itob // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,{itob} arc4.UInt64(Global.latest_timestamp) voting/voting.py:163 - // virtual: store val_as_bytes%12#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,val_as_bytes%12#0 arc4.UInt64(Global.latest_timestamp) voting/voting.py:163 - frame_dig 0 // load val_as_bytes%1#0 from f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,val_as_bytes%12#0,val_as_bytes%1#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - uncover 3 // load val_as_bytes%8#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,val_as_bytes%1#0,val_as_bytes%8#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - concat // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,{concat} VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - // virtual: store encoded_tuple_buffer%14#2 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - // virtual: load encoded_tuple_buffer%14#2 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - uncover 2 // load val_as_bytes%10#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,encoded_tuple_buffer%14#2,val_as_bytes%10#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - concat // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,{concat} VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - // virtual: store encoded_tuple_buffer%14#2 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - // virtual: load encoded_tuple_buffer%14#2 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - swap // load val_as_bytes%12#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | encoded_tuple_buffer%14#2,val_as_bytes%12#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - concat // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {concat} VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - // virtual: store encoded_tuple_buffer%14#2 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 - // virtual: load encoded_tuple_buffer%14#2 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | encoded_tuple_buffer%14#2 return VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=... voting/voting.py:159-164 + frame_dig -1 // load signature#0 from parameters (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | (𝕏) ternary_result%4#0 | signature#0 ternary_result%4#0 signature.bytes[2:] voting/voting.py:161 + swap // load ternary_result%4#0 from x-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature#0,ternary_result%4#0 signature.bytes[2:] voting/voting.py:161 + frame_dig 1 // load awst_tmp%2#0 from f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | signature#0,ternary_result%4#0,awst_tmp%2#0 signature.bytes[2:] voting/voting.py:161 + substring3 // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {substring3} signature.bytes[2:] voting/voting.py:161 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%6#0 signature.bytes[2:] voting/voting.py:161 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%6#0 self.allowed_to_vote(signature.bytes[2:]) voting/voting.py:161 + callsub allowed_to_vote // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {allowed_to_vote} self.allowed_to_vote(signature.bytes[2:]) voting/voting.py:161 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%7#0 self.allowed_to_vote(signature.bytes[2:]) voting/voting.py:161 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | tmp%7#0 arc4.UInt64(self.allowed_to_vote(signature.bytes[2:])) voting/voting.py:161 + itob // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {itob} arc4.UInt64(self.allowed_to_vote(signature.bytes[2:])) voting/voting.py:161 + // virtual: store val_as_bytes%8#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0 arc4.UInt64(self.allowed_to_vote(signature.bytes[2:])) voting/voting.py:161 + callsub already_voted // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,{already_voted} self.already_voted() voting/voting.py:162 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,tmp%9#0 self.already_voted() voting/voting.py:162 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,tmp%9#0 arc4.UInt64(self.already_voted()) voting/voting.py:162 + itob // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,{itob} arc4.UInt64(self.already_voted()) voting/voting.py:162 + // virtual: store val_as_bytes%10#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0 arc4.UInt64(self.already_voted()) voting/voting.py:162 + global LatestTimestamp // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,{global} Global.latest_timestamp voting/voting.py:163 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,tmp%11#0 Global.latest_timestamp voting/voting.py:163 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,tmp%11#0 arc4.UInt64(Global.latest_timestamp) voting/voting.py:163 + itob // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,{itob} arc4.UInt64(Global.latest_timestamp) voting/voting.py:163 + // virtual: store val_as_bytes%12#0 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,val_as_bytes%12#0 arc4.UInt64(Global.latest_timestamp) voting/voting.py:163 + frame_dig 0 // load val_as_bytes%1#0 from f-stack (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%8#0,val_as_bytes%10#0,val_as_bytes%12#0,val_as_bytes%1#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + uncover 3 // load val_as_bytes%8#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,val_as_bytes%1#0,val_as_bytes%8#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + concat // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,{concat} VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + // virtual: store encoded_tuple_buffer%14#2 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + // virtual: load encoded_tuple_buffer%14#2 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%10#0,val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + uncover 2 // load val_as_bytes%10#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,encoded_tuple_buffer%14#2,val_as_bytes%10#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + concat // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,{concat} VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + // virtual: store encoded_tuple_buffer%14#2 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + // virtual: load encoded_tuple_buffer%14#2 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | val_as_bytes%12#0,encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + swap // load val_as_bytes%12#0 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | encoded_tuple_buffer%14#2,val_as_bytes%12#0 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + concat // (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | {concat} VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + // virtual: store encoded_tuple_buffer%14#2 to l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | encoded_tuple_buffer%14#2 VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=arc4.UI... voting/voting.py:159-164 + // virtual: load encoded_tuple_buffer%14#2 from l-stack (no copy) (𝕡) signature#0 | (𝕗) val_as_bytes%1#0,awst_tmp%2#0 | encoded_tuple_buffer%14#2 return VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=... voting/voting.py:159-164 frame_bury 0 - retsub // encoded_tuple_buffer%14#2 return VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=... voting/voting.py:159-164 + retsub // encoded_tuple_buffer%14#2 return VotingPreconditions(\nis_voting_open=arc4.UInt64(self.voting_open()),\nis_allowed_to_vote=... voting/voting.py:159-164 // examples.voting.voting.VotingRoundApp.voting_open() -> uint64: voting_open: - proto 0 1 // @subroutine\ndef voting_open(self) -> bool: voting/voting.py:202-203 - byte "" // allocate 1 to stack (𝕗) awst_tmp%6#0 | + proto 0 1 // @subroutine\ndef voting_open(self) -> bool: voting/voting.py:202-203 + byte "" // allocate 1 to stack (𝕗) awst_tmp%6#0 | voting_open_block@0: - int 0 // (𝕗) awst_tmp%6#0 | 0 self.is_bootstrapped voting/voting.py:205 - byte "is_bootstrapped" // (𝕗) awst_tmp%6#0 | 0,"is_bootstrapped" self.is_bootstrapped voting/voting.py:205 - app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.is_bootstrapped voting/voting.py:205 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.is_bootstrapped voting/voting.py:205 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:205 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.is_bootstrapped voting/voting.py:205 - assert // check is_bootstrapped exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0 self.is_bootstrapped voting/voting.py:205 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%0#0 self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 - bz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 - // Implicit fall through to voting_open_and_contd@1 // (𝕗) awst_tmp%6#0 | self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 + int 0 // (𝕗) awst_tmp%6#0 | 0 self.is_bootstrapped voting/voting.py:205 + byte "is_bootstrapped" // (𝕗) awst_tmp%6#0 | 0,"is_bootstrapped" self.is_bootstrapped voting/voting.py:205 + app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.is_bootstrapped voting/voting.py:205 + // virtual: store is_bootstrapped_exists%1#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | is_bootstrapped_exists%1#0,{app_global_get_ex}.0 self.is_bootstrapped voting/voting.py:205 + // virtual: store is_bootstrapped_value%0#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | is_bootstrapped_value%0#0,is_bootstrapped_exists%1#0 self.is_bootstrapped voting/voting.py:205 + // virtual: load is_bootstrapped_exists%1#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | is_bootstrapped_value%0#0,is_bootstrapped_exists%1#0 self.is_bootstrapped voting/voting.py:205 + assert // check is_bootstrapped exists // (𝕗) awst_tmp%6#0 | is_bootstrapped_value%0#0 self.is_bootstrapped voting/voting.py:205 + // virtual: load is_bootstrapped_value%0#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | is_bootstrapped_value%0#0 self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 + bz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 + // Implicit fall through to voting_open_and_contd@1 // (𝕗) awst_tmp%6#0 | self.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_timestamp <= ... voting/voting.py:205-207 voting_open_and_contd@1: - int 0 // (𝕗) awst_tmp%6#0 | 0 not self.close_time voting/voting.py:206 - byte "close_time" // (𝕗) awst_tmp%6#0 | 0,"close_time" not self.close_time voting/voting.py:206 - app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.close_time voting/voting.py:206 - swap // store close_time_exists%3#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | close_time_exists%3#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:206 - pop // (𝕗) awst_tmp%6#0 | close_time_exists%3#0 not self.close_time voting/voting.py:206 - // virtual: load close_time_exists%3#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | close_time_exists%3#0 not self.close_time voting/voting.py:206 - bnz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | not self.close_time voting/voting.py:206 - // Implicit fall through to voting_open_and_contd@2 // (𝕗) awst_tmp%6#0 | not self.close_time voting/voting.py:206 + int 0 // (𝕗) awst_tmp%6#0 | 0 not self.close_time voting/voting.py:206 + byte "close_time" // (𝕗) awst_tmp%6#0 | 0,"close_time" not self.close_time voting/voting.py:206 + app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 not self.close_time voting/voting.py:206 + swap // store close_time_exists%3#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | close_time_exists%3#0,{app_global_get_ex}.0 not self.close_time voting/voting.py:206 + pop // (𝕗) awst_tmp%6#0 | close_time_exists%3#0 not self.close_time voting/voting.py:206 + // virtual: load close_time_exists%3#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | close_time_exists%3#0 not self.close_time voting/voting.py:206 + bnz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | not self.close_time voting/voting.py:206 + // Implicit fall through to voting_open_and_contd@2 // (𝕗) awst_tmp%6#0 | not self.close_time voting/voting.py:206 voting_open_and_contd@2: - int 0 // (𝕗) awst_tmp%6#0 | 0 self.start_time voting/voting.py:207 - byte "start_time" // (𝕗) awst_tmp%6#0 | 0,"start_time" self.start_time voting/voting.py:207 - app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.start_time voting/voting.py:207 - // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.start_time voting/voting.py:207 - // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.start_time voting/voting.py:207 - // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.start_time voting/voting.py:207 - assert // check start_time exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0 self.start_time voting/voting.py:207 - global LatestTimestamp // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,{global} Global.latest_timestamp voting/voting.py:207 - dup // store awst_tmp%6#0 to l-stack (copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,awst_tmp%6#0,awst_tmp%6#0 Global.latest_timestamp voting/voting.py:207 - frame_bury 0 // store awst_tmp%6#0 to f-stack (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,awst_tmp%6#0 Global.latest_timestamp voting/voting.py:207 - // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | awst_tmp%6#0,app_global_get_ex_value%4#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - // virtual: load awst_tmp%6#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%4#0,awst_tmp%6#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - <= // (𝕗) awst_tmp%6#0 | {<=} self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%7#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%7#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - bz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - // Implicit fall through to voting_open_and_contd@3 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + int 0 // (𝕗) awst_tmp%6#0 | 0 self.start_time voting/voting.py:207 + byte "start_time" // (𝕗) awst_tmp%6#0 | 0,"start_time" self.start_time voting/voting.py:207 + app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.start_time voting/voting.py:207 + // virtual: store start_time_exists%5#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | start_time_exists%5#0,{app_global_get_ex}.0 self.start_time voting/voting.py:207 + // virtual: store start_time_value%4#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | start_time_value%4#0,start_time_exists%5#0 self.start_time voting/voting.py:207 + // virtual: load start_time_exists%5#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | start_time_value%4#0,start_time_exists%5#0 self.start_time voting/voting.py:207 + assert // check start_time exists // (𝕗) awst_tmp%6#0 | start_time_value%4#0 self.start_time voting/voting.py:207 + global LatestTimestamp // (𝕗) awst_tmp%6#0 | start_time_value%4#0,{global} Global.latest_timestamp voting/voting.py:207 + dup // store awst_tmp%6#0 to l-stack (copy) (𝕗) awst_tmp%6#0 | start_time_value%4#0,awst_tmp%6#0,awst_tmp%6#0 Global.latest_timestamp voting/voting.py:207 + frame_bury 0 // store awst_tmp%6#0 to f-stack (𝕗) awst_tmp%6#0 | start_time_value%4#0,awst_tmp%6#0 Global.latest_timestamp voting/voting.py:207 + // virtual: load start_time_value%4#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | awst_tmp%6#0,start_time_value%4#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + // virtual: load awst_tmp%6#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | start_time_value%4#0,awst_tmp%6#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + <= // (𝕗) awst_tmp%6#0 | {<=} self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%7#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%7#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + bz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + // Implicit fall through to voting_open_and_contd@3 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 voting_open_and_contd@3: - int 0 // (𝕗) awst_tmp%6#0 | 0 self.end_time voting/voting.py:207 - byte "end_time" // (𝕗) awst_tmp%6#0 | 0,"end_time" self.end_time voting/voting.py:207 - app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.end_time voting/voting.py:207 - // virtual: store app_global_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_did_exist%9#0,{app_global_get_ex}.0 self.end_time voting/voting.py:207 - // virtual: store app_global_get_ex_value%8#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.end_time voting/voting.py:207 - // virtual: load app_global_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0,app_global_get_ex_did_exist%9#0 self.end_time voting/voting.py:207 - assert // check end_time exists // (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0 self.end_time voting/voting.py:207 - frame_dig 0 // load awst_tmp%6#0 from f-stack (𝕗) awst_tmp%6#0 | app_global_get_ex_value%8#0,awst_tmp%6#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 - swap // load app_global_get_ex_value%8#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | awst_tmp%6#0,app_global_get_ex_value%8#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 - <= // (𝕗) awst_tmp%6#0 | {<=} Global.latest_timestamp <= self.end_time voting/voting.py:207 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%10#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%10#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - bz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 - // Implicit fall through to voting_open_bool_true@4 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + int 0 // (𝕗) awst_tmp%6#0 | 0 self.end_time voting/voting.py:207 + byte "end_time" // (𝕗) awst_tmp%6#0 | 0,"end_time" self.end_time voting/voting.py:207 + app_global_get_ex // (𝕗) awst_tmp%6#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.end_time voting/voting.py:207 + // virtual: store end_time_exists%9#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | end_time_exists%9#0,{app_global_get_ex}.0 self.end_time voting/voting.py:207 + // virtual: store end_time_value%8#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | end_time_value%8#0,end_time_exists%9#0 self.end_time voting/voting.py:207 + // virtual: load end_time_exists%9#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | end_time_value%8#0,end_time_exists%9#0 self.end_time voting/voting.py:207 + assert // check end_time exists // (𝕗) awst_tmp%6#0 | end_time_value%8#0 self.end_time voting/voting.py:207 + frame_dig 0 // load awst_tmp%6#0 from f-stack (𝕗) awst_tmp%6#0 | end_time_value%8#0,awst_tmp%6#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 + swap // load end_time_value%8#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | awst_tmp%6#0,end_time_value%8#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 + <= // (𝕗) awst_tmp%6#0 | {<=} Global.latest_timestamp <= self.end_time voting/voting.py:207 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%10#0 Global.latest_timestamp <= self.end_time voting/voting.py:207 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) awst_tmp%6#0 | tmp%10#0 self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + bz voting_open_bool_false@5 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 + // Implicit fall through to voting_open_bool_true@4 // (𝕗) awst_tmp%6#0 | self.start_time <= Global.latest_timestamp <= self.end_time voting/voting.py:207 voting_open_bool_true@4: - int 1 // (𝕗) awst_tmp%6#0 | 1 + int 1 // (𝕗) awst_tmp%6#0 | 1 // virtual: store and_result%11#0 to x-stack (no copy) (𝕗) awst_tmp%6#0 | (𝕏) and_result%11#0 | - b voting_open_bool_merge@6 // (𝕗) awst_tmp%6#0 | (𝕏) and_result%11#0 | and_result%11#0 + b voting_open_bool_merge@6 // (𝕗) awst_tmp%6#0 | (𝕏) and_result%11#0 | and_result%11#0 voting_open_bool_false@5: - int 0 // (𝕗) awst_tmp%6#0 | 0 + int 0 // (𝕗) awst_tmp%6#0 | 0 // virtual: store and_result%11#0 to x-stack (no copy) (𝕗) awst_tmp%6#0 | (𝕏) and_result%11#0 | - // Implicit fall through to voting_open_bool_merge@6 // (𝕗) awst_tmp%6#0 | (𝕏) and_result%11#0 | and_result%11#0 + // Implicit fall through to voting_open_bool_merge@6 // (𝕗) awst_tmp%6#0 | (𝕏) and_result%11#0 | and_result%11#0 voting_open_bool_merge@6: - // virtual: load and_result%11#0 from x-stack (𝕗) awst_tmp%6#0 | and_result%11#0 and_result%11#0 return (\nself.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_tim... voting/voting.py:204-208 + // virtual: load and_result%11#0 from x-stack (𝕗) awst_tmp%6#0 | and_result%11#0 and_result%11#0 return (\nself.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_tim... voting/voting.py:204-208 swap - retsub // and_result%11#0 return (\nself.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_tim... voting/voting.py:204-208 + retsub // and_result%11#0 return (\nself.is_bootstrapped\nand not self.close_time\nand self.start_time <= Global.latest_tim... voting/voting.py:204-208 // examples.voting.voting.VotingRoundApp.allowed_to_vote(signature: bytes) -> uint64: allowed_to_vote: - proto 1 1 // (𝕡) signature#0 | @subroutine\ndef allowed_to_vote(self, signature: Bytes) -> bool: voting/voting.py:228-229 + proto 1 1 // (𝕡) signature#0 | @subroutine\ndef allowed_to_vote(self, signature: Bytes) -> bool: voting/voting.py:228-229 allowed_to_vote_block@0: - int 2000 // (𝕡) signature#0 | 2000 2000 voting/voting.py:230 - int 2 // (𝕡) signature#0 | 2000,2 ensure_budget(2000) voting/voting.py:230 - callsub ensure_budget // (𝕡) signature#0 | ensure_budget(2000) voting/voting.py:230 - txn Sender // (𝕡) signature#0 | {txn} Txn.sender voting/voting.py:232 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0 Txn.sender voting/voting.py:232 - int 0 // (𝕡) signature#0 | tmp%0#0,0 self.snapshot_public_key voting/voting.py:234 - byte "snapshot_public_key" // (𝕡) signature#0 | tmp%0#0,0,"snapshot_public_key" self.snapshot_public_key voting/voting.py:234 - app_global_get_ex // (𝕡) signature#0 | tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.snapshot_public_key voting/voting.py:234 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0,app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.snapshot_public_key voting/voting.py:234 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.snapshot_public_key voting/voting.py:234 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0,app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.snapshot_public_key voting/voting.py:234 - assert // check snapshot_public_key exists // (𝕡) signature#0 | tmp%0#0,app_global_get_ex_value%1#0 self.snapshot_public_key voting/voting.py:234 - swap // load tmp%0#0 from l-stack (no copy) (𝕡) signature#0 | app_global_get_ex_value%1#0,tmp%0#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 - frame_dig -1 // load signature#0 from parameters (𝕡) signature#0 | app_global_get_ex_value%1#0,tmp%0#0,signature#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 - uncover 2 // load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0,signature#0,app_global_get_ex_value%1#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 - ed25519verify_bare // (𝕡) signature#0 | {ed25519verify_bare} op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) signature#0 | tmp%3#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) signature#0 | tmp%3#0 return op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 - retsub // tmp%3#0 return op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 + int 2000 // (𝕡) signature#0 | 2000 2000 voting/voting.py:230 + int 2 // (𝕡) signature#0 | 2000,2 ensure_budget(2000) voting/voting.py:230 + callsub ensure_budget // (𝕡) signature#0 | ensure_budget(2000) voting/voting.py:230 + txn Sender // (𝕡) signature#0 | {txn} Txn.sender voting/voting.py:232 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0 Txn.sender voting/voting.py:232 + int 0 // (𝕡) signature#0 | tmp%0#0,0 self.snapshot_public_key voting/voting.py:234 + byte "snapshot_public_key" // (𝕡) signature#0 | tmp%0#0,0,"snapshot_public_key" self.snapshot_public_key voting/voting.py:234 + app_global_get_ex // (𝕡) signature#0 | tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.snapshot_public_key voting/voting.py:234 + // virtual: store snapshot_public_key_exists%2#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0,snapshot_public_key_exists%2#0,{app_global_get_ex}.0 self.snapshot_public_key voting/voting.py:234 + // virtual: store snapshot_public_key_value%1#0 to l-stack (no copy) (𝕡) signature#0 | tmp%0#0,snapshot_public_key_value%1#0,snapshot_public_key_exists%2#0 self.snapshot_public_key voting/voting.py:234 + // virtual: load snapshot_public_key_exists%2#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0,snapshot_public_key_value%1#0,snapshot_public_key_exists%2#0 self.snapshot_public_key voting/voting.py:234 + assert // check snapshot_public_key exists // (𝕡) signature#0 | tmp%0#0,snapshot_public_key_value%1#0 self.snapshot_public_key voting/voting.py:234 + swap // load tmp%0#0 from l-stack (no copy) (𝕡) signature#0 | snapshot_public_key_value%1#0,tmp%0#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 + frame_dig -1 // load signature#0 from parameters (𝕡) signature#0 | snapshot_public_key_value%1#0,tmp%0#0,signature#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 + uncover 2 // load snapshot_public_key_value%1#0 from l-stack (no copy) (𝕡) signature#0 | tmp%0#0,signature#0,snapshot_public_key_value%1#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 + ed25519verify_bare // (𝕡) signature#0 | {ed25519verify_bare} op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) signature#0 | tmp%3#0 op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) signature#0 | tmp%3#0 return op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 + retsub // tmp%3#0 return op.ed25519verify_bare(\nTxn.sender.bytes,\nsignature,\nself.snapshot_public_key,\n) voting/voting.py:231-235 // examples.voting.voting.VotingRoundApp.already_voted() -> uint64: already_voted: - proto 0 1 // @subroutine\ndef already_voted(self) -> bool: voting/voting.py:210-211 + proto 0 1 // @subroutine\ndef already_voted(self) -> bool: voting/voting.py:210-211 already_voted_block@0: - txn Sender // {txn} Txn.sender voting/voting.py:212 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender voting/voting.py:212 - // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 op.Box.get(Txn.sender.bytes) voting/voting.py:212 - box_get // {box_get}.0,{box_get}.1 op.Box.get(Txn.sender.bytes) voting/voting.py:212 - swap // store exists#0 to l-stack (no copy) exists#0,{box_get}.0 op.Box.get(Txn.sender.bytes) voting/voting.py:212 - pop // exists#0 op.Box.get(Txn.sender.bytes) voting/voting.py:212 - // virtual: load exists#0 from l-stack (no copy) exists#0 return exists voting/voting.py:213 - retsub // exists#0 return exists voting/voting.py:213 + txn Sender // {txn} Txn.sender voting/voting.py:212 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Txn.sender voting/voting.py:212 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 op.Box.get(Txn.sender.bytes) voting/voting.py:212 + box_get // {box_get}.0,{box_get}.1 op.Box.get(Txn.sender.bytes) voting/voting.py:212 + swap // store exists#0 to l-stack (no copy) exists#0,{box_get}.0 op.Box.get(Txn.sender.bytes) voting/voting.py:212 + pop // exists#0 op.Box.get(Txn.sender.bytes) voting/voting.py:212 + // virtual: load exists#0 from l-stack (no copy) exists#0 return exists voting/voting.py:213 + retsub // exists#0 return exists voting/voting.py:213 // examples.voting.voting.VotingRoundApp.vote(fund_min_bal_req: uint64, signature: bytes, answer_ids: bytes) -> void: vote: - proto 3 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | @arc4.abimethod\ndef vote(\nself,\nfund_min_bal_req: gtxn.PaymentTransaction,\nsignature: Bytes,\... voting/voting.py:166-172 + proto 3 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | @arc4.abimethod\ndef vote(\nself,\nfund_min_bal_req: gtxn.PaymentTransaction,\nsignature: Bytes,\... voting/voting.py:166-172 vote_block@0: - int 7700 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 7700 7700 voting/voting.py:173 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 7700,0 OpUpFeeSource.GroupCredit voting/voting.py:173 - callsub ensure_budget // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | ensure_budget(7700, fee_source=OpUpFeeSource.GroupCredit) voting/voting.py:173 - frame_dig -2 // load signature#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | signature#0 voting preconditions\nassert self.allowed_to_vote(signature) voting/voting.py:174-175 - callsub allowed_to_vote // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {allowed_to_vote} voting preconditions\nassert self.allowed_to_vote(signature) voting/voting.py:174-175 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%0#0 voting preconditions\nassert self.allowed_to_vote(signature) voting/voting.py:174-175 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%0#0 # Check voting preconditions\nassert self.allowed_to_vote(signature), "Not allowed to vote" voting/voting.py:174-175 - assert // Not allowed to vote // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | # Check voting preconditions\nassert self.allowed_to_vote(signature), "Not allowed to vote" voting/voting.py:174-175 - callsub voting_open // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {voting_open} self.voting_open() voting/voting.py:176 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%1#0 self.voting_open() voting/voting.py:176 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%1#0 assert self.voting_open(), "Voting not open" voting/voting.py:176 - assert // Voting not open // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | assert self.voting_open(), "Voting not open" voting/voting.py:176 - callsub already_voted // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {already_voted} self.already_voted() voting/voting.py:177 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%2#0 self.already_voted() voting/voting.py:177 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%2#0 not self.already_voted() voting/voting.py:177 - ! // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {!} not self.already_voted() voting/voting.py:177 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%3#0 not self.already_voted() voting/voting.py:177 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%3#0 assert not self.already_voted(), "Already voted" voting/voting.py:177 - assert // Already voted // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | assert not self.already_voted(), "Already voted" voting/voting.py:177 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 0 self.option_counts voting/voting.py:178 - byte "option_counts" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 0,"option_counts" self.option_counts voting/voting.py:178 - app_global_get_ex // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.option_counts voting/voting.py:178 - // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:178 - // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.option_counts voting/voting.py:178 - // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.option_counts voting/voting.py:178 - assert // check option_counts exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0 self.option_counts voting/voting.py:178 - // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0 questions_count = self.option_counts.length voting/voting.py:178 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | app_global_get_ex_value%4#0,0 self.option_counts.length voting/voting.py:178 - extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {extract_uint16} self.option_counts.length voting/voting.py:178 - dup // store questions_count#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | questions_count#0,questions_count#0 questions_count = self.option_counts.length voting/voting.py:178 - swap // store questions_count#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0 questions_count = self.option_counts.length voting/voting.py:178 - frame_dig -1 // load answer_ids#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,answer_ids#0 answer_ids.length voting/voting.py:179 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,answer_ids#0,0 answer_ids.length voting/voting.py:179 - extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,{extract_uint16} answer_ids.length voting/voting.py:179 - dup // store tmp%6#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,tmp%6#0,tmp%6#0 answer_ids.length voting/voting.py:179 - cover 2 // store tmp%6#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | questions_count#0,tmp%6#0 answer_ids.length voting/voting.py:179 - dup // load tmp%6#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | questions_count#0,tmp%6#0,tmp%6#0 answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 - uncover 2 // load questions_count#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,tmp%6#0,questions_count#0 answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 - == // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,{==} answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,tmp%7#0 answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,tmp%7#0 assert answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 - assert // Number of answers incorrect // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0 assert answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 - int 34 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,34 32 + 2 voting/voting.py:182 - swap // load tmp%6#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | 34,tmp%6#0 32 + 2 + VOTE_INDEX_BYTES * answer_ids.length voting/voting.py:182 - + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {+} 32 + 2 + VOTE_INDEX_BYTES * answer_ids.length voting/voting.py:182 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%10#0 32 + 2 + VOTE_INDEX_BYTES * answer_ids.length voting/voting.py:182 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%10#0 (32 + 2 + VOTE_INDEX_BYTES * answer_ids.length) * BOX_BYTE_MIN_BALANCE voting/voting.py:182 - int 400 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%10#0,400 BOX_BYTE_MIN_BALANCE voting/voting.py:182 - * // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {*} (32 + 2 + VOTE_INDEX_BYTES * answer_ids.length) * BOX_BYTE_MIN_BALANCE voting/voting.py:182 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%11#0 (32 + 2 + VOTE_INDEX_BYTES * answer_ids.length) * BOX_BYTE_MIN_BALANCE voting/voting.py:182 - int 2500 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%11#0,2500 box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE voting/voting.py:180-181 - swap // load tmp%11#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | 2500,tmp%11#0 # Check voter box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE + (\n(32 + 2 + VOTE_INDEX_BYTES *... voting/voting.py:180-183 - + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {+} box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE + (\n(32 + 2 + VOTE_INDEX_BYTES * answer_ids.le... voting/voting.py:180-183 - // virtual: store min_bal_req#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0 # Check voter box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE + (\n(32 + 2 + VOTE_INDEX_BYTES *... voting/voting.py:180-183 - frame_dig -3 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,fund_min_bal_req#0 fund_min_bal_req.receiver voting/voting.py:185 - gtxns Receiver // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{gtxns} fund_min_bal_req.receiver voting/voting.py:185 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0 fund_min_bal_req.receiver voting/voting.py:185 - global CurrentApplicationAddress // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0,{global} Global.current_application_address voting/voting.py:185 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0,tmp%13#0 Global.current_application_address voting/voting.py:185 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%13#0,tmp%12#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0,tmp%13#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 - == // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{==} fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%14#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%14#0 assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:184-186 - assert // Payment must be to app address // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0 assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:184-186 - dup // load min_bal_req#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,min_bal_req#0 min_bal_req voting/voting.py:188 - itob // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{itob} min_bal_req voting/voting.py:188 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%15#0 min_bal_req voting/voting.py:188 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%15#0 log(min_bal_req) voting/voting.py:188 - log // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0 log(min_bal_req) voting/voting.py:188 - frame_dig -3 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,fund_min_bal_req#0 fund_min_bal_req.amount voting/voting.py:189 - gtxns Amount // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{gtxns} fund_min_bal_req.amount voting/voting.py:189 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%16#0 fund_min_bal_req.amount voting/voting.py:189 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%16#0 fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 - swap // load min_bal_req#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%16#0,min_bal_req#0 fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 - == // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {==} fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%17#0 fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%17#0 assert fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 - assert // Payment must be the exact min balance // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | assert fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | 0 question\ncumulative_offset = UInt64(0 voting/voting.py:190-191 - // virtual: store cumulative_offset#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0 | # Record the vote for each question\ncumulative_offset = UInt64(0) voting/voting.py:190-191 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0 | 0 urange(questions_count) voting/voting.py:192 - // virtual: store range_item%18#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0 | range_item%18#0 question_index voting/voting.py:192 + int 7700 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 7700 7700 voting/voting.py:173 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 7700,0 OpUpFeeSource.GroupCredit voting/voting.py:173 + callsub ensure_budget // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | ensure_budget(7700, fee_source=OpUpFeeSource.GroupCredit) voting/voting.py:173 + frame_dig -2 // load signature#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | signature#0 voting preconditions\nassert self.allowed_to_vote(signature) voting/voting.py:174-175 + callsub allowed_to_vote // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {allowed_to_vote} voting preconditions\nassert self.allowed_to_vote(signature) voting/voting.py:174-175 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%0#0 voting preconditions\nassert self.allowed_to_vote(signature) voting/voting.py:174-175 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%0#0 # Check voting preconditions\nassert self.allowed_to_vote(signature), "Not allowed to vote" voting/voting.py:174-175 + assert // Not allowed to vote // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | # Check voting preconditions\nassert self.allowed_to_vote(signature), "Not allowed to vote" voting/voting.py:174-175 + callsub voting_open // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {voting_open} self.voting_open() voting/voting.py:176 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%1#0 self.voting_open() voting/voting.py:176 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%1#0 assert self.voting_open(), "Voting not open" voting/voting.py:176 + assert // Voting not open // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | assert self.voting_open(), "Voting not open" voting/voting.py:176 + callsub already_voted // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {already_voted} self.already_voted() voting/voting.py:177 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%2#0 self.already_voted() voting/voting.py:177 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%2#0 not self.already_voted() voting/voting.py:177 + ! // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {!} not self.already_voted() voting/voting.py:177 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%3#0 not self.already_voted() voting/voting.py:177 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | tmp%3#0 assert not self.already_voted(), "Already voted" voting/voting.py:177 + assert // Already voted // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | assert not self.already_voted(), "Already voted" voting/voting.py:177 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 0 self.option_counts voting/voting.py:178 + byte "option_counts" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | 0,"option_counts" self.option_counts voting/voting.py:178 + app_global_get_ex // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.option_counts voting/voting.py:178 + // virtual: store option_counts_exists%5#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | option_counts_exists%5#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:178 + // virtual: store option_counts_value%4#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | option_counts_value%4#0,option_counts_exists%5#0 self.option_counts voting/voting.py:178 + // virtual: load option_counts_exists%5#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | option_counts_value%4#0,option_counts_exists%5#0 self.option_counts voting/voting.py:178 + assert // check option_counts exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | option_counts_value%4#0 self.option_counts voting/voting.py:178 + // virtual: load option_counts_value%4#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | option_counts_value%4#0 questions_count = self.option_counts.length voting/voting.py:178 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | option_counts_value%4#0,0 self.option_counts.length voting/voting.py:178 + extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | {extract_uint16} self.option_counts.length voting/voting.py:178 + dup // store questions_count#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | questions_count#0,questions_count#0 questions_count = self.option_counts.length voting/voting.py:178 + swap // store questions_count#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0 questions_count = self.option_counts.length voting/voting.py:178 + frame_dig -1 // load answer_ids#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,answer_ids#0 answer_ids.length voting/voting.py:179 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,answer_ids#0,0 answer_ids.length voting/voting.py:179 + extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,{extract_uint16} answer_ids.length voting/voting.py:179 + dup // store tmp%6#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0 | questions_count#0,tmp%6#0,tmp%6#0 answer_ids.length voting/voting.py:179 + cover 2 // store tmp%6#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | questions_count#0,tmp%6#0 answer_ids.length voting/voting.py:179 + dup // load tmp%6#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | questions_count#0,tmp%6#0,tmp%6#0 answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 + uncover 2 // load questions_count#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,tmp%6#0,questions_count#0 answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 + == // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,{==} answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,tmp%7#0 answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,tmp%7#0 assert answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 + assert // Number of answers incorrect // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0 assert answer_ids.length == questions_count, "Number of answers incorrect" voting/voting.py:179 + int 34 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%6#0,34 32 + 2 voting/voting.py:182 + swap // load tmp%6#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | 34,tmp%6#0 32 + 2 + VOTE_INDEX_BYTES * answer_ids.length voting/voting.py:182 + + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {+} 32 + 2 + VOTE_INDEX_BYTES * answer_ids.length voting/voting.py:182 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%10#0 32 + 2 + VOTE_INDEX_BYTES * answer_ids.length voting/voting.py:182 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%10#0 (32 + 2 + VOTE_INDEX_BYTES * answer_ids.length) * BOX_BYTE_MIN_BALANCE voting/voting.py:182 + int 400 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%10#0,400 BOX_BYTE_MIN_BALANCE voting/voting.py:182 + * // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {*} (32 + 2 + VOTE_INDEX_BYTES * answer_ids.length) * BOX_BYTE_MIN_BALANCE voting/voting.py:182 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%11#0 (32 + 2 + VOTE_INDEX_BYTES * answer_ids.length) * BOX_BYTE_MIN_BALANCE voting/voting.py:182 + int 2500 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%11#0,2500 box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE voting/voting.py:180-181 + swap // load tmp%11#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | 2500,tmp%11#0 # Check voter box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE + (\n(32 + 2 + VOTE_INDEX_BYTES *... voting/voting.py:180-183 + + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {+} box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE + (\n(32 + 2 + VOTE_INDEX_BYTES * answer_ids.le... voting/voting.py:180-183 + // virtual: store min_bal_req#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0 # Check voter box is funded\nmin_bal_req = BOX_FLAT_MIN_BALANCE + (\n(32 + 2 + VOTE_INDEX_BYTES *... voting/voting.py:180-183 + frame_dig -3 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,fund_min_bal_req#0 fund_min_bal_req.receiver voting/voting.py:185 + gtxns Receiver // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{gtxns} fund_min_bal_req.receiver voting/voting.py:185 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0 fund_min_bal_req.receiver voting/voting.py:185 + global CurrentApplicationAddress // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0,{global} Global.current_application_address voting/voting.py:185 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0,tmp%13#0 Global.current_application_address voting/voting.py:185 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%13#0,tmp%12#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%12#0,tmp%13#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 + == // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{==} fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%14#0 fund_min_bal_req.receiver == Global.current_application_address voting/voting.py:185 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%14#0 assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:184-186 + assert // Payment must be to app address // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0 assert (\nfund_min_bal_req.receiver == Global.current_application_address\n), "Payment must be to... voting/voting.py:184-186 + dup // load min_bal_req#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,min_bal_req#0 min_bal_req voting/voting.py:188 + itob // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{itob} min_bal_req voting/voting.py:188 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%15#0 min_bal_req voting/voting.py:188 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%15#0 log(min_bal_req) voting/voting.py:188 + log // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0 log(min_bal_req) voting/voting.py:188 + frame_dig -3 // load fund_min_bal_req#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,fund_min_bal_req#0 fund_min_bal_req.amount voting/voting.py:189 + gtxns Amount // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,{gtxns} fund_min_bal_req.amount voting/voting.py:189 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%16#0 fund_min_bal_req.amount voting/voting.py:189 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | min_bal_req#0,tmp%16#0 fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 + swap // load min_bal_req#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%16#0,min_bal_req#0 fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 + == // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | {==} fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%17#0 fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | tmp%17#0 assert fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 + assert // Payment must be the exact min balance // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | assert fund_min_bal_req.amount == min_bal_req, "Payment must be the exact min balance" voting/voting.py:189 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0 | 0 question\ncumulative_offset = UInt64(0 voting/voting.py:190-191 + // virtual: store cumulative_offset#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0 | # Record the vote for each question\ncumulative_offset = UInt64(0) voting/voting.py:190-191 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0 | 0 urange(questions_count) voting/voting.py:192 + // virtual: store range_item%18#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0 | range_item%18#0 question_index voting/voting.py:192 // virtual: load range_item%18#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0 | range_item%18#0 // virtual: store question_index#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | - // Implicit fall through to vote_for_header@1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | + // Implicit fall through to vote_for_header@1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | vote_for_header@1: - frame_dig 3 // load question_index#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 urange(questions_count) voting/voting.py:192 - frame_dig 0 // load questions_count#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,questions_count#0 urange(questions_count) voting/voting.py:192 - < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | {<} urange(questions_count) voting/voting.py:192 - // virtual: store continue_looping%19#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | continue_looping%19#0 urange(questions_count) voting/voting.py:192 - // virtual: load continue_looping%19#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | continue_looping%19#0 for question_index in urange(questions_count): voting/voting.py:192 - bz vote_after_for@5 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | for question_index in urange(questions_count): voting/voting.py:192 - // Implicit fall through to vote_for_body@2 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | for question_index in urange(questions_count): voting/voting.py:192 + frame_dig 3 // load question_index#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 urange(questions_count) voting/voting.py:192 + frame_dig 0 // load questions_count#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,questions_count#0 urange(questions_count) voting/voting.py:192 + < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | {<} urange(questions_count) voting/voting.py:192 + // virtual: store continue_looping%19#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | continue_looping%19#0 urange(questions_count) voting/voting.py:192 + // virtual: load continue_looping%19#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | continue_looping%19#0 for question_index in urange(questions_count): voting/voting.py:192 + bz vote_after_for@5 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | for question_index in urange(questions_count): voting/voting.py:192 + // Implicit fall through to vote_for_body@2 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | for question_index in urange(questions_count): voting/voting.py:192 vote_for_body@2: - frame_dig 3 // load question_index#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - dup // store question_index#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - frame_dig 1 // load tmp%6#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,question_index#0,tmp%6#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{<} for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - // virtual: store index_is_in_bounds%21#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,index_is_in_bounds%21#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - // virtual: load index_is_in_bounds%21#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,index_is_in_bounds%21#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - assert // Index access is out of bounds // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - frame_dig -1 // load answer_ids#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,answer_ids#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - extract 2 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{extract} for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - // virtual: store array_data_sans_header%22#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - // virtual: load array_data_sans_header%22#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - dig 1 // load question_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0,question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0,question_index#0,1 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - extract3 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{extract3} for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%24#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%24#0 # Load the user's vote for this question\nanswer_option_index = answer_ids[question_index].decode() voting/voting.py:193-194 - btoi // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{btoi} for this question\nanswer_option_index = answer_ids[question_index].decode() voting/voting.py:193-194 - swap // store answer_option_index#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0 # Load the user's vote for this question\nanswer_option_index = answer_ids[question_index].decode() voting/voting.py:193-194 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,0 self.option_counts voting/voting.py:195 - byte "option_counts" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,0,"option_counts" self.option_counts voting/voting.py:195 - app_global_get_ex // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.option_counts voting/voting.py:195 - // virtual: store app_global_get_ex_did_exist%26#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_did_exist%26#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:195 - // virtual: store app_global_get_ex_value%25#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:195 - // virtual: load app_global_get_ex_did_exist%26#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_did_exist%26#0 self.option_counts voting/voting.py:195 - assert // check option_counts exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0 self.option_counts voting/voting.py:195 - dup // load app_global_get_ex_value%25#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_value%25#0 self.option_counts[question_index] voting/voting.py:195 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,app_global_get_ex_value%25#0,0 self.option_counts[question_index] voting/voting.py:195 - extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,{extract_uint16} self.option_counts[question_index] voting/voting.py:195 - // virtual: store array_length%27#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,array_length%27#0 self.option_counts[question_index] voting/voting.py:195 - dig 2 // load question_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,array_length%27#0,question_index#0 self.option_counts[question_index] voting/voting.py:195 - swap // load array_length%27#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,question_index#0,array_length%27#0 self.option_counts[question_index] voting/voting.py:195 - < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,{<} self.option_counts[question_index] voting/voting.py:195 - // virtual: store index_is_in_bounds%28#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,index_is_in_bounds%28#0 self.option_counts[question_index] voting/voting.py:195 - // virtual: load index_is_in_bounds%28#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0,index_is_in_bounds%28#0 self.option_counts[question_index] voting/voting.py:195 - assert // Index access is out of bounds // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0 self.option_counts[question_index] voting/voting.py:195 - // virtual: load app_global_get_ex_value%25#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,app_global_get_ex_value%25#0 self.option_counts[question_index] voting/voting.py:195 - extract 2 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{extract} self.option_counts[question_index] voting/voting.py:195 - // virtual: store array_data_sans_header%29#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0 self.option_counts[question_index] voting/voting.py:195 - // virtual: load array_data_sans_header%29#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0 self.option_counts[question_index] voting/voting.py:195 - dig 1 // load question_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0,question_index#0 self.option_counts[question_index] voting/voting.py:195 - int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0,question_index#0,1 self.option_counts[question_index] voting/voting.py:195 - extract3 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{extract3} self.option_counts[question_index] voting/voting.py:195 - // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,tmp%31#0 self.option_counts[question_index] voting/voting.py:195 - // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,tmp%31#0 options_count = self.option_counts[question_index].decode() voting/voting.py:195 - btoi // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{btoi} self.option_counts[question_index].decode() voting/voting.py:195 - // virtual: store options_count#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0 options_count = self.option_counts[question_index].decode() voting/voting.py:195 - dig 2 // load answer_option_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,answer_option_index#0 answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 - dig 1 // load options_count#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,answer_option_index#0,options_count#0 answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 - < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,{<} answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 - // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,tmp%32#0 answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 - // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,tmp%32#0 assert answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 - assert // Answer option index invalid // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0 assert answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 - frame_dig 2 // load cumulative_offset#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,cumulative_offset#0 cumulative_offset + answer_option_index voting/voting.py:197 - dup // store cumulative_offset#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,cumulative_offset#0,cumulative_offset#0 cumulative_offset + answer_option_index voting/voting.py:197 - uncover 4 // load answer_option_index#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,cumulative_offset#0,answer_option_index#0 cumulative_offset + answer_option_index voting/voting.py:197 - + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,{+} cumulative_offset + answer_option_index voting/voting.py:197 - // virtual: store tmp%33#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,tmp%33#0 cumulative_offset + answer_option_index voting/voting.py:197 - // virtual: load tmp%33#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,tmp%33#0 increment_vote_in_box(cumulative_offset + answer_option_index) voting/voting.py:197 - callsub increment_vote_in_box // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0 increment_vote_in_box(cumulative_offset + answer_option_index) voting/voting.py:197 - // virtual: load cumulative_offset#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0 cumulative_offset += options_count voting/voting.py:198 - swap // load options_count#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,cumulative_offset#0,options_count#0 cumulative_offset += options_count voting/voting.py:198 - + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{+} cumulative_offset += options_count voting/voting.py:198 - frame_bury 2 // store cumulative_offset#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 cumulative_offset += options_count voting/voting.py:198 - txn Sender // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{txn} Txn.sender voting/voting.py:199 - // virtual: store tmp%34#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%34#0 Txn.sender voting/voting.py:199 - // virtual: load tmp%34#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%34#0 op.Box.put(Txn.sender.bytes, answer_ids.bytes) voting/voting.py:199 - frame_dig -1 // load answer_ids#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%34#0,answer_ids#0 op.Box.put(Txn.sender.bytes, answer_ids.bytes) voting/voting.py:199 - box_put // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 op.Box.put(Txn.sender.bytes, answer_ids.bytes) voting/voting.py:199 - int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,0 self.voter_count voting/voting.py:200 - byte "voter_count" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,0,"voter_count" self.voter_count voting/voting.py:200 - app_global_get_ex // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.voter_count voting/voting.py:200 - // virtual: store app_global_get_ex_did_exist%36#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_did_exist%36#0,{app_global_get_ex}.0 self.voter_count voting/voting.py:200 - // virtual: store app_global_get_ex_value%35#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.voter_count voting/voting.py:200 - // virtual: load app_global_get_ex_did_exist%36#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.voter_count voting/voting.py:200 - assert // check voter_count exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0 self.voter_count voting/voting.py:200 - // virtual: load app_global_get_ex_value%35#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0 self.voter_count += 1 voting/voting.py:200 - int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,app_global_get_ex_value%35#0,1 1 voting/voting.py:200 - + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{+} self.voter_count += 1 voting/voting.py:200 - // virtual: store new_state_value%37#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,new_state_value%37#0 self.voter_count += 1 voting/voting.py:200 - byte "voter_count" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,new_state_value%37#0,"voter_count" self.voter_count voting/voting.py:200 - swap // load new_state_value%37#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,"voter_count",new_state_value%37#0 self.voter_count += 1 voting/voting.py:200 - app_global_put // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 self.voter_count += 1 voting/voting.py:200 - // virtual: load question_index#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 for question_index in urange(questions_count): voting/voting.py:192 - int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,1 urange(questions_count) voting/voting.py:192 - + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | {+} urange(questions_count) voting/voting.py:192 - // virtual: store range_item%18#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | range_item%18#0 for question_index in urange(questions_count): voting/voting.py:192 + frame_dig 3 // load question_index#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + dup // store question_index#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + frame_dig 1 // load tmp%6#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,question_index#0,tmp%6#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{<} for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + // virtual: store index_is_in_bounds%21#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,index_is_in_bounds%21#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + // virtual: load index_is_in_bounds%21#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,index_is_in_bounds%21#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + assert // Index access is out of bounds // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + frame_dig -1 // load answer_ids#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,answer_ids#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + extract 2 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{extract} for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + // virtual: store array_data_sans_header%22#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + // virtual: load array_data_sans_header%22#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + dig 1 // load question_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0,question_index#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,array_data_sans_header%22#0,question_index#0,1 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + extract3 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{extract3} for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%24#0 for this question\nanswer_option_index = answer_ids[question_index] voting/voting.py:193-194 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%24#0 # Load the user's vote for this question\nanswer_option_index = answer_ids[question_index].decode() voting/voting.py:193-194 + btoi // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{btoi} for this question\nanswer_option_index = answer_ids[question_index].decode() voting/voting.py:193-194 + swap // store answer_option_index#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0 # Load the user's vote for this question\nanswer_option_index = answer_ids[question_index].decode() voting/voting.py:193-194 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,0 self.option_counts voting/voting.py:195 + byte "option_counts" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,0,"option_counts" self.option_counts voting/voting.py:195 + app_global_get_ex // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.option_counts voting/voting.py:195 + // virtual: store option_counts_exists%26#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_exists%26#0,{app_global_get_ex}.0 self.option_counts voting/voting.py:195 + // virtual: store option_counts_value%25#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,option_counts_exists%26#0 self.option_counts voting/voting.py:195 + // virtual: load option_counts_exists%26#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,option_counts_exists%26#0 self.option_counts voting/voting.py:195 + assert // check option_counts exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0 self.option_counts voting/voting.py:195 + dup // load option_counts_value%25#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,option_counts_value%25#0 self.option_counts[question_index] voting/voting.py:195 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,option_counts_value%25#0,0 self.option_counts[question_index] voting/voting.py:195 + extract_uint16 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,{extract_uint16} self.option_counts[question_index] voting/voting.py:195 + // virtual: store array_length%27#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,array_length%27#0 self.option_counts[question_index] voting/voting.py:195 + dig 2 // load question_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,array_length%27#0,question_index#0 self.option_counts[question_index] voting/voting.py:195 + swap // load array_length%27#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,question_index#0,array_length%27#0 self.option_counts[question_index] voting/voting.py:195 + < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,{<} self.option_counts[question_index] voting/voting.py:195 + // virtual: store index_is_in_bounds%28#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,index_is_in_bounds%28#0 self.option_counts[question_index] voting/voting.py:195 + // virtual: load index_is_in_bounds%28#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0,index_is_in_bounds%28#0 self.option_counts[question_index] voting/voting.py:195 + assert // Index access is out of bounds // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0 self.option_counts[question_index] voting/voting.py:195 + // virtual: load option_counts_value%25#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,option_counts_value%25#0 self.option_counts[question_index] voting/voting.py:195 + extract 2 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{extract} self.option_counts[question_index] voting/voting.py:195 + // virtual: store array_data_sans_header%29#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0 self.option_counts[question_index] voting/voting.py:195 + // virtual: load array_data_sans_header%29#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0 self.option_counts[question_index] voting/voting.py:195 + dig 1 // load question_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0,question_index#0 self.option_counts[question_index] voting/voting.py:195 + int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,array_data_sans_header%29#0,question_index#0,1 self.option_counts[question_index] voting/voting.py:195 + extract3 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{extract3} self.option_counts[question_index] voting/voting.py:195 + // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,tmp%31#0 self.option_counts[question_index] voting/voting.py:195 + // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,tmp%31#0 options_count = self.option_counts[question_index].decode() voting/voting.py:195 + btoi // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,{btoi} self.option_counts[question_index].decode() voting/voting.py:195 + // virtual: store options_count#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0 options_count = self.option_counts[question_index].decode() voting/voting.py:195 + dig 2 // load answer_option_index#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,answer_option_index#0 answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 + dig 1 // load options_count#0 from l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,answer_option_index#0,options_count#0 answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 + < // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,{<} answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 + // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,tmp%32#0 answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 + // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,tmp%32#0 assert answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 + assert // Answer option index invalid // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0 assert answer_option_index < options_count, "Answer option index invalid" voting/voting.py:196 + frame_dig 2 // load cumulative_offset#0 from f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,cumulative_offset#0 cumulative_offset + answer_option_index voting/voting.py:197 + dup // store cumulative_offset#0 to l-stack (copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | answer_option_index#0,question_index#0,options_count#0,cumulative_offset#0,cumulative_offset#0 cumulative_offset + answer_option_index voting/voting.py:197 + uncover 4 // load answer_option_index#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,cumulative_offset#0,answer_option_index#0 cumulative_offset + answer_option_index voting/voting.py:197 + + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,{+} cumulative_offset + answer_option_index voting/voting.py:197 + // virtual: store tmp%33#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,tmp%33#0 cumulative_offset + answer_option_index voting/voting.py:197 + // virtual: load tmp%33#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0,tmp%33#0 increment_vote_in_box(cumulative_offset + answer_option_index) voting/voting.py:197 + callsub increment_vote_in_box // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0 increment_vote_in_box(cumulative_offset + answer_option_index) voting/voting.py:197 + // virtual: load cumulative_offset#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,options_count#0,cumulative_offset#0 cumulative_offset += options_count voting/voting.py:198 + swap // load options_count#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,cumulative_offset#0,options_count#0 cumulative_offset += options_count voting/voting.py:198 + + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{+} cumulative_offset += options_count voting/voting.py:198 + frame_bury 2 // store cumulative_offset#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 cumulative_offset += options_count voting/voting.py:198 + txn Sender // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{txn} Txn.sender voting/voting.py:199 + // virtual: store tmp%34#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%34#0 Txn.sender voting/voting.py:199 + // virtual: load tmp%34#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%34#0 op.Box.put(Txn.sender.bytes, answer_ids.bytes) voting/voting.py:199 + frame_dig -1 // load answer_ids#0 from parameters (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,tmp%34#0,answer_ids#0 op.Box.put(Txn.sender.bytes, answer_ids.bytes) voting/voting.py:199 + box_put // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 op.Box.put(Txn.sender.bytes, answer_ids.bytes) voting/voting.py:199 + int 0 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,0 self.voter_count voting/voting.py:200 + byte "voter_count" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,0,"voter_count" self.voter_count voting/voting.py:200 + app_global_get_ex // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.voter_count voting/voting.py:200 + // virtual: store voter_count_exists%36#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,voter_count_exists%36#0,{app_global_get_ex}.0 self.voter_count voting/voting.py:200 + // virtual: store voter_count_value%35#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,voter_count_value%35#0,voter_count_exists%36#0 self.voter_count voting/voting.py:200 + // virtual: load voter_count_exists%36#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,voter_count_value%35#0,voter_count_exists%36#0 self.voter_count voting/voting.py:200 + assert // check voter_count exists // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,voter_count_value%35#0 self.voter_count voting/voting.py:200 + // virtual: load voter_count_value%35#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,voter_count_value%35#0 self.voter_count += 1 voting/voting.py:200 + int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,voter_count_value%35#0,1 1 voting/voting.py:200 + + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,{+} self.voter_count += 1 voting/voting.py:200 + // virtual: store new_state_value%37#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,new_state_value%37#0 self.voter_count += 1 voting/voting.py:200 + byte "voter_count" // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,new_state_value%37#0,"voter_count" self.voter_count voting/voting.py:200 + swap // load new_state_value%37#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,"voter_count",new_state_value%37#0 self.voter_count += 1 voting/voting.py:200 + app_global_put // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 self.voter_count += 1 voting/voting.py:200 + // virtual: load question_index#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0 for question_index in urange(questions_count): voting/voting.py:192 + int 1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | question_index#0,1 urange(questions_count) voting/voting.py:192 + + // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | {+} urange(questions_count) voting/voting.py:192 + // virtual: store range_item%18#0 to l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | range_item%18#0 for question_index in urange(questions_count): voting/voting.py:192 // virtual: load range_item%18#0 from l-stack (no copy) (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | range_item%18#0 - frame_bury 3 // store question_index#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | - b vote_for_header@1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | + frame_bury 3 // store question_index#0 to f-stack (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | + b vote_for_header@1 // (𝕡) fund_min_bal_req#0,signature#0,answer_ids#0 | (𝕗) questions_count#0,tmp%6#0,cumulative_offset#0,question_index#0 | vote_after_for@5: retsub // @@ -1246,47 +1246,47 @@ vote_after_for@5: // examples.voting.voting.increment_vote_in_box(index: uint64) -> void: increment_vote_in_box: - proto 1 0 // (𝕡) index#0 | @subroutine\ndef increment_vote_in_box(index: UInt64) -> None: voting/voting.py:245-246 + proto 1 0 // (𝕡) index#0 | @subroutine\ndef increment_vote_in_box(index: UInt64) -> None: voting/voting.py:245-246 increment_vote_in_box_block@0: - byte "V" // (𝕡) index#0 | "V" TALLY_BOX_KEY voting/voting.py:247 - box_get // (𝕡) index#0 | {box_get}.0,{box_get}.1 op.Box.get(TALLY_BOX_KEY) voting/voting.py:247 - // virtual: store exists#0 to l-stack (no copy) (𝕡) index#0 | exists#0,{box_get}.0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:247 - // virtual: store box_data#0 to l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:247 - // virtual: load exists#0 from l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 assert exists, "Box not created" voting/voting.py:248 - assert // Box not created // (𝕡) index#0 | box_data#0 assert exists, "Box not created" voting/voting.py:248 - // virtual: load box_data#0 from l-stack (no copy) (𝕡) index#0 | box_data#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 - frame_dig -1 // load index#0 from parameters (𝕡) index#0 | box_data#0,index#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 - int 8 // (𝕡) index#0 | box_data#0,index#0,8 VOTE_COUNT_BYTES voting/voting.py:249 - extract3 // (𝕡) index#0 | {extract3} op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) index#0 | tmp%2#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) index#0 | tmp%2#0 current_vote = op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:249 - btoi // (𝕡) index#0 | {btoi} op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:249 - // virtual: store current_vote#0 to l-stack (no copy) (𝕡) index#0 | current_vote#0 current_vote = op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:249 - // virtual: load current_vote#0 from l-stack (no copy) (𝕡) index#0 | current_vote#0 current_vote + 1 voting/voting.py:250 - int 1 // (𝕡) index#0 | current_vote#0,1 1 voting/voting.py:250 - + // (𝕡) index#0 | {+} current_vote + 1 voting/voting.py:250 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) index#0 | tmp%3#0 current_vote + 1 voting/voting.py:250 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) index#0 | tmp%3#0 op.itob(current_vote + 1) voting/voting.py:250 - itob // (𝕡) index#0 | {itob} op.itob(current_vote + 1) voting/voting.py:250 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) index#0 | tmp%4#0 op.itob(current_vote + 1) voting/voting.py:250 - byte "V" // (𝕡) index#0 | tmp%4#0,"V" TALLY_BOX_KEY voting/voting.py:250 - frame_dig -1 // load index#0 from parameters (𝕡) index#0 | tmp%4#0,"V",index#0 op.Box.replace(TALLY_BOX_KEY, index, op.itob(current_vote + 1)) voting/voting.py:250 - uncover 2 // load tmp%4#0 from l-stack (no copy) (𝕡) index#0 | "V",index#0,tmp%4#0 op.Box.replace(TALLY_BOX_KEY, index, op.itob(current_vote + 1)) voting/voting.py:250 - box_replace // (𝕡) index#0 | op.Box.replace(TALLY_BOX_KEY, index, op.itob(current_vote + 1)) voting/voting.py:250 + byte "V" // (𝕡) index#0 | "V" TALLY_BOX_KEY voting/voting.py:247 + box_get // (𝕡) index#0 | {box_get}.0,{box_get}.1 op.Box.get(TALLY_BOX_KEY) voting/voting.py:247 + // virtual: store exists#0 to l-stack (no copy) (𝕡) index#0 | exists#0,{box_get}.0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:247 + // virtual: store box_data#0 to l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 op.Box.get(TALLY_BOX_KEY) voting/voting.py:247 + // virtual: load exists#0 from l-stack (no copy) (𝕡) index#0 | box_data#0,exists#0 assert exists, "Box not created" voting/voting.py:248 + assert // Box not created // (𝕡) index#0 | box_data#0 assert exists, "Box not created" voting/voting.py:248 + // virtual: load box_data#0 from l-stack (no copy) (𝕡) index#0 | box_data#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 + frame_dig -1 // load index#0 from parameters (𝕡) index#0 | box_data#0,index#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 + int 8 // (𝕡) index#0 | box_data#0,index#0,8 VOTE_COUNT_BYTES voting/voting.py:249 + extract3 // (𝕡) index#0 | {extract3} op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) index#0 | tmp%2#0 op.extract(box_data, index, VOTE_COUNT_BYTES) voting/voting.py:249 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) index#0 | tmp%2#0 current_vote = op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:249 + btoi // (𝕡) index#0 | {btoi} op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:249 + // virtual: store current_vote#0 to l-stack (no copy) (𝕡) index#0 | current_vote#0 current_vote = op.btoi(op.extract(box_data, index, VOTE_COUNT_BYTES)) voting/voting.py:249 + // virtual: load current_vote#0 from l-stack (no copy) (𝕡) index#0 | current_vote#0 current_vote + 1 voting/voting.py:250 + int 1 // (𝕡) index#0 | current_vote#0,1 1 voting/voting.py:250 + + // (𝕡) index#0 | {+} current_vote + 1 voting/voting.py:250 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) index#0 | tmp%3#0 current_vote + 1 voting/voting.py:250 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) index#0 | tmp%3#0 op.itob(current_vote + 1) voting/voting.py:250 + itob // (𝕡) index#0 | {itob} op.itob(current_vote + 1) voting/voting.py:250 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) index#0 | tmp%4#0 op.itob(current_vote + 1) voting/voting.py:250 + byte "V" // (𝕡) index#0 | tmp%4#0,"V" TALLY_BOX_KEY voting/voting.py:250 + frame_dig -1 // load index#0 from parameters (𝕡) index#0 | tmp%4#0,"V",index#0 op.Box.replace(TALLY_BOX_KEY, index, op.itob(current_vote + 1)) voting/voting.py:250 + uncover 2 // load tmp%4#0 from l-stack (no copy) (𝕡) index#0 | "V",index#0,tmp%4#0 op.Box.replace(TALLY_BOX_KEY, index, op.itob(current_vote + 1)) voting/voting.py:250 + box_replace // (𝕡) index#0 | op.Box.replace(TALLY_BOX_KEY, index, op.itob(current_vote + 1)) voting/voting.py:250 retsub // // examples.voting.voting.VotingRoundApp.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: voting/voting.py:49 + proto 0 0 // def __init__(self) -> None: voting/voting.py:49 __init___block@0: - byte "is_bootstrapped" // "is_bootstrapped" self.is_bootstrapped voting/voting.py:50 - int 0 // "is_bootstrapped",0 False voting/voting.py:50 - app_global_put // self.is_bootstrapped = False voting/voting.py:50 - byte "voter_count" // "voter_count" # The minimum number of voters who have voted\nself.voter_count voting/voting.py:51-52 - int 0 // "voter_count",0 ters who have voted\nself.voter_count = UInt64(0 voting/voting.py:51-52 - app_global_put // # The minimum number of voters who have voted\nself.voter_count = UInt64(0) voting/voting.py:51-52 + byte "is_bootstrapped" // "is_bootstrapped" self.is_bootstrapped voting/voting.py:50 + int 0 // "is_bootstrapped",0 False voting/voting.py:50 + app_global_put // self.is_bootstrapped = False voting/voting.py:50 + byte "voter_count" // "voter_count" # The minimum number of voters who have voted\nself.voter_count voting/voting.py:51-52 + int 0 // "voter_count",0 ters who have voted\nself.voter_count = UInt64(0 voting/voting.py:51-52 + app_global_put // # The minimum number of voters who have voted\nself.voter_count = UInt64(0) voting/voting.py:51-52 retsub // diff --git a/examples/voting/out/VotingRoundApp.destructured.ir b/examples/voting/out/VotingRoundApp.destructured.ir index d477a4f0a4..5a110877bf 100644 --- a/examples/voting/out/VotingRoundApp.destructured.ir +++ b/examples/voting/out/VotingRoundApp.destructured.ir @@ -128,18 +128,18 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + let tmp%2#0: uint64 = (! is_bootstrapped_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) let tmp%3#0: bytes = ((gtxns Receiver) fund_min_bal_req#0) let tmp%4#0: bytes = (global CurrentApplicationAddress) let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check total_options exists - let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) + let (total_options_value%6#0: uint64, total_options_exists%7#0: uint64) = (app_global_get_ex 0u "total_options") + (assert total_options_exists%7#0) // check total_options exists + let tally_box_size#0: uint64 = (* total_options_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) let tmp%9#0: bytes = (itob min_balance_req#0) @@ -159,33 +159,33 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check vote_id exists - let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) + let (vote_id_value%4#0: bytes, vote_id_exists%5#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%5#0) // check vote_id exists + let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " vote_id_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists - let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) + let (metadata_ipfs_cid_value%8#0: bytes, metadata_ipfs_cid_exists%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") + (assert metadata_ipfs_cid_exists%9#0) // check metadata_ipfs_cid exists + let tmp%10#0: bytes = (concat tmp%7#0 metadata_ipfs_cid_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") - let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check vote_id exists - let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) + let (vote_id_value%12#0: bytes, vote_id_exists%13#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%13#0) // check vote_id exists + let tmp%14#0: bytes = (concat tmp%11#0 vote_id_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check quorum exists - let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) + let (quorum_value%16#0: uint64, quorum_exists%17#0: uint64) = (app_global_get_ex 0u "quorum") + (assert quorum_exists%17#0) // check quorum exists + let tmp%18#0: bytes = examples.voting.voting.itoa(quorum_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") - let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check voter_count exists - let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) + let (voter_count_value%21#0: uint64, voter_count_exists%22#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%22#0) // check voter_count exists + let tmp%23#0: bytes = examples.voting.voting.itoa(voter_count_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) - let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) + let array_value%28#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index_internal%29#0: uint64 = 0u let question_index#0: uint64 = item_index_internal%29#0 goto block@1 @@ -247,12 +247,12 @@ contract examples.voting.voting.VotingRoundApp: block@15: // after_for_L129 let note#0: bytes = (concat note#0 "]}}") itxn_begin - let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check vote_id exists - let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) - let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists - ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) + let (vote_id_value%41#0: bytes, vote_id_exists%42#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%42#0) // check vote_id exists + let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " vote_id_value%41#0) + let (nft_image_url_value%43#0: bytes, nft_image_url_exists%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") + (assert nft_image_url_exists%44#0) // check nft_image_url exists + ((itxn_field ConfigAssetURL) nft_image_url_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) ((itxn_field ConfigAssetTotal) 1u) @@ -346,22 +346,22 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - goto app_global_get_ex_value%0#0 ? block@1 : block@5 + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + goto is_bootstrapped_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check start_time exists + let (start_time_value%4#0: uint64, start_time_exists%5#0: uint64) = (app_global_get_ex 0u "start_time") + (assert start_time_exists%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) - let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) + let tmp%7#0: uint64 = (<= start_time_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check end_time exists - let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) + let (end_time_value%8#0: uint64, end_time_exists%9#0: uint64) = (app_global_get_ex 0u "end_time") + (assert end_time_exists%9#0) // check end_time exists + let tmp%10#0: uint64 = (<= awst_tmp%6#0 end_time_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 let and_result%11#0: uint64 = 1u @@ -376,9 +376,9 @@ contract examples.voting.voting.VotingRoundApp: block@0: // L228 puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists - let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) + let (snapshot_public_key_value%1#0: bytes, snapshot_public_key_exists%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") + (assert snapshot_public_key_exists%2#0) // check snapshot_public_key exists + let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 snapshot_public_key_value%1#0) return tmp%3#0 subroutine examples.voting.voting.VotingRoundApp.already_voted() -> uint64: @@ -397,9 +397,9 @@ contract examples.voting.voting.VotingRoundApp: let tmp%2#0: uint64 = examples.voting.voting.VotingRoundApp.already_voted() let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check option_counts exists - let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) + let (option_counts_value%4#0: bytes, option_counts_exists%5#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%5#0) // check option_counts exists + let questions_count#0: uint64 = (extract_uint16 option_counts_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) (assert tmp%7#0) // Number of answers incorrect @@ -428,12 +428,12 @@ contract examples.voting.voting.VotingRoundApp: let array_data_sans_header%22#0: bytes = ((extract 2 0) answer_ids#0) let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds - let array_data_sans_header%29#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let array_data_sans_header%29#0: bytes = ((extract 2 0) option_counts_value%25#0) let tmp%31#0: bytes = (extract3 array_data_sans_header%29#0 question_index#0 1u) let options_count#0: uint64 = (btoi tmp%31#0) let tmp%32#0: uint64 = (< answer_option_index#0 options_count#0) @@ -443,9 +443,9 @@ contract examples.voting.voting.VotingRoundApp: let cumulative_offset#0: uint64 = (+ cumulative_offset#0 options_count#0) let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check voter_count exists - let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) + let (voter_count_value%35#0: uint64, voter_count_exists%36#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%36#0) // check voter_count exists + let new_state_value%37#0: uint64 = (+ voter_count_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#0: uint64 = (+ question_index#0 1u) let question_index#0: uint64 = range_item%18#0 diff --git a/examples/voting/out/VotingRoundApp.ssa.ir b/examples/voting/out/VotingRoundApp.ssa.ir index 98b31846a6..6461a4b5ee 100644 --- a/examples/voting/out/VotingRoundApp.ssa.ir +++ b/examples/voting/out/VotingRoundApp.ssa.ir @@ -142,18 +142,18 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + let tmp%2#0: uint64 = (! is_bootstrapped_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) let tmp%3#0: bytes = ((gtxns Receiver) fund_min_bal_req#0) let tmp%4#0: bytes = (global CurrentApplicationAddress) let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check total_options exists - let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) + let (total_options_value%6#0: uint64, total_options_exists%7#0: uint64) = (app_global_get_ex 0u "total_options") + (assert total_options_exists%7#0) // check total_options exists + let tally_box_size#0: uint64 = (* total_options_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) let tmp%9#0: bytes = (itob min_balance_req#0) @@ -173,33 +173,33 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check vote_id exists - let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) + let (vote_id_value%4#0: bytes, vote_id_exists%5#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%5#0) // check vote_id exists + let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " vote_id_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists - let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) + let (metadata_ipfs_cid_value%8#0: bytes, metadata_ipfs_cid_exists%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") + (assert metadata_ipfs_cid_exists%9#0) // check metadata_ipfs_cid exists + let tmp%10#0: bytes = (concat tmp%7#0 metadata_ipfs_cid_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") - let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check vote_id exists - let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) + let (vote_id_value%12#0: bytes, vote_id_exists%13#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%13#0) // check vote_id exists + let tmp%14#0: bytes = (concat tmp%11#0 vote_id_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check quorum exists - let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) + let (quorum_value%16#0: uint64, quorum_exists%17#0: uint64) = (app_global_get_ex 0u "quorum") + (assert quorum_exists%17#0) // check quorum exists + let tmp%18#0: bytes = examples.voting.voting.itoa(quorum_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") - let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check voter_count exists - let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) + let (voter_count_value%21#0: uint64, voter_count_exists%22#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%22#0) // check voter_count exists + let tmp%23#0: bytes = examples.voting.voting.itoa(voter_count_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) - let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) + let array_value%28#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index_internal%29#0: uint64 = 0u let reverse_index_internal%30#0: uint64 = array_length%27#0 goto block@1 @@ -275,9 +275,9 @@ contract examples.voting.voting.VotingRoundApp: let inner_txn_params%40%%Applications_length#0: uint64 = 0u let inner_txn_params%40%%AssetAmount_length#0: uint64 = 0u let inner_txn_params%40%%AssetCloseTo_length#0: uint64 = 0u - let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check vote_id exists - let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) + let (vote_id_value%41#0: bytes, vote_id_exists%42#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%42#0) // check vote_id exists + let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " vote_id_value%41#0) let inner_txn_params%40%%ConfigAssetName_length#0: uint64 = 1u let inner_txn_params%40%%AssetReceiver_length#0: uint64 = 0u let inner_txn_params%40%%AssetSender_length#0: uint64 = 0u @@ -320,9 +320,9 @@ contract examples.voting.voting.VotingRoundApp: let inner_txn_params%40%%Type_length#0: uint64 = 0u let inner_txn_params%40%%param_ConfigAssetUnitName_idx_0#0: bytes = "VOTERSLT" let inner_txn_params%40%%ConfigAssetUnitName_length#0: uint64 = 1u - let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists - let inner_txn_params%40%%param_ConfigAssetURL_idx_0#0: bytes = app_global_get_ex_value%43#0 + let (nft_image_url_value%43#0: bytes, nft_image_url_exists%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") + (assert nft_image_url_exists%44#0) // check nft_image_url exists + let inner_txn_params%40%%param_ConfigAssetURL_idx_0#0: bytes = nft_image_url_value%43#0 let inner_txn_params%40%%ConfigAssetURL_length#0: uint64 = 1u let inner_txn_params%40%%VoteFirst_length#0: uint64 = 0u let inner_txn_params%40%%VotePK_length#0: uint64 = 0u @@ -497,22 +497,22 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - goto app_global_get_ex_value%0#0 ? block@1 : block@5 + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + goto is_bootstrapped_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check start_time exists + let (start_time_value%4#0: uint64, start_time_exists%5#0: uint64) = (app_global_get_ex 0u "start_time") + (assert start_time_exists%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) - let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) + let tmp%7#0: uint64 = (<= start_time_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check end_time exists - let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) + let (end_time_value%8#0: uint64, end_time_exists%9#0: uint64) = (app_global_get_ex 0u "end_time") + (assert end_time_exists%9#0) // check end_time exists + let tmp%10#0: uint64 = (<= awst_tmp%6#0 end_time_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 let and_result%11#0: uint64 = 1u @@ -528,9 +528,9 @@ contract examples.voting.voting.VotingRoundApp: block@0: // L228 puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists - let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) + let (snapshot_public_key_value%1#0: bytes, snapshot_public_key_exists%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") + (assert snapshot_public_key_exists%2#0) // check snapshot_public_key exists + let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 snapshot_public_key_value%1#0) return tmp%3#0 subroutine examples.voting.voting.VotingRoundApp.already_voted() -> uint64: @@ -551,9 +551,9 @@ contract examples.voting.voting.VotingRoundApp: let tmp%2#0: uint64 = examples.voting.voting.VotingRoundApp.already_voted() let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check option_counts exists - let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) + let (option_counts_value%4#0: bytes, option_counts_exists%5#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%5#0) // check option_counts exists + let questions_count#0: uint64 = (extract_uint16 option_counts_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) (assert tmp%7#0) // Number of answers incorrect @@ -589,12 +589,12 @@ contract examples.voting.voting.VotingRoundApp: let item_index%23#0: uint64 = (* question_index#0 1u) let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 item_index%23#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds - let array_data_sans_header%29#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let array_data_sans_header%29#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index%30#0: uint64 = (* question_index#0 1u) let tmp%31#0: bytes = (extract3 array_data_sans_header%29#0 item_index%30#0 1u) let options_count#0: uint64 = (btoi tmp%31#0) @@ -605,9 +605,9 @@ contract examples.voting.voting.VotingRoundApp: let cumulative_offset#2: uint64 = (+ cumulative_offset#3 options_count#0) let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check voter_count exists - let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) + let (voter_count_value%35#0: uint64, voter_count_exists%36#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%36#0) // check voter_count exists + let new_state_value%37#0: uint64 = (+ voter_count_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) goto block@3 block@3: // for_footer_L192 diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir index 552068ed14..93bdb7af54 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir @@ -130,18 +130,18 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + let tmp%2#0: uint64 = (! is_bootstrapped_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) let tmp%3#0: bytes = ((gtxns Receiver) fund_min_bal_req#0) let tmp%4#0: bytes = (global CurrentApplicationAddress) let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check total_options exists - let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) + let (total_options_value%6#0: uint64, total_options_exists%7#0: uint64) = (app_global_get_ex 0u "total_options") + (assert total_options_exists%7#0) // check total_options exists + let tally_box_size#0: uint64 = (* total_options_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) let tmp%9#0: bytes = (itob min_balance_req#0) @@ -161,33 +161,33 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check vote_id exists - let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) + let (vote_id_value%4#0: bytes, vote_id_exists%5#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%5#0) // check vote_id exists + let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " vote_id_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists - let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) + let (metadata_ipfs_cid_value%8#0: bytes, metadata_ipfs_cid_exists%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") + (assert metadata_ipfs_cid_exists%9#0) // check metadata_ipfs_cid exists + let tmp%10#0: bytes = (concat tmp%7#0 metadata_ipfs_cid_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") - let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check vote_id exists - let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) + let (vote_id_value%12#0: bytes, vote_id_exists%13#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%13#0) // check vote_id exists + let tmp%14#0: bytes = (concat tmp%11#0 vote_id_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check quorum exists - let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) + let (quorum_value%16#0: uint64, quorum_exists%17#0: uint64) = (app_global_get_ex 0u "quorum") + (assert quorum_exists%17#0) // check quorum exists + let tmp%18#0: bytes = examples.voting.voting.itoa(quorum_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") - let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check voter_count exists - let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) + let (voter_count_value%21#0: uint64, voter_count_exists%22#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%22#0) // check voter_count exists + let tmp%23#0: bytes = examples.voting.voting.itoa(voter_count_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) - let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) + let array_value%28#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index_internal%29#0: uint64 = 0u goto block@1 block@1: // for_header_L129 @@ -243,12 +243,12 @@ contract examples.voting.voting.VotingRoundApp: block@15: // after_for_L129 let note#12: bytes = (concat note#1 "]}}") itxn_begin - let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check vote_id exists - let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) - let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists - ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) + let (vote_id_value%41#0: bytes, vote_id_exists%42#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%42#0) // check vote_id exists + let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " vote_id_value%41#0) + let (nft_image_url_value%43#0: bytes, nft_image_url_exists%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") + (assert nft_image_url_exists%44#0) // check nft_image_url exists + ((itxn_field ConfigAssetURL) nft_image_url_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) ((itxn_field ConfigAssetTotal) 1u) @@ -344,22 +344,22 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - goto app_global_get_ex_value%0#0 ? block@1 : block@5 + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + goto is_bootstrapped_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check start_time exists + let (start_time_value%4#0: uint64, start_time_exists%5#0: uint64) = (app_global_get_ex 0u "start_time") + (assert start_time_exists%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) - let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) + let tmp%7#0: uint64 = (<= start_time_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check end_time exists - let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) + let (end_time_value%8#0: uint64, end_time_exists%9#0: uint64) = (app_global_get_ex 0u "end_time") + (assert end_time_exists%9#0) // check end_time exists + let tmp%10#0: uint64 = (<= awst_tmp%6#0 end_time_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 let and_result%11#0: uint64 = 1u @@ -375,9 +375,9 @@ contract examples.voting.voting.VotingRoundApp: block@0: // L228 puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists - let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) + let (snapshot_public_key_value%1#0: bytes, snapshot_public_key_exists%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") + (assert snapshot_public_key_exists%2#0) // check snapshot_public_key exists + let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 snapshot_public_key_value%1#0) return tmp%3#0 subroutine examples.voting.voting.VotingRoundApp.already_voted() -> uint64: @@ -396,9 +396,9 @@ contract examples.voting.voting.VotingRoundApp: let tmp%2#0: uint64 = examples.voting.voting.VotingRoundApp.already_voted() let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check option_counts exists - let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) + let (option_counts_value%4#0: bytes, option_counts_exists%5#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%5#0) // check option_counts exists + let questions_count#0: uint64 = (extract_uint16 option_counts_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) (assert tmp%7#0) // Number of answers incorrect @@ -428,12 +428,12 @@ contract examples.voting.voting.VotingRoundApp: let array_data_sans_header%22#0: bytes = ((extract 2 0) answer_ids#0) let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds - let array_data_sans_header%29#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let array_data_sans_header%29#0: bytes = ((extract 2 0) option_counts_value%25#0) let tmp%31#0: bytes = (extract3 array_data_sans_header%29#0 question_index#0 1u) let options_count#0: uint64 = (btoi tmp%31#0) let tmp%32#0: uint64 = (< answer_option_index#0 options_count#0) @@ -443,9 +443,9 @@ contract examples.voting.voting.VotingRoundApp: let cumulative_offset#2: uint64 = (+ cumulative_offset#3 options_count#0) let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check voter_count exists - let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) + let (voter_count_value%35#0: uint64, voter_count_exists%36#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%36#0) // check voter_count exists + let new_state_value%37#0: uint64 = (+ voter_count_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#3: uint64 = (+ question_index#0 1u) goto block@1 diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir index f84e292b17..9544038bbf 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir @@ -130,18 +130,18 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + let tmp%2#0: uint64 = (! is_bootstrapped_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) let tmp%3#0: bytes = ((gtxns Receiver) fund_min_bal_req#0) let tmp%4#0: bytes = (global CurrentApplicationAddress) let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check total_options exists - let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) + let (total_options_value%6#0: uint64, total_options_exists%7#0: uint64) = (app_global_get_ex 0u "total_options") + (assert total_options_exists%7#0) // check total_options exists + let tally_box_size#0: uint64 = (* total_options_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) let tmp%9#0: bytes = (itob min_balance_req#0) @@ -161,33 +161,33 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check vote_id exists - let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) + let (vote_id_value%4#0: bytes, vote_id_exists%5#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%5#0) // check vote_id exists + let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " vote_id_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists - let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) + let (metadata_ipfs_cid_value%8#0: bytes, metadata_ipfs_cid_exists%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") + (assert metadata_ipfs_cid_exists%9#0) // check metadata_ipfs_cid exists + let tmp%10#0: bytes = (concat tmp%7#0 metadata_ipfs_cid_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") - let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check vote_id exists - let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) + let (vote_id_value%12#0: bytes, vote_id_exists%13#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%13#0) // check vote_id exists + let tmp%14#0: bytes = (concat tmp%11#0 vote_id_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check quorum exists - let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) + let (quorum_value%16#0: uint64, quorum_exists%17#0: uint64) = (app_global_get_ex 0u "quorum") + (assert quorum_exists%17#0) // check quorum exists + let tmp%18#0: bytes = examples.voting.voting.itoa(quorum_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") - let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check voter_count exists - let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) + let (voter_count_value%21#0: uint64, voter_count_exists%22#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%22#0) // check voter_count exists + let tmp%23#0: bytes = examples.voting.voting.itoa(voter_count_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) - let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) + let array_value%28#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index_internal%29#0: uint64 = 0u goto block@1 block@1: // for_header_L129 @@ -243,12 +243,12 @@ contract examples.voting.voting.VotingRoundApp: block@15: // after_for_L129 let note#12: bytes = (concat note#1 "]}}") itxn_begin - let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check vote_id exists - let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) - let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists - ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) + let (vote_id_value%41#0: bytes, vote_id_exists%42#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%42#0) // check vote_id exists + let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " vote_id_value%41#0) + let (nft_image_url_value%43#0: bytes, nft_image_url_exists%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") + (assert nft_image_url_exists%44#0) // check nft_image_url exists + ((itxn_field ConfigAssetURL) nft_image_url_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) ((itxn_field ConfigAssetTotal) 1u) @@ -342,22 +342,22 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - goto app_global_get_ex_value%0#0 ? block@1 : block@5 + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + goto is_bootstrapped_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check start_time exists + let (start_time_value%4#0: uint64, start_time_exists%5#0: uint64) = (app_global_get_ex 0u "start_time") + (assert start_time_exists%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) - let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) + let tmp%7#0: uint64 = (<= start_time_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check end_time exists - let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) + let (end_time_value%8#0: uint64, end_time_exists%9#0: uint64) = (app_global_get_ex 0u "end_time") + (assert end_time_exists%9#0) // check end_time exists + let tmp%10#0: uint64 = (<= awst_tmp%6#0 end_time_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 let and_result%11#0: uint64 = 1u @@ -373,9 +373,9 @@ contract examples.voting.voting.VotingRoundApp: block@0: // L228 puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists - let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) + let (snapshot_public_key_value%1#0: bytes, snapshot_public_key_exists%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") + (assert snapshot_public_key_exists%2#0) // check snapshot_public_key exists + let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 snapshot_public_key_value%1#0) return tmp%3#0 subroutine examples.voting.voting.VotingRoundApp.already_voted() -> uint64: @@ -394,9 +394,9 @@ contract examples.voting.voting.VotingRoundApp: let tmp%2#0: uint64 = examples.voting.voting.VotingRoundApp.already_voted() let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check option_counts exists - let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) + let (option_counts_value%4#0: bytes, option_counts_exists%5#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%5#0) // check option_counts exists + let questions_count#0: uint64 = (extract_uint16 option_counts_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) (assert tmp%7#0) // Number of answers incorrect @@ -426,12 +426,12 @@ contract examples.voting.voting.VotingRoundApp: let array_data_sans_header%22#0: bytes = ((extract 2 0) answer_ids#0) let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds - let array_data_sans_header%29#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let array_data_sans_header%29#0: bytes = ((extract 2 0) option_counts_value%25#0) let tmp%31#0: bytes = (extract3 array_data_sans_header%29#0 question_index#0 1u) let options_count#0: uint64 = (btoi tmp%31#0) let tmp%32#0: uint64 = (< answer_option_index#0 options_count#0) @@ -441,9 +441,9 @@ contract examples.voting.voting.VotingRoundApp: let cumulative_offset#2: uint64 = (+ cumulative_offset#3 options_count#0) let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check voter_count exists - let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) + let (voter_count_value%35#0: uint64, voter_count_exists%36#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%36#0) // check voter_count exists + let new_state_value%37#0: uint64 = (+ voter_count_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#3: uint64 = (+ question_index#0 1u) goto block@1 diff --git a/examples/voting/out_O2/VotingRoundApp.destructured.ir b/examples/voting/out_O2/VotingRoundApp.destructured.ir index d477a4f0a4..5a110877bf 100644 --- a/examples/voting/out_O2/VotingRoundApp.destructured.ir +++ b/examples/voting/out_O2/VotingRoundApp.destructured.ir @@ -128,18 +128,18 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + let tmp%2#0: uint64 = (! is_bootstrapped_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) let tmp%3#0: bytes = ((gtxns Receiver) fund_min_bal_req#0) let tmp%4#0: bytes = (global CurrentApplicationAddress) let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check total_options exists - let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) + let (total_options_value%6#0: uint64, total_options_exists%7#0: uint64) = (app_global_get_ex 0u "total_options") + (assert total_options_exists%7#0) // check total_options exists + let tally_box_size#0: uint64 = (* total_options_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) let tmp%9#0: bytes = (itob min_balance_req#0) @@ -159,33 +159,33 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check vote_id exists - let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) + let (vote_id_value%4#0: bytes, vote_id_exists%5#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%5#0) // check vote_id exists + let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " vote_id_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists - let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) + let (metadata_ipfs_cid_value%8#0: bytes, metadata_ipfs_cid_exists%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") + (assert metadata_ipfs_cid_exists%9#0) // check metadata_ipfs_cid exists + let tmp%10#0: bytes = (concat tmp%7#0 metadata_ipfs_cid_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") - let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check vote_id exists - let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) + let (vote_id_value%12#0: bytes, vote_id_exists%13#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%13#0) // check vote_id exists + let tmp%14#0: bytes = (concat tmp%11#0 vote_id_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check quorum exists - let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) + let (quorum_value%16#0: uint64, quorum_exists%17#0: uint64) = (app_global_get_ex 0u "quorum") + (assert quorum_exists%17#0) // check quorum exists + let tmp%18#0: bytes = examples.voting.voting.itoa(quorum_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") - let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check voter_count exists - let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) + let (voter_count_value%21#0: uint64, voter_count_exists%22#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%22#0) // check voter_count exists + let tmp%23#0: bytes = examples.voting.voting.itoa(voter_count_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) - let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) + let array_value%28#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index_internal%29#0: uint64 = 0u let question_index#0: uint64 = item_index_internal%29#0 goto block@1 @@ -247,12 +247,12 @@ contract examples.voting.voting.VotingRoundApp: block@15: // after_for_L129 let note#0: bytes = (concat note#0 "]}}") itxn_begin - let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check vote_id exists - let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) - let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists - ((itxn_field ConfigAssetURL) app_global_get_ex_value%43#0) + let (vote_id_value%41#0: bytes, vote_id_exists%42#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%42#0) // check vote_id exists + let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " vote_id_value%41#0) + let (nft_image_url_value%43#0: bytes, nft_image_url_exists%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") + (assert nft_image_url_exists%44#0) // check nft_image_url exists + ((itxn_field ConfigAssetURL) nft_image_url_value%43#0) ((itxn_field ConfigAssetUnitName) "VOTERSLT") ((itxn_field TypeEnum) acfg) ((itxn_field ConfigAssetTotal) 1u) @@ -346,22 +346,22 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - goto app_global_get_ex_value%0#0 ? block@1 : block@5 + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + goto is_bootstrapped_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check start_time exists + let (start_time_value%4#0: uint64, start_time_exists%5#0: uint64) = (app_global_get_ex 0u "start_time") + (assert start_time_exists%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) - let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) + let tmp%7#0: uint64 = (<= start_time_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check end_time exists - let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) + let (end_time_value%8#0: uint64, end_time_exists%9#0: uint64) = (app_global_get_ex 0u "end_time") + (assert end_time_exists%9#0) // check end_time exists + let tmp%10#0: uint64 = (<= awst_tmp%6#0 end_time_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 let and_result%11#0: uint64 = 1u @@ -376,9 +376,9 @@ contract examples.voting.voting.VotingRoundApp: block@0: // L228 puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists - let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) + let (snapshot_public_key_value%1#0: bytes, snapshot_public_key_exists%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") + (assert snapshot_public_key_exists%2#0) // check snapshot_public_key exists + let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 snapshot_public_key_value%1#0) return tmp%3#0 subroutine examples.voting.voting.VotingRoundApp.already_voted() -> uint64: @@ -397,9 +397,9 @@ contract examples.voting.voting.VotingRoundApp: let tmp%2#0: uint64 = examples.voting.voting.VotingRoundApp.already_voted() let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check option_counts exists - let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) + let (option_counts_value%4#0: bytes, option_counts_exists%5#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%5#0) // check option_counts exists + let questions_count#0: uint64 = (extract_uint16 option_counts_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) (assert tmp%7#0) // Number of answers incorrect @@ -428,12 +428,12 @@ contract examples.voting.voting.VotingRoundApp: let array_data_sans_header%22#0: bytes = ((extract 2 0) answer_ids#0) let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 question_index#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds - let array_data_sans_header%29#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let array_data_sans_header%29#0: bytes = ((extract 2 0) option_counts_value%25#0) let tmp%31#0: bytes = (extract3 array_data_sans_header%29#0 question_index#0 1u) let options_count#0: uint64 = (btoi tmp%31#0) let tmp%32#0: uint64 = (< answer_option_index#0 options_count#0) @@ -443,9 +443,9 @@ contract examples.voting.voting.VotingRoundApp: let cumulative_offset#0: uint64 = (+ cumulative_offset#0 options_count#0) let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check voter_count exists - let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) + let (voter_count_value%35#0: uint64, voter_count_exists%36#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%36#0) // check voter_count exists + let new_state_value%37#0: uint64 = (+ voter_count_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) let range_item%18#0: uint64 = (+ question_index#0 1u) let question_index#0: uint64 = range_item%18#0 diff --git a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir index a7c439df79..98f03133c4 100644 --- a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir +++ b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir @@ -141,18 +141,18 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.bootstrap(fund_min_bal_req: uint64) -> void: block@0: // L79 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + let tmp%2#0: uint64 = (! is_bootstrapped_value%0#0) (assert tmp%2#0) // Must not be already bootstrapped (app_global_put "is_bootstrapped" 1u) let tmp%3#0: bytes = ((gtxns Receiver) fund_min_bal_req#0) let tmp%4#0: bytes = (global CurrentApplicationAddress) let tmp%5#0: uint64 = (== tmp%3#0 tmp%4#0) (assert tmp%5#0) // Payment must be to app address - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "total_options") - (assert app_global_get_ex_did_exist%7#0) // check total_options exists - let tally_box_size#0: uint64 = (* app_global_get_ex_value%6#0 8u) + let (total_options_value%6#0: uint64, total_options_exists%7#0: uint64) = (app_global_get_ex 0u "total_options") + (assert total_options_exists%7#0) // check total_options exists + let tally_box_size#0: uint64 = (* total_options_value%6#0 8u) let tmp%8#0: uint64 = (* tally_box_size#0 400u) let min_balance_req#0: uint64 = (+ 203900u tmp%8#0) let tmp%9#0: bytes = (itob min_balance_req#0) @@ -172,33 +172,33 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%2#0) // Already closed let new_state_value%3#0: uint64 = (global LatestTimestamp) (app_global_put "close_time" new_state_value%3#0) - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%5#0) // check vote_id exists - let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " app_global_get_ex_value%4#0) + let (vote_id_value%4#0: bytes, vote_id_exists%5#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%5#0) // check vote_id exists + let tmp%6#0: bytes = (concat "{\"standard\":\"arc69\",\"description\":\"This is a voting result NFT for voting round with ID " vote_id_value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 ".\",\"properties\":{\"metadata\":\"ipfs://") - let (app_global_get_ex_value%8#0: bytes, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") - (assert app_global_get_ex_did_exist%9#0) // check metadata_ipfs_cid exists - let tmp%10#0: bytes = (concat tmp%7#0 app_global_get_ex_value%8#0) + let (metadata_ipfs_cid_value%8#0: bytes, metadata_ipfs_cid_exists%9#0: uint64) = (app_global_get_ex 0u "metadata_ipfs_cid") + (assert metadata_ipfs_cid_exists%9#0) // check metadata_ipfs_cid exists + let tmp%10#0: bytes = (concat tmp%7#0 metadata_ipfs_cid_value%8#0) let tmp%11#0: bytes = (concat tmp%10#0 "\",\"id\":\"") - let (app_global_get_ex_value%12#0: bytes, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%13#0) // check vote_id exists - let tmp%14#0: bytes = (concat tmp%11#0 app_global_get_ex_value%12#0) + let (vote_id_value%12#0: bytes, vote_id_exists%13#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%13#0) // check vote_id exists + let tmp%14#0: bytes = (concat tmp%11#0 vote_id_value%12#0) let tmp%15#0: bytes = (concat tmp%14#0 "\",\"quorum\":") - let (app_global_get_ex_value%16#0: uint64, app_global_get_ex_did_exist%17#0: uint64) = (app_global_get_ex 0u "quorum") - (assert app_global_get_ex_did_exist%17#0) // check quorum exists - let tmp%18#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%16#0) + let (quorum_value%16#0: uint64, quorum_exists%17#0: uint64) = (app_global_get_ex 0u "quorum") + (assert quorum_exists%17#0) // check quorum exists + let tmp%18#0: bytes = examples.voting.voting.itoa(quorum_value%16#0) let tmp%19#0: bytes = (concat tmp%15#0 tmp%18#0) let tmp%20#0: bytes = (concat tmp%19#0 ",\"voterCount\":") - let (app_global_get_ex_value%21#0: uint64, app_global_get_ex_did_exist%22#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%22#0) // check voter_count exists - let tmp%23#0: bytes = examples.voting.voting.itoa(app_global_get_ex_value%21#0) + let (voter_count_value%21#0: uint64, voter_count_exists%22#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%22#0) // check voter_count exists + let tmp%23#0: bytes = examples.voting.voting.itoa(voter_count_value%21#0) let tmp%24#0: bytes = (concat tmp%20#0 tmp%23#0) let note#0: bytes = (concat tmp%24#0 ",\"tallies\":[") let current_index#0: uint64 = 0u - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) - let array_value%28#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) + let array_value%28#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index_internal%29#0: uint64 = 0u goto block@1 block@1: // for_header_L129 @@ -266,18 +266,18 @@ contract examples.voting.voting.VotingRoundApp: block@15: // after_for_L129 let note#0: bytes = (concat note#0 "]}}") itxn_begin - let (app_global_get_ex_value%41#0: bytes, app_global_get_ex_did_exist%42#0: uint64) = (app_global_get_ex 0u "vote_id") - (assert app_global_get_ex_did_exist%42#0) // check vote_id exists - let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " app_global_get_ex_value%41#0) + let (vote_id_value%41#0: bytes, vote_id_exists%42#0: uint64) = (app_global_get_ex 0u "vote_id") + (assert vote_id_exists%42#0) // check vote_id exists + let inner_txn_params%40%%param_ConfigAssetName_idx_0#0: bytes = (concat "[VOTE RESULT] " vote_id_value%41#0) let inner_txn_params%40%%param_ConfigAssetDecimals_idx_0#0: uint64 = 0u let inner_txn_params%40%%param_ConfigAssetDefaultFrozen_idx_0#0: uint64 = 0u let inner_txn_params%40%%param_Note_idx_0#0: bytes = note#0 let inner_txn_params%40%%param_ConfigAssetTotal_idx_0#0: uint64 = 1u let inner_txn_params%40%%param_TypeEnum_idx_0#0: uint64 = acfg let inner_txn_params%40%%param_ConfigAssetUnitName_idx_0#0: bytes = "VOTERSLT" - let (app_global_get_ex_value%43#0: bytes, app_global_get_ex_did_exist%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") - (assert app_global_get_ex_did_exist%44#0) // check nft_image_url exists - let inner_txn_params%40%%param_ConfigAssetURL_idx_0#0: bytes = app_global_get_ex_value%43#0 + let (nft_image_url_value%43#0: bytes, nft_image_url_exists%44#0: uint64) = (app_global_get_ex 0u "nft_image_url") + (assert nft_image_url_exists%44#0) // check nft_image_url exists + let inner_txn_params%40%%param_ConfigAssetURL_idx_0#0: bytes = nft_image_url_value%43#0 ((itxn_field ConfigAssetURL) inner_txn_params%40%%param_ConfigAssetURL_idx_0#0) ((itxn_field ConfigAssetUnitName) inner_txn_params%40%%param_ConfigAssetUnitName_idx_0#0) ((itxn_field TypeEnum) inner_txn_params%40%%param_TypeEnum_idx_0#0) @@ -383,22 +383,22 @@ contract examples.voting.voting.VotingRoundApp: subroutine examples.voting.voting.VotingRoundApp.voting_open() -> uint64: block@0: // L202 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") - (assert app_global_get_ex_did_exist%1#0) // check is_bootstrapped exists - goto app_global_get_ex_value%0#0 ? block@1 : block@5 + let (is_bootstrapped_value%0#0: uint64, is_bootstrapped_exists%1#0: uint64) = (app_global_get_ex 0u "is_bootstrapped") + (assert is_bootstrapped_exists%1#0) // check is_bootstrapped exists + goto is_bootstrapped_value%0#0 ? block@1 : block@5 block@1: // and_contd_L205 let (close_time_exists%2#0: any, close_time_exists%3#0: uint64) = (app_global_get_ex 0u "close_time") goto close_time_exists%3#0 ? block@5 : block@2 block@2: // and_contd_L205 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "start_time") - (assert app_global_get_ex_did_exist%5#0) // check start_time exists + let (start_time_value%4#0: uint64, start_time_exists%5#0: uint64) = (app_global_get_ex 0u "start_time") + (assert start_time_exists%5#0) // check start_time exists let awst_tmp%6#0: uint64 = (global LatestTimestamp) - let tmp%7#0: uint64 = (<= app_global_get_ex_value%4#0 awst_tmp%6#0) + let tmp%7#0: uint64 = (<= start_time_value%4#0 awst_tmp%6#0) goto tmp%7#0 ? block@3 : block@5 block@3: // and_contd_L207 - let (app_global_get_ex_value%8#0: uint64, app_global_get_ex_did_exist%9#0: uint64) = (app_global_get_ex 0u "end_time") - (assert app_global_get_ex_did_exist%9#0) // check end_time exists - let tmp%10#0: uint64 = (<= awst_tmp%6#0 app_global_get_ex_value%8#0) + let (end_time_value%8#0: uint64, end_time_exists%9#0: uint64) = (app_global_get_ex 0u "end_time") + (assert end_time_exists%9#0) // check end_time exists + let tmp%10#0: uint64 = (<= awst_tmp%6#0 end_time_value%8#0) goto tmp%10#0 ? block@4 : block@5 block@4: // bool_true_L205 let and_result%11#0: uint64 = 1u @@ -413,9 +413,9 @@ contract examples.voting.voting.VotingRoundApp: block@0: // L228 puyapy.ensure_budget(2000u, 2u) let tmp%0#0: bytes = (txn Sender) - let (app_global_get_ex_value%1#0: bytes, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") - (assert app_global_get_ex_did_exist%2#0) // check snapshot_public_key exists - let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 app_global_get_ex_value%1#0) + let (snapshot_public_key_value%1#0: bytes, snapshot_public_key_exists%2#0: uint64) = (app_global_get_ex 0u "snapshot_public_key") + (assert snapshot_public_key_exists%2#0) // check snapshot_public_key exists + let tmp%3#0: uint64 = (ed25519verify_bare tmp%0#0 signature#0 snapshot_public_key_value%1#0) return tmp%3#0 subroutine examples.voting.voting.VotingRoundApp.already_voted() -> uint64: @@ -435,9 +435,9 @@ contract examples.voting.voting.VotingRoundApp: let tmp%2#0: uint64 = examples.voting.voting.VotingRoundApp.already_voted() let tmp%3#0: uint64 = (! tmp%2#0) (assert tmp%3#0) // Already voted - let (app_global_get_ex_value%4#0: bytes, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%5#0) // check option_counts exists - let questions_count#0: uint64 = (extract_uint16 app_global_get_ex_value%4#0 0u) + let (option_counts_value%4#0: bytes, option_counts_exists%5#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%5#0) // check option_counts exists + let questions_count#0: uint64 = (extract_uint16 option_counts_value%4#0 0u) let tmp%6#0: uint64 = (extract_uint16 answer_ids#0 0u) let tmp%7#0: uint64 = (== tmp%6#0 questions_count#0) (assert tmp%7#0) // Number of answers incorrect @@ -471,12 +471,12 @@ contract examples.voting.voting.VotingRoundApp: let item_index%23#0: uint64 = (* question_index#0 1u) let tmp%24#0: bytes = (extract3 array_data_sans_header%22#0 item_index%23#0 1u) let answer_option_index#0: uint64 = (btoi tmp%24#0) - let (app_global_get_ex_value%25#0: bytes, app_global_get_ex_did_exist%26#0: uint64) = (app_global_get_ex 0u "option_counts") - (assert app_global_get_ex_did_exist%26#0) // check option_counts exists - let array_length%27#0: uint64 = (extract_uint16 app_global_get_ex_value%25#0 0u) + let (option_counts_value%25#0: bytes, option_counts_exists%26#0: uint64) = (app_global_get_ex 0u "option_counts") + (assert option_counts_exists%26#0) // check option_counts exists + let array_length%27#0: uint64 = (extract_uint16 option_counts_value%25#0 0u) let index_is_in_bounds%28#0: uint64 = (< question_index#0 array_length%27#0) (assert index_is_in_bounds%28#0) // Index access is out of bounds - let array_data_sans_header%29#0: bytes = ((extract 2 0) app_global_get_ex_value%25#0) + let array_data_sans_header%29#0: bytes = ((extract 2 0) option_counts_value%25#0) let item_index%30#0: uint64 = (* question_index#0 1u) let tmp%31#0: bytes = (extract3 array_data_sans_header%29#0 item_index%30#0 1u) let options_count#0: uint64 = (btoi tmp%31#0) @@ -487,9 +487,9 @@ contract examples.voting.voting.VotingRoundApp: let cumulative_offset#0: uint64 = (+ cumulative_offset#0 options_count#0) let tmp%34#0: bytes = (txn Sender) (box_put tmp%34#0 answer_ids#0) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "voter_count") - (assert app_global_get_ex_did_exist%36#0) // check voter_count exists - let new_state_value%37#0: uint64 = (+ app_global_get_ex_value%35#0 1u) + let (voter_count_value%35#0: uint64, voter_count_exists%36#0: uint64) = (app_global_get_ex 0u "voter_count") + (assert voter_count_exists%36#0) // check voter_count exists + let new_state_value%37#0: uint64 = (+ voter_count_value%35#0 1u) (app_global_put "voter_count" new_state_value%37#0) goto block@3 block@3: // for_footer_L192 diff --git a/examples/voting/puya.log b/examples/voting/puya.log index 7ac79ac0e7..80dabf8008 100644 --- a/examples/voting/puya.log +++ b/examples/voting/puya.log @@ -643,8 +643,8 @@ debug: Optimizer: Copy Propagation debug: Found equivalence set: array_length%27#0, reverse_index_internal%30#0 debug: Found equivalence set: note#12, inner_txn_params%40%%param_Note_idx_0#0 debug: Replacing {inner_txn_params%40%%param_Note_idx_0#0} with note#12 made 1 modifications -debug: Found equivalence set: app_global_get_ex_value%43#0, inner_txn_params%40%%param_ConfigAssetURL_idx_0#0 -debug: Replacing {inner_txn_params%40%%param_ConfigAssetURL_idx_0#0} with app_global_get_ex_value%43#0 made 1 modifications +debug: Found equivalence set: nft_image_url_value%43#0, inner_txn_params%40%%param_ConfigAssetURL_idx_0#0 +debug: Replacing {inner_txn_params%40%%param_ConfigAssetURL_idx_0#0} with nft_image_url_value%43#0 made 1 modifications debug: Found equivalence set: item_index_internal%29#1, item_index%32#0, question_index#0 debug: Replacing {item_index_internal%29#1, item_index%32#0} with question_index#0 made 4 modifications debug: Found equivalence set: range_item%35#1, option_index#0 @@ -1659,20 +1659,20 @@ debug: Inserted bootstrap_block@0.ops[62]: 'store tmp%11#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[64]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[69]: 'store tmp%12#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[71]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[3]: 'store is_bootstrapped_exists%1#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[6]: 'load is_bootstrapped_exists%1#0' with 'load is_bootstrapped_exists%1#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[21]: 'store tmp%4#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[24]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[33]: 'store app_global_get_ex_did_exist%7#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[36]: 'load app_global_get_ex_did_exist%7#0' with 'load app_global_get_ex_did_exist%7#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[33]: 'store total_options_exists%7#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[36]: 'load total_options_exists%7#0' with 'load total_options_exists%7#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[46]: 'store tmp%8#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[49]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[5]: 'store is_bootstrapped_value%0#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[9]: 'load is_bootstrapped_value%0#0' with 'load is_bootstrapped_value%0#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[20]: 'store tmp%3#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[25]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[37]: 'store app_global_get_ex_value%6#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[41]: 'load app_global_get_ex_value%6#0' with 'load app_global_get_ex_value%6#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[37]: 'store total_options_value%6#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[41]: 'load total_options_value%6#0' with 'load total_options_value%6#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[57]: 'store min_balance_req#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[68]: 'load min_balance_req#0' with 'load min_balance_req#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[47]: 'store tally_box_size#0 to l-stack (copy)' @@ -1695,36 +1695,36 @@ debug: Inserted close_block@0.ops[6]: 'store close_time_exists%1#0 to l-stack (c debug: Replaced close_block@0.ops[9]: 'load close_time_exists%1#0' with 'load close_time_exists%1#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[16]: 'store new_state_value%3#0 to l-stack (copy)' debug: Replaced close_block@0.ops[19]: 'load new_state_value%3#0' with 'load new_state_value%3#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[24]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[27]: 'load app_global_get_ex_did_exist%5#0' with 'load app_global_get_ex_did_exist%5#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[41]: 'store app_global_get_ex_did_exist%9#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[44]: 'load app_global_get_ex_did_exist%9#0' with 'load app_global_get_ex_did_exist%9#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[58]: 'store app_global_get_ex_did_exist%13#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[61]: 'load app_global_get_ex_did_exist%13#0' with 'load app_global_get_ex_did_exist%13#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[75]: 'store app_global_get_ex_did_exist%17#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[78]: 'load app_global_get_ex_did_exist%17#0' with 'load app_global_get_ex_did_exist%17#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[24]: 'store vote_id_exists%5#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[27]: 'load vote_id_exists%5#0' with 'load vote_id_exists%5#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[41]: 'store metadata_ipfs_cid_exists%9#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[44]: 'load metadata_ipfs_cid_exists%9#0' with 'load metadata_ipfs_cid_exists%9#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[58]: 'store vote_id_exists%13#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[61]: 'load vote_id_exists%13#0' with 'load vote_id_exists%13#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[75]: 'store quorum_exists%17#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[78]: 'load quorum_exists%17#0' with 'load quorum_exists%17#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[82]: 'store tmp%18#0 to l-stack (copy)' debug: Replaced close_block@0.ops[85]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[96]: 'store app_global_get_ex_did_exist%22#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[99]: 'load app_global_get_ex_did_exist%22#0' with 'load app_global_get_ex_did_exist%22#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[96]: 'store voter_count_exists%22#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[99]: 'load voter_count_exists%22#0' with 'load voter_count_exists%22#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[103]: 'store tmp%23#0 to l-stack (copy)' debug: Replaced close_block@0.ops[106]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[119]: 'store app_global_get_ex_did_exist%26#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[122]: 'load app_global_get_ex_did_exist%26#0' with 'load app_global_get_ex_did_exist%26#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[77]: 'store app_global_get_ex_value%16#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[81]: 'load app_global_get_ex_value%16#0' with 'load app_global_get_ex_value%16#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[99]: 'store app_global_get_ex_value%21#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[103]: 'load app_global_get_ex_value%21#0' with 'load app_global_get_ex_value%21#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[123]: 'store app_global_get_ex_value%25#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[127]: 'load app_global_get_ex_value%25#0' with 'load app_global_get_ex_value%25#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[26]: 'store app_global_get_ex_value%4#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[31]: 'load app_global_get_ex_value%4#0' with 'load app_global_get_ex_value%4#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[44]: 'store app_global_get_ex_value%8#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[49]: 'load app_global_get_ex_value%8#0' with 'load app_global_get_ex_value%8#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[62]: 'store app_global_get_ex_value%12#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[67]: 'load app_global_get_ex_value%12#0' with 'load app_global_get_ex_value%12#0 from l-stack (no copy)' -debug: Inserted close_block@0.ops[131]: 'store app_global_get_ex_value%25#0 to l-stack (copy)' -debug: Replaced close_block@0.ops[135]: 'load app_global_get_ex_value%25#0' with 'load app_global_get_ex_value%25#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[119]: 'store option_counts_exists%26#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[122]: 'load option_counts_exists%26#0' with 'load option_counts_exists%26#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[77]: 'store quorum_value%16#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[81]: 'load quorum_value%16#0' with 'load quorum_value%16#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[99]: 'store voter_count_value%21#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[103]: 'load voter_count_value%21#0' with 'load voter_count_value%21#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[123]: 'store option_counts_value%25#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[127]: 'load option_counts_value%25#0' with 'load option_counts_value%25#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[26]: 'store vote_id_value%4#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[31]: 'load vote_id_value%4#0' with 'load vote_id_value%4#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[44]: 'store metadata_ipfs_cid_value%8#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[49]: 'load metadata_ipfs_cid_value%8#0' with 'load metadata_ipfs_cid_value%8#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[62]: 'store vote_id_value%12#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[67]: 'load vote_id_value%12#0' with 'load vote_id_value%12#0 from l-stack (no copy)' +debug: Inserted close_block@0.ops[131]: 'store option_counts_value%25#0 to l-stack (copy)' +debug: Replaced close_block@0.ops[135]: 'load option_counts_value%25#0' with 'load option_counts_value%25#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[38]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced close_block@0.ops[49]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' debug: Inserted close_block@0.ops[57]: 'store tmp%11#0 to l-stack (copy)' @@ -1769,16 +1769,16 @@ debug: Inserted close_after_for@12.ops[3]: 'store note#0 to l-stack (copy)' debug: Replaced close_after_for@12.ops[7]: 'load note#0' with 'load note#0 from l-stack (no copy)' debug: Inserted close_after_if_else@13.ops[7]: 'store item_index_internal%29#0 to l-stack (copy)' debug: Replaced close_after_if_else@13.ops[9]: 'load item_index_internal%29#0' with 'load item_index_internal%29#0 from l-stack (no copy)' -debug: Inserted close_after_for@15.ops[8]: 'store app_global_get_ex_did_exist%42#0 to l-stack (copy)' -debug: Replaced close_after_for@15.ops[11]: 'load app_global_get_ex_did_exist%42#0' with 'load app_global_get_ex_did_exist%42#0 from l-stack (no copy)' -debug: Inserted close_after_for@15.ops[20]: 'store app_global_get_ex_did_exist%44#0 to l-stack (copy)' -debug: Replaced close_after_for@15.ops[23]: 'load app_global_get_ex_did_exist%44#0' with 'load app_global_get_ex_did_exist%44#0 from l-stack (no copy)' +debug: Inserted close_after_for@15.ops[8]: 'store vote_id_exists%42#0 to l-stack (copy)' +debug: Replaced close_after_for@15.ops[11]: 'load vote_id_exists%42#0' with 'load vote_id_exists%42#0 from l-stack (no copy)' +debug: Inserted close_after_for@15.ops[20]: 'store nft_image_url_exists%44#0 to l-stack (copy)' +debug: Replaced close_after_for@15.ops[23]: 'load nft_image_url_exists%44#0' with 'load nft_image_url_exists%44#0 from l-stack (no copy)' debug: Inserted close_after_for@15.ops[43]: 'store submit_result_0%39%%CreatedAssetID#0 to l-stack (copy)' debug: Replaced close_after_for@15.ops[46]: 'load submit_result_0%39%%CreatedAssetID#0' with 'load submit_result_0%39%%CreatedAssetID#0 from l-stack (no copy)' -debug: Inserted close_after_for@15.ops[22]: 'store app_global_get_ex_value%43#0 to l-stack (copy)' -debug: Replaced close_after_for@15.ops[26]: 'load app_global_get_ex_value%43#0' with 'load app_global_get_ex_value%43#0 from l-stack (no copy)' -debug: Inserted close_after_for@15.ops[10]: 'store app_global_get_ex_value%41#0 to l-stack (copy)' -debug: Replaced close_after_for@15.ops[15]: 'load app_global_get_ex_value%41#0' with 'load app_global_get_ex_value%41#0 from l-stack (no copy)' +debug: Inserted close_after_for@15.ops[22]: 'store nft_image_url_value%43#0 to l-stack (copy)' +debug: Replaced close_after_for@15.ops[26]: 'load nft_image_url_value%43#0' with 'load nft_image_url_value%43#0 from l-stack (no copy)' +debug: Inserted close_after_for@15.ops[10]: 'store vote_id_value%41#0 to l-stack (copy)' +debug: Replaced close_after_for@15.ops[15]: 'load vote_id_value%41#0' with 'load vote_id_value%41#0 from l-stack (no copy)' debug: Inserted close_after_for@15.ops[17]: 'store inner_txn_params%40%%param_ConfigAssetName_idx_0#0 to l-stack (copy)' debug: Replaced close_after_for@15.ops[42]: 'load inner_txn_params%40%%param_ConfigAssetName_idx_0#0' with 'load inner_txn_params%40%%param_ConfigAssetName_idx_0#0 from l-stack (no copy)' debug: Inserted close_after_for@15.ops[3]: 'store note#0 to l-stack (copy)' @@ -1856,26 +1856,26 @@ debug: shared x-stack for get_preconditions_ternary_true@1 -> get_preconditions_ debug: shared x-stack for get_preconditions_ternary_false@2 -> get_preconditions_ternary_merge@3: ternary_result%4#0 debug: examples.voting.voting.VotingRoundApp.get_preconditions f-stack entry: [] debug: examples.voting.voting.VotingRoundApp.get_preconditions f-stack on first store: ['val_as_bytes%1#0', 'awst_tmp%2#0'] -debug: Inserted voting_open_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced voting_open_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted voting_open_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced voting_open_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted voting_open_block@0.ops[3]: 'store is_bootstrapped_exists%1#0 to l-stack (copy)' +debug: Replaced voting_open_block@0.ops[6]: 'load is_bootstrapped_exists%1#0' with 'load is_bootstrapped_exists%1#0 from l-stack (no copy)' +debug: Inserted voting_open_block@0.ops[5]: 'store is_bootstrapped_value%0#0 to l-stack (copy)' +debug: Replaced voting_open_block@0.ops[9]: 'load is_bootstrapped_value%0#0' with 'load is_bootstrapped_value%0#0 from l-stack (no copy)' debug: Inserted voting_open_and_contd@1.ops[3]: 'store close_time_exists%3#0 to l-stack (copy)' debug: Replaced voting_open_and_contd@1.ops[6]: 'load close_time_exists%3#0' with 'load close_time_exists%3#0 from l-stack (no copy)' debug: Inserted voting_open_and_contd@2.ops[12]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced voting_open_and_contd@2.ops[14]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' -debug: Inserted voting_open_and_contd@2.ops[3]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' -debug: Replaced voting_open_and_contd@2.ops[6]: 'load app_global_get_ex_did_exist%5#0' with 'load app_global_get_ex_did_exist%5#0 from l-stack (no copy)' +debug: Inserted voting_open_and_contd@2.ops[3]: 'store start_time_exists%5#0 to l-stack (copy)' +debug: Replaced voting_open_and_contd@2.ops[6]: 'load start_time_exists%5#0' with 'load start_time_exists%5#0 from l-stack (no copy)' debug: Inserted voting_open_and_contd@2.ops[9]: 'store awst_tmp%6#0 to l-stack (copy)' debug: Replaced voting_open_and_contd@2.ops[12]: 'load awst_tmp%6#0' with 'load awst_tmp%6#0 from l-stack (no copy)' -debug: Inserted voting_open_and_contd@2.ops[5]: 'store app_global_get_ex_value%4#0 to l-stack (copy)' -debug: Replaced voting_open_and_contd@2.ops[12]: 'load app_global_get_ex_value%4#0' with 'load app_global_get_ex_value%4#0 from l-stack (no copy)' +debug: Inserted voting_open_and_contd@2.ops[5]: 'store start_time_value%4#0 to l-stack (copy)' +debug: Replaced voting_open_and_contd@2.ops[12]: 'load start_time_value%4#0' with 'load start_time_value%4#0 from l-stack (no copy)' debug: Inserted voting_open_and_contd@3.ops[10]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced voting_open_and_contd@3.ops[12]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted voting_open_and_contd@3.ops[3]: 'store app_global_get_ex_did_exist%9#0 to l-stack (copy)' -debug: Replaced voting_open_and_contd@3.ops[6]: 'load app_global_get_ex_did_exist%9#0' with 'load app_global_get_ex_did_exist%9#0 from l-stack (no copy)' -debug: Inserted voting_open_and_contd@3.ops[5]: 'store app_global_get_ex_value%8#0 to l-stack (copy)' -debug: Replaced voting_open_and_contd@3.ops[10]: 'load app_global_get_ex_value%8#0' with 'load app_global_get_ex_value%8#0 from l-stack (no copy)' +debug: Inserted voting_open_and_contd@3.ops[3]: 'store end_time_exists%9#0 to l-stack (copy)' +debug: Replaced voting_open_and_contd@3.ops[6]: 'load end_time_exists%9#0' with 'load end_time_exists%9#0 from l-stack (no copy)' +debug: Inserted voting_open_and_contd@3.ops[5]: 'store end_time_value%8#0 to l-stack (copy)' +debug: Replaced voting_open_and_contd@3.ops[10]: 'load end_time_value%8#0' with 'load end_time_value%8#0 from l-stack (no copy)' debug: Found 2 edge set/s for examples.voting.voting.VotingRoundApp.voting_open debug: Allocated 1 variable/s to x-stack: and_result%11#0 debug: shared x-stack for voting_open_bool_true@4 -> voting_open_bool_merge@6: and_result%11#0 @@ -1884,10 +1884,10 @@ debug: examples.voting.voting.VotingRoundApp.voting_open f-stack entry: ['awst_t debug: examples.voting.voting.VotingRoundApp.voting_open f-stack on first store: [] debug: Inserted allowed_to_vote_block@0.ops[16]: 'store tmp%3#0 to l-stack (copy)' debug: Replaced allowed_to_vote_block@0.ops[18]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' -debug: Inserted allowed_to_vote_block@0.ops[8]: 'store app_global_get_ex_did_exist%2#0 to l-stack (copy)' -debug: Replaced allowed_to_vote_block@0.ops[11]: 'load app_global_get_ex_did_exist%2#0' with 'load app_global_get_ex_did_exist%2#0 from l-stack (no copy)' -debug: Inserted allowed_to_vote_block@0.ops[10]: 'store app_global_get_ex_value%1#0 to l-stack (copy)' -debug: Replaced allowed_to_vote_block@0.ops[16]: 'load app_global_get_ex_value%1#0' with 'load app_global_get_ex_value%1#0 from l-stack (no copy)' +debug: Inserted allowed_to_vote_block@0.ops[8]: 'store snapshot_public_key_exists%2#0 to l-stack (copy)' +debug: Replaced allowed_to_vote_block@0.ops[11]: 'load snapshot_public_key_exists%2#0' with 'load snapshot_public_key_exists%2#0 from l-stack (no copy)' +debug: Inserted allowed_to_vote_block@0.ops[10]: 'store snapshot_public_key_value%1#0 to l-stack (copy)' +debug: Replaced allowed_to_vote_block@0.ops[16]: 'load snapshot_public_key_value%1#0' with 'load snapshot_public_key_value%1#0 from l-stack (no copy)' debug: Inserted allowed_to_vote_block@0.ops[4]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced allowed_to_vote_block@0.ops[15]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' debug: Inserted already_voted_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' @@ -1918,14 +1918,14 @@ debug: Inserted vote_block@0.ops[84]: 'store tmp%17#0 to l-stack (copy)' debug: Replaced vote_block@0.ops[86]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' debug: Inserted vote_block@0.ops[91]: 'store range_item%18#0 to l-stack (copy)' debug: Replaced vote_block@0.ops[93]: 'load range_item%18#0' with 'load range_item%18#0 from l-stack (no copy)' -debug: Inserted vote_block@0.ops[26]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' -debug: Replaced vote_block@0.ops[29]: 'load app_global_get_ex_did_exist%5#0' with 'load app_global_get_ex_did_exist%5#0 from l-stack (no copy)' +debug: Inserted vote_block@0.ops[26]: 'store option_counts_exists%5#0 to l-stack (copy)' +debug: Replaced vote_block@0.ops[29]: 'load option_counts_exists%5#0' with 'load option_counts_exists%5#0 from l-stack (no copy)' debug: Inserted vote_block@0.ops[55]: 'store tmp%11#0 to l-stack (copy)' debug: Replaced vote_block@0.ops[58]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' debug: Inserted vote_block@0.ops[65]: 'store tmp%13#0 to l-stack (copy)' debug: Replaced vote_block@0.ops[68]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' -debug: Inserted vote_block@0.ops[28]: 'store app_global_get_ex_value%4#0 to l-stack (copy)' -debug: Replaced vote_block@0.ops[32]: 'load app_global_get_ex_value%4#0' with 'load app_global_get_ex_value%4#0 from l-stack (no copy)' +debug: Inserted vote_block@0.ops[28]: 'store option_counts_value%4#0 to l-stack (copy)' +debug: Replaced vote_block@0.ops[32]: 'load option_counts_value%4#0' with 'load option_counts_value%4#0 from l-stack (no copy)' debug: Inserted vote_block@0.ops[64]: 'store tmp%12#0 to l-stack (copy)' debug: Replaced vote_block@0.ops[69]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' debug: Inserted vote_block@0.ops[35]: 'store questions_count#0 to l-stack (copy)' @@ -1958,28 +1958,28 @@ debug: Inserted vote_for_body@2.ops[70]: 'store tmp%34#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[72]: 'load tmp%34#0' with 'load tmp%34#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[92]: 'store range_item%18#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[94]: 'load range_item%18#0' with 'load range_item%18#0 from l-stack (no copy)' -debug: Inserted vote_for_body@2.ops[23]: 'store app_global_get_ex_did_exist%26#0 to l-stack (copy)' -debug: Replaced vote_for_body@2.ops[26]: 'load app_global_get_ex_did_exist%26#0' with 'load app_global_get_ex_did_exist%26#0 from l-stack (no copy)' +debug: Inserted vote_for_body@2.ops[23]: 'store option_counts_exists%26#0 to l-stack (copy)' +debug: Replaced vote_for_body@2.ops[26]: 'load option_counts_exists%26#0' with 'load option_counts_exists%26#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[31]: 'store array_length%27#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[34]: 'load array_length%27#0' with 'load array_length%27#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[52]: 'store options_count#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[55]: 'load options_count#0' with 'load options_count#0 from l-stack (no copy)' -debug: Inserted vote_for_body@2.ops[81]: 'store app_global_get_ex_did_exist%36#0 to l-stack (copy)' -debug: Replaced vote_for_body@2.ops[84]: 'load app_global_get_ex_did_exist%36#0' with 'load app_global_get_ex_did_exist%36#0 from l-stack (no copy)' +debug: Inserted vote_for_body@2.ops[81]: 'store voter_count_exists%36#0 to l-stack (copy)' +debug: Replaced vote_for_body@2.ops[84]: 'load voter_count_exists%36#0' with 'load voter_count_exists%36#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[89]: 'store new_state_value%37#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[92]: 'load new_state_value%37#0' with 'load new_state_value%37#0 from l-stack (no copy)' -debug: Inserted vote_for_body@2.ops[25]: 'store app_global_get_ex_value%25#0 to l-stack (copy)' -debug: Replaced vote_for_body@2.ops[29]: 'load app_global_get_ex_value%25#0' with 'load app_global_get_ex_value%25#0 from l-stack (no copy)' -debug: Inserted vote_for_body@2.ops[84]: 'store app_global_get_ex_value%35#0 to l-stack (copy)' -debug: Replaced vote_for_body@2.ops[88]: 'load app_global_get_ex_value%35#0' with 'load app_global_get_ex_value%35#0 from l-stack (no copy)' +debug: Inserted vote_for_body@2.ops[25]: 'store option_counts_value%25#0 to l-stack (copy)' +debug: Replaced vote_for_body@2.ops[29]: 'load option_counts_value%25#0' with 'load option_counts_value%25#0 from l-stack (no copy)' +debug: Inserted vote_for_body@2.ops[84]: 'store voter_count_value%35#0 to l-stack (copy)' +debug: Replaced vote_for_body@2.ops[88]: 'load voter_count_value%35#0' with 'load voter_count_value%35#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[63]: 'store cumulative_offset#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[70]: 'load cumulative_offset#0' with 'load cumulative_offset#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[56]: 'store answer_option_index#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[65]: 'load answer_option_index#0' with 'load answer_option_index#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[1]: 'store question_index#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[13]: 'load question_index#0' with 'load question_index#0 from l-stack (no copy)' -debug: Inserted vote_for_body@2.ops[31]: 'store app_global_get_ex_value%25#0 to l-stack (copy)' -debug: Replaced vote_for_body@2.ops[43]: 'load app_global_get_ex_value%25#0' with 'load app_global_get_ex_value%25#0 from l-stack (no copy)' +debug: Inserted vote_for_body@2.ops[31]: 'store option_counts_value%25#0 to l-stack (copy)' +debug: Replaced vote_for_body@2.ops[43]: 'load option_counts_value%25#0' with 'load option_counts_value%25#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[37]: 'store question_index#0 to l-stack (copy)' debug: Replaced vote_for_body@2.ops[49]: 'load question_index#0' with 'load question_index#0 from l-stack (no copy)' debug: Inserted vote_for_body@2.ops[61]: 'store options_count#0 to l-stack (copy)' diff --git a/src/puya/ir/builder/state.py b/src/puya/ir/builder/state.py index e9173879d2..e0de774d20 100644 --- a/src/puya/ir/builder/state.py +++ b/src/puya/ir/builder/state.py @@ -1,133 +1,33 @@ from puya.avm_type import AVMType from puya.awst import nodes as awst_nodes from puya.ir.avm_ops import AVMOp -from puya.ir.builder._utils import assign_targets, mktemp +from puya.ir.builder._utils import assert_value, assign_targets, mktemp from puya.ir.context import IRFunctionBuildContext from puya.ir.models import BytesConstant, Intrinsic, UInt64Constant, Value, ValueProvider from puya.ir.types_ import bytes_enc_to_avm_bytes_enc, wtype_to_avm_type +from puya.parse import SourceLocation def visit_app_state_expression( context: IRFunctionBuildContext, expr: awst_nodes.AppStateExpression ) -> ValueProvider: - state_def = context.resolve_state(expr.field_name, expr.source_location) # TODO: add specific (unsafe) optimisation flag to allow skipping this check - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - key = BytesConstant( - value=state_def.key, - source_location=expr.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - - # note: we manually construct temporary targets here since atype is any, - # but we "know" the type from the expression - value_atype = wtype_to_avm_type(expr.wtype) - value_tmp = mktemp( - context, - atype=value_atype, - source_location=expr.source_location, - description="app_global_get_ex_value", - ) - did_exist_tmp = mktemp( - context, - atype=AVMType.uint64, - source_location=expr.source_location, - description="app_global_get_ex_did_exist", - ) - assign_targets( - context, - source=Intrinsic( - op=AVMOp.app_global_get_ex, - args=[current_app_offset, key], - source_location=expr.source_location, - ), - targets=[value_tmp, did_exist_tmp], - assignment_location=expr.source_location, - ) - context.block_builder.add( - Intrinsic( - op=AVMOp.assert_, - args=[did_exist_tmp], - comment=f"check {expr.field_name} exists", - source_location=expr.source_location, - ) - ) - - return value_tmp + return _checked_state_access(context, expr, assert_comment=f"check {expr.field_name} exists") def visit_app_account_state_expression( context: IRFunctionBuildContext, expr: awst_nodes.AppAccountStateExpression ) -> ValueProvider: - state_def = context.resolve_state(expr.field_name, expr.source_location) - account = context.visitor.visit_and_materialise_single(expr.account) - # TODO: add specific (unsafe) optimisation flag to allow skipping this check - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - key = BytesConstant( - value=state_def.key, - source_location=expr.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), + return _checked_state_access( + context, expr, assert_comment=f"check {expr.field_name} exists for account" ) - # note: we manually construct temporary targets here since atype is any, - # but we "know" the type from the expression - value_tmp = mktemp( - context, - atype=wtype_to_avm_type(expr.wtype), - source_location=expr.source_location, - description="app_local_get_ex_value", - ) - did_exist_tmp = mktemp( - context, - atype=AVMType.uint64, - source_location=expr.source_location, - description="app_local_get_ex_did_exist", - ) - assign_targets( - context, - source=Intrinsic( - op=AVMOp.app_local_get_ex, - args=[account, current_app_offset, key], - source_location=expr.source_location, - ), - targets=[value_tmp, did_exist_tmp], - assignment_location=expr.source_location, - ) - context.block_builder.add( - Intrinsic( - op=AVMOp.assert_, - args=[did_exist_tmp], - comment=f"check {expr.field_name} exists for account", - source_location=expr.source_location, - ) - ) - return value_tmp - def visit_state_get_ex( context: IRFunctionBuildContext, expr: awst_nodes.StateGetEx ) -> ValueProvider: - subject = expr.field - state_def = context.resolve_state(subject.field_name, subject.source_location) - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - key = BytesConstant( - value=state_def.key, - source_location=subject.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) - args: list[Value] = [current_app_offset, key] - if isinstance(subject, awst_nodes.AppStateExpression): - op = AVMOp.app_global_get_ex - else: - op = AVMOp.app_local_get_ex - account = context.visitor.visit_and_materialise_single(subject.account) - args.insert(0, account) - return Intrinsic( - op=op, - args=args, - source_location=expr.source_location, - ) + return _build_state_get_ex(context, expr.field, expr.source_location) def visit_state_delete(context: IRFunctionBuildContext, statement: awst_nodes.StateDelete) -> None: @@ -155,31 +55,10 @@ def visit_state_delete(context: IRFunctionBuildContext, statement: awst_nodes.St def visit_state_get(context: IRFunctionBuildContext, expr: awst_nodes.StateGet) -> ValueProvider: - subject = expr.field - state_def = context.resolve_state(subject.field_name, subject.source_location) - current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) - - key = BytesConstant( - value=state_def.key, - source_location=subject.source_location, - encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), - ) default = context.visitor.visit_and_materialise_single(expr.default) - - args: list[Value] = [current_app_offset, key] - if isinstance(subject, awst_nodes.AppStateExpression): - op = AVMOp.app_global_get_ex - else: - op = AVMOp.app_local_get_ex - account = context.visitor.visit_and_materialise_single(subject.account) - args.insert(0, account) + get_ex = _build_state_get_ex(context, expr.field, expr.source_location) maybe_value, exists = context.visitor.materialise_value_provider( - Intrinsic( - op=op, - args=args, - source_location=expr.source_location, - ), - description=f"{subject.field_name}_get_ex", + get_ex, description=f"{expr.field.field_name}_get_ex" ) return Intrinsic( op=AVMOp.select, @@ -191,27 +70,66 @@ def visit_state_get(context: IRFunctionBuildContext, expr: awst_nodes.StateGet) def visit_state_exists( context: IRFunctionBuildContext, expr: awst_nodes.StateExists ) -> ValueProvider: - subject = expr.field - state_def = context.resolve_state(subject.field_name, subject.source_location) + get_ex = _build_state_get_ex(context, expr.field, expr.source_location) + _, exists = context.visitor.materialise_value_provider( + get_ex, description=f"{expr.field.field_name}_exists" + ) + return exists + + +def _checked_state_access( + context: IRFunctionBuildContext, + expr: awst_nodes.AppAccountStateExpression | awst_nodes.AppStateExpression, + assert_comment: str, +) -> ValueProvider: + get = _build_state_get_ex(context, expr, expr.source_location) + # note: we manually construct temporary targets here since atype is any, + # but we "know" the type from the expression + value_atype = wtype_to_avm_type(expr.wtype) + value_tmp = mktemp( + context, + atype=value_atype, + description=f"{expr.field_name}_value", + source_location=expr.source_location, + ) + did_exist_tmp = mktemp( + context, + atype=AVMType.uint64, + description=f"{expr.field_name}_exists", + source_location=expr.source_location, + ) + assign_targets( + context, + source=get, + targets=[value_tmp, did_exist_tmp], + assignment_location=expr.source_location, + ) + assert_value( + context, + value=did_exist_tmp, + comment=assert_comment, + source_location=expr.source_location, + ) + return value_tmp + + +def _build_state_get_ex( + context: IRFunctionBuildContext, + expr: awst_nodes.AppAccountStateExpression | awst_nodes.AppStateExpression, + source_location: SourceLocation, +) -> Intrinsic: + state_def = context.resolve_state(expr.field_name, expr.source_location) current_app_offset = UInt64Constant(value=0, source_location=expr.source_location) key = BytesConstant( value=state_def.key, - source_location=subject.source_location, + source_location=expr.source_location, encoding=bytes_enc_to_avm_bytes_enc(state_def.key_encoding), ) args: list[Value] = [current_app_offset, key] - if isinstance(subject, awst_nodes.AppStateExpression): + if isinstance(expr, awst_nodes.AppStateExpression): op = AVMOp.app_global_get_ex else: op = AVMOp.app_local_get_ex - account = context.visitor.visit_and_materialise_single(subject.account) + account = context.visitor.visit_and_materialise_single(expr.account) args.insert(0, account) - _, exists = context.visitor.materialise_value_provider( - Intrinsic( - op=op, - args=args, - source_location=expr.source_location, - ), - description=f"{subject.field_name}_exists", - ) - return exists + return Intrinsic(op=op, args=args, source_location=source_location) diff --git a/test_cases/abi_routing/out/Reference.approval.mir b/test_cases/abi_routing/out/Reference.approval.mir index a7fd4fba63..2dd7b69a8c 100644 --- a/test_cases/abi_routing/out/Reference.approval.mir +++ b/test_cases/abi_routing/out/Reference.approval.mir @@ -1,12 +1,12 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.abi_routing.contract.Reference.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} - // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // // Implicit fall through to main_on_create@1 // @@ -15,1132 +15,1132 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txn NumAppArgs // {txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - bz main_bare_routing@18 // class Reference(ARC4Contract): abi_routing/contract.py:21 - // Implicit fall through to main_abi_routing@3 // class Reference(ARC4Contract): abi_routing/contract.py:21 + txn NumAppArgs // {txn} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + bz main_bare_routing@18 // class Reference(ARC4Contract): abi_routing/contract.py:21 + // Implicit fall through to main_abi_routing@3 // class Reference(ARC4Contract): abi_routing/contract.py:21 main_abi_routing@3: - txna ApplicationArgs 0 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - method "noop_with_uint64(uint64)uint8" // tmp%2#0,method<"noop_with_uint64(uint64)uint8"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "all_the_things(uint64)uint8" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "mixed_oca(uint64)uint8" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "opt_into_asset(asset)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "with_transactions(asset,uint64,pay,uint64)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "compare_assets(asset,asset)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "get_address()address" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "get_asset()uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "get_application()uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "get_an_int()uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64">,method<"method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 - method "method_with_more_than_15_args(uint64,uint64,uint64,uint64,asset,uint64,uint64,pay,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,byte[],byte[],asset,pay,uint64,uint64)uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64">,method<"method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void">,method<"method_with_more_than_15_args(uint64,uint64,uint64,uint64,asset,uint64,uint64,pay,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,byte[],byte[],asset,pay,uint64,uint64)uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 12 // load tmp%2#0 from l-stack (no copy) method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64">,method<"method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void">,method<"method_with_more_than_15_args(uint64,uint64,uint64,uint64,asset,uint64,uint64,pay,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,byte[],byte[],asset,pay,uint64,uint64)uint64">,tmp%2#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - match main_noop_with_uint64_route@4 main_all_the_things_route@5 main_mixed_oca_route@6 main_opt_into_asset_route@7 main_with_transactions_route@8 main_compare_assets_route@9 main_get_address_route@10 main_get_asset_route@11 main_get_application_route@12 main_get_an_int_route@13 main_method_with_default_args_route@14 main_method_with_more_than_15_args_route@15 // class Reference(ARC4Contract): abi_routing/contract.py:21 - err // reject transaction // class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 0 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + method "noop_with_uint64(uint64)uint8" // tmp%2#0,method<"noop_with_uint64(uint64)uint8"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "all_the_things(uint64)uint8" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "mixed_oca(uint64)uint8" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "opt_into_asset(asset)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "with_transactions(asset,uint64,pay,uint64)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "compare_assets(asset,asset)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "get_address()address" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "get_asset()uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "get_application()uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "get_an_int()uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64">,method<"method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void"> class Reference(ARC4Contract): abi_routing/contract.py:21 + method "method_with_more_than_15_args(uint64,uint64,uint64,uint64,asset,uint64,uint64,pay,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,byte[],byte[],asset,pay,uint64,uint64)uint64" // tmp%2#0,method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64">,method<"method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void">,method<"method_with_more_than_15_args(uint64,uint64,uint64,uint64,asset,uint64,uint64,pay,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,byte[],byte[],asset,pay,uint64,uint64)uint64"> class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 12 // load tmp%2#0 from l-stack (no copy) method<"noop_with_uint64(uint64)uint8">,method<"all_the_things(uint64)uint8">,method<"mixed_oca(uint64)uint8">,method<"opt_into_asset(asset)void">,method<"with_transactions(asset,uint64,pay,uint64)void">,method<"compare_assets(asset,asset)void">,method<"get_address()address">,method<"get_asset()uint64">,method<"get_application()uint64">,method<"get_an_int()uint64">,method<"method_with_default_args(asset,asset,account,account,application,application,byte[3],uint64,uint64)void">,method<"method_with_more_than_15_args(uint64,uint64,uint64,uint64,asset,uint64,uint64,pay,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,byte[],byte[],asset,pay,uint64,uint64)uint64">,tmp%2#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + match main_noop_with_uint64_route@4 main_all_the_things_route@5 main_mixed_oca_route@6 main_opt_into_asset_route@7 main_with_transactions_route@8 main_compare_assets_route@9 main_get_address_route@10 main_get_asset_route@11 main_get_application_route@12 main_get_an_int_route@13 main_method_with_default_args_route@14 main_method_with_more_than_15_args_route@15 // class Reference(ARC4Contract): abi_routing/contract.py:21 + err // reject transaction // class Reference(ARC4Contract): abi_routing/contract.py:21 main_noop_with_uint64_route@4: - txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:31 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod abi_routing/contract.py:31 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod abi_routing/contract.py:31 - ! // {!} arc4.abimethod abi_routing/contract.py:31 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod abi_routing/contract.py:31 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod abi_routing/contract.py:31 - assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:31 - txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:31 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod abi_routing/contract.py:31 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod abi_routing/contract.py:31 - assert // is not creating // arc4.abimethod abi_routing/contract.py:31 - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 arc4.abimethod abi_routing/contract.py:31 - callsub noop_with_uint64 // {noop_with_uint64} arc4.abimethod abi_routing/contract.py:31 - // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 arc4.abimethod abi_routing/contract.py:31 - byte 0x151f7c75 // tmp%7#0,0x151f7c75 arc4.abimethod abi_routing/contract.py:31 - swap // load tmp%7#0 from l-stack (no copy) 0x151f7c75,tmp%7#0 arc4.abimethod abi_routing/contract.py:31 - concat // {concat} arc4.abimethod abi_routing/contract.py:31 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 arc4.abimethod abi_routing/contract.py:31 - // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod abi_routing/contract.py:31 - log // arc4.abimethod abi_routing/contract.py:31 - int 1 // 1 arc4.abimethod abi_routing/contract.py:31 - return // arc4.abimethod abi_routing/contract.py:31 + txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:31 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod abi_routing/contract.py:31 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod abi_routing/contract.py:31 + ! // {!} arc4.abimethod abi_routing/contract.py:31 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod abi_routing/contract.py:31 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod abi_routing/contract.py:31 + assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:31 + txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:31 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod abi_routing/contract.py:31 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod abi_routing/contract.py:31 + assert // is not creating // arc4.abimethod abi_routing/contract.py:31 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 arc4.abimethod abi_routing/contract.py:31 + callsub noop_with_uint64 // {noop_with_uint64} arc4.abimethod abi_routing/contract.py:31 + // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 arc4.abimethod abi_routing/contract.py:31 + byte 0x151f7c75 // tmp%7#0,0x151f7c75 arc4.abimethod abi_routing/contract.py:31 + swap // load tmp%7#0 from l-stack (no copy) 0x151f7c75,tmp%7#0 arc4.abimethod abi_routing/contract.py:31 + concat // {concat} arc4.abimethod abi_routing/contract.py:31 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 arc4.abimethod abi_routing/contract.py:31 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod abi_routing/contract.py:31 + log // arc4.abimethod abi_routing/contract.py:31 + int 1 // 1 arc4.abimethod abi_routing/contract.py:31 + return // arc4.abimethod abi_routing/contract.py:31 main_all_the_things_route@5: - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - callsub full_abi_config // {full_abi_config} arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - byte 0x151f7c75 // tmp%10#0,0x151f7c75 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - swap // load tmp%10#0 from l-stack (no copy) 0x151f7c75,tmp%10#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - concat // {concat} arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - log // arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - int 1 // 1 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 - return // arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + callsub full_abi_config // {full_abi_config} arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + byte 0x151f7c75 // tmp%10#0,0x151f7c75 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + swap // load tmp%10#0 from l-stack (no copy) 0x151f7c75,tmp%10#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + concat // {concat} arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + log // arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + int 1 // 1 arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 + return // arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteAction... abi_routing/contract.py:36-47 main_mixed_oca_route@6: - txn OnCompletion // {txn} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - int 1 // tmp%12#0,1 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - swap // load tmp%12#0 from l-stack (no copy) 1,tmp%12#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - shl // {shl} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: load tmp%13#0 from l-stack (no copy) tmp%13#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - int 37 // tmp%13#0,37 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - & // {&} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - txn ApplicationID // {txn} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - assert // is not creating // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%16#0 to l-stack (no copy) tmp%16#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%16#0 from l-stack (no copy) tmp%16#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - callsub mixed_oca // {mixed_oca} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - byte 0x151f7c75 // tmp%17#0,0x151f7c75 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - swap // load tmp%17#0 from l-stack (no copy) 0x151f7c75,tmp%17#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - concat // {concat} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - // virtual: load tmp%18#0 from l-stack (no copy) tmp%18#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - log // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - int 1 // 1 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 - return // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + txn OnCompletion // {txn} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + int 1 // tmp%12#0,1 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + swap // load tmp%12#0 from l-stack (no copy) 1,tmp%12#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + shl // {shl} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: load tmp%13#0 from l-stack (no copy) tmp%13#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + int 37 // tmp%13#0,37 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + & // {&} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + txn ApplicationID // {txn} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + assert // is not creating // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%16#0 to l-stack (no copy) tmp%16#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%16#0 from l-stack (no copy) tmp%16#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + callsub mixed_oca // {mixed_oca} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + byte 0x151f7c75 // tmp%17#0,0x151f7c75 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + swap // load tmp%17#0 from l-stack (no copy) 0x151f7c75,tmp%17#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + concat // {concat} arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + // virtual: load tmp%18#0 from l-stack (no copy) tmp%18#0 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + log // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + int 1 // 1 arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 + return // arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\n... abi_routing/contract.py:52-60 main_opt_into_asset_route@7: - txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:78 - // virtual: store tmp%19#0 to l-stack (no copy) tmp%19#0 arc4.abimethod abi_routing/contract.py:78 - // virtual: load tmp%19#0 from l-stack (no copy) tmp%19#0 arc4.abimethod abi_routing/contract.py:78 - ! // {!} arc4.abimethod abi_routing/contract.py:78 - // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 arc4.abimethod abi_routing/contract.py:78 - // virtual: load tmp%20#0 from l-stack (no copy) tmp%20#0 arc4.abimethod abi_routing/contract.py:78 - assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:78 - txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:78 - // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 arc4.abimethod abi_routing/contract.py:78 - // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 arc4.abimethod abi_routing/contract.py:78 - assert // is not creating // arc4.abimethod abi_routing/contract.py:78 - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 arc4.abimethod abi_routing/contract.py:78 - callsub opt_into_asset // arc4.abimethod abi_routing/contract.py:78 - int 1 // 1 arc4.abimethod abi_routing/contract.py:78 - return // arc4.abimethod abi_routing/contract.py:78 + txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:78 + // virtual: store tmp%19#0 to l-stack (no copy) tmp%19#0 arc4.abimethod abi_routing/contract.py:78 + // virtual: load tmp%19#0 from l-stack (no copy) tmp%19#0 arc4.abimethod abi_routing/contract.py:78 + ! // {!} arc4.abimethod abi_routing/contract.py:78 + // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 arc4.abimethod abi_routing/contract.py:78 + // virtual: load tmp%20#0 from l-stack (no copy) tmp%20#0 arc4.abimethod abi_routing/contract.py:78 + assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:78 + txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:78 + // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 arc4.abimethod abi_routing/contract.py:78 + // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 arc4.abimethod abi_routing/contract.py:78 + assert // is not creating // arc4.abimethod abi_routing/contract.py:78 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 arc4.abimethod abi_routing/contract.py:78 + callsub opt_into_asset // arc4.abimethod abi_routing/contract.py:78 + int 1 // 1 arc4.abimethod abi_routing/contract.py:78 + return // arc4.abimethod abi_routing/contract.py:78 main_with_transactions_route@8: - txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:95 - // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 arc4.abimethod abi_routing/contract.py:95 - // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 arc4.abimethod abi_routing/contract.py:95 - ! // {!} arc4.abimethod abi_routing/contract.py:95 - // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 arc4.abimethod abi_routing/contract.py:95 - // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 arc4.abimethod abi_routing/contract.py:95 - assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:95 - txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:95 - // virtual: store tmp%27#0 to l-stack (no copy) tmp%27#0 arc4.abimethod abi_routing/contract.py:95 - // virtual: load tmp%27#0 from l-stack (no copy) tmp%27#0 arc4.abimethod abi_routing/contract.py:95 - assert // is not creating // arc4.abimethod abi_routing/contract.py:95 - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%30#0 to l-stack (no copy) tmp%30#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 2 // tmp%30#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%31#0 to l-stack (no copy) tmp%30#0,tmp%31#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txn GroupIndex // tmp%30#0,tmp%31#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%34#0 to l-stack (no copy) tmp%30#0,tmp%31#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%34#0 from l-stack (no copy) tmp%30#0,tmp%31#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 1 // tmp%30#0,tmp%31#0,tmp%34#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 - - // tmp%30#0,tmp%31#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store awst_tmp%35#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load awst_tmp%35#0 from l-stack (copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - gtxns TypeEnum // tmp%30#0,tmp%31#0,awst_tmp%35#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%36#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%36#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int pay // tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 - == // tmp%30#0,tmp%31#0,awst_tmp%35#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%37#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%37#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%37#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%37#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - assert // transaction type is pay // tmp%30#0,tmp%31#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 3 // tmp%30#0,tmp%31#0,awst_tmp%35#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%38#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%38#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 3 // load tmp%30#0 from l-stack (no copy) tmp%31#0,awst_tmp%35#0,tmp%38#0,tmp%30#0 arc4.abimethod abi_routing/contract.py:95 - uncover 3 // load tmp%31#0 from l-stack (no copy) awst_tmp%35#0,tmp%38#0,tmp%30#0,tmp%31#0 arc4.abimethod abi_routing/contract.py:95 - uncover 3 // load awst_tmp%35#0 from l-stack (no copy) tmp%38#0,tmp%30#0,tmp%31#0,awst_tmp%35#0 arc4.abimethod abi_routing/contract.py:95 - uncover 3 // load tmp%38#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%38#0 arc4.abimethod abi_routing/contract.py:95 - callsub with_transactions // arc4.abimethod abi_routing/contract.py:95 - int 1 // 1 arc4.abimethod abi_routing/contract.py:95 - return // arc4.abimethod abi_routing/contract.py:95 + txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:95 + // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 arc4.abimethod abi_routing/contract.py:95 + // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 arc4.abimethod abi_routing/contract.py:95 + ! // {!} arc4.abimethod abi_routing/contract.py:95 + // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 arc4.abimethod abi_routing/contract.py:95 + // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 arc4.abimethod abi_routing/contract.py:95 + assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:95 + txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:95 + // virtual: store tmp%27#0 to l-stack (no copy) tmp%27#0 arc4.abimethod abi_routing/contract.py:95 + // virtual: load tmp%27#0 from l-stack (no copy) tmp%27#0 arc4.abimethod abi_routing/contract.py:95 + assert // is not creating // arc4.abimethod abi_routing/contract.py:95 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%30#0 to l-stack (no copy) tmp%30#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 2 // tmp%30#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%31#0 to l-stack (no copy) tmp%30#0,tmp%31#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txn GroupIndex // tmp%30#0,tmp%31#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%34#0 to l-stack (no copy) tmp%30#0,tmp%31#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%34#0 from l-stack (no copy) tmp%30#0,tmp%31#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 1 // tmp%30#0,tmp%31#0,tmp%34#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 + - // tmp%30#0,tmp%31#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store awst_tmp%35#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load awst_tmp%35#0 from l-stack (copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + gtxns TypeEnum // tmp%30#0,tmp%31#0,awst_tmp%35#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%36#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%36#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int pay // tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 + == // tmp%30#0,tmp%31#0,awst_tmp%35#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%37#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%37#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%37#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%37#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + assert // transaction type is pay // tmp%30#0,tmp%31#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 3 // tmp%30#0,tmp%31#0,awst_tmp%35#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%38#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%38#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 3 // load tmp%30#0 from l-stack (no copy) tmp%31#0,awst_tmp%35#0,tmp%38#0,tmp%30#0 arc4.abimethod abi_routing/contract.py:95 + uncover 3 // load tmp%31#0 from l-stack (no copy) awst_tmp%35#0,tmp%38#0,tmp%30#0,tmp%31#0 arc4.abimethod abi_routing/contract.py:95 + uncover 3 // load awst_tmp%35#0 from l-stack (no copy) tmp%38#0,tmp%30#0,tmp%31#0,awst_tmp%35#0 arc4.abimethod abi_routing/contract.py:95 + uncover 3 // load tmp%38#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%38#0 arc4.abimethod abi_routing/contract.py:95 + callsub with_transactions // arc4.abimethod abi_routing/contract.py:95 + int 1 // 1 arc4.abimethod abi_routing/contract.py:95 + return // arc4.abimethod abi_routing/contract.py:95 main_compare_assets_route@9: - txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:108 - // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 arc4.abimethod abi_routing/contract.py:108 - // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 arc4.abimethod abi_routing/contract.py:108 - ! // {!} arc4.abimethod abi_routing/contract.py:108 - // virtual: store tmp%40#0 to l-stack (no copy) tmp%40#0 arc4.abimethod abi_routing/contract.py:108 - // virtual: load tmp%40#0 from l-stack (no copy) tmp%40#0 arc4.abimethod abi_routing/contract.py:108 - assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:108 - txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:108 - // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 arc4.abimethod abi_routing/contract.py:108 - // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 arc4.abimethod abi_routing/contract.py:108 - assert // is not creating // arc4.abimethod abi_routing/contract.py:108 - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%42#0 to l-stack (no copy) tmp%42#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%42#0 from l-stack (no copy) tmp%42#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%43#0 to l-stack (no copy) tmp%43#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%43#0 from l-stack (no copy) tmp%43#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%44#0 to l-stack (no copy) tmp%44#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 2 // tmp%44#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%45#0 to l-stack (no copy) tmp%44#0,tmp%45#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%45#0 from l-stack (no copy) tmp%44#0,tmp%45#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%44#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%46#0 to l-stack (no copy) tmp%44#0,tmp%46#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%46#0 from l-stack (no copy) tmp%44#0,tmp%46#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // tmp%44#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%47#0 to l-stack (no copy) tmp%44#0,tmp%47#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%44#0 from l-stack (no copy) tmp%47#0,tmp%44#0 arc4.abimethod abi_routing/contract.py:108 - // virtual: load tmp%47#0 from l-stack (no copy) tmp%44#0,tmp%47#0 arc4.abimethod abi_routing/contract.py:108 - callsub compare_assets // arc4.abimethod abi_routing/contract.py:108 - int 1 // 1 arc4.abimethod abi_routing/contract.py:108 - return // arc4.abimethod abi_routing/contract.py:108 + txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:108 + // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 arc4.abimethod abi_routing/contract.py:108 + // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 arc4.abimethod abi_routing/contract.py:108 + ! // {!} arc4.abimethod abi_routing/contract.py:108 + // virtual: store tmp%40#0 to l-stack (no copy) tmp%40#0 arc4.abimethod abi_routing/contract.py:108 + // virtual: load tmp%40#0 from l-stack (no copy) tmp%40#0 arc4.abimethod abi_routing/contract.py:108 + assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:108 + txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:108 + // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 arc4.abimethod abi_routing/contract.py:108 + // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 arc4.abimethod abi_routing/contract.py:108 + assert // is not creating // arc4.abimethod abi_routing/contract.py:108 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%42#0 to l-stack (no copy) tmp%42#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%42#0 from l-stack (no copy) tmp%42#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%43#0 to l-stack (no copy) tmp%43#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%43#0 from l-stack (no copy) tmp%43#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%44#0 to l-stack (no copy) tmp%44#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 2 // tmp%44#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%45#0 to l-stack (no copy) tmp%44#0,tmp%45#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%45#0 from l-stack (no copy) tmp%44#0,tmp%45#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%44#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%46#0 to l-stack (no copy) tmp%44#0,tmp%46#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%46#0 from l-stack (no copy) tmp%44#0,tmp%46#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // tmp%44#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%47#0 to l-stack (no copy) tmp%44#0,tmp%47#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%44#0 from l-stack (no copy) tmp%47#0,tmp%44#0 arc4.abimethod abi_routing/contract.py:108 + // virtual: load tmp%47#0 from l-stack (no copy) tmp%44#0,tmp%47#0 arc4.abimethod abi_routing/contract.py:108 + callsub compare_assets // arc4.abimethod abi_routing/contract.py:108 + int 1 // 1 arc4.abimethod abi_routing/contract.py:108 + return // arc4.abimethod abi_routing/contract.py:108 main_get_address_route@10: - txn OnCompletion // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: store tmp%48#0 to l-stack (no copy) tmp%48#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: load tmp%48#0 from l-stack (no copy) tmp%48#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - ! // {!} arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: store tmp%49#0 to l-stack (no copy) tmp%49#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: load tmp%49#0 from l-stack (no copy) tmp%49#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - assert // OnCompletion is NoOp // arc4.abimethod(readonly=True) abi_routing/contract.py:112 - txn ApplicationID // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: store tmp%50#0 to l-stack (no copy) tmp%50#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: load tmp%50#0 from l-stack (no copy) tmp%50#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - assert // is not creating // arc4.abimethod(readonly=True) abi_routing/contract.py:112 - callsub get_address // {get_address} arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: store tmp%51#0 to l-stack (no copy) tmp%51#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - byte 0x151f7c75 // tmp%51#0,0x151f7c75 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - swap // load tmp%51#0 from l-stack (no copy) 0x151f7c75,tmp%51#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - concat // {concat} arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: store tmp%52#0 to l-stack (no copy) tmp%52#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - // virtual: load tmp%52#0 from l-stack (no copy) tmp%52#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - log // arc4.abimethod(readonly=True) abi_routing/contract.py:112 - int 1 // 1 arc4.abimethod(readonly=True) abi_routing/contract.py:112 - return // arc4.abimethod(readonly=True) abi_routing/contract.py:112 + txn OnCompletion // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: store tmp%48#0 to l-stack (no copy) tmp%48#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: load tmp%48#0 from l-stack (no copy) tmp%48#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + ! // {!} arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: store tmp%49#0 to l-stack (no copy) tmp%49#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: load tmp%49#0 from l-stack (no copy) tmp%49#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + assert // OnCompletion is NoOp // arc4.abimethod(readonly=True) abi_routing/contract.py:112 + txn ApplicationID // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: store tmp%50#0 to l-stack (no copy) tmp%50#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: load tmp%50#0 from l-stack (no copy) tmp%50#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + assert // is not creating // arc4.abimethod(readonly=True) abi_routing/contract.py:112 + callsub get_address // {get_address} arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: store tmp%51#0 to l-stack (no copy) tmp%51#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + byte 0x151f7c75 // tmp%51#0,0x151f7c75 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + swap // load tmp%51#0 from l-stack (no copy) 0x151f7c75,tmp%51#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + concat // {concat} arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: store tmp%52#0 to l-stack (no copy) tmp%52#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + // virtual: load tmp%52#0 from l-stack (no copy) tmp%52#0 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + log // arc4.abimethod(readonly=True) abi_routing/contract.py:112 + int 1 // 1 arc4.abimethod(readonly=True) abi_routing/contract.py:112 + return // arc4.abimethod(readonly=True) abi_routing/contract.py:112 main_get_asset_route@11: - txn OnCompletion // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: store tmp%53#0 to l-stack (no copy) tmp%53#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: load tmp%53#0 from l-stack (no copy) tmp%53#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - ! // {!} arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: store tmp%54#0 to l-stack (no copy) tmp%54#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: load tmp%54#0 from l-stack (no copy) tmp%54#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - assert // OnCompletion is NoOp // arc4.abimethod(readonly=True) abi_routing/contract.py:116 - txn ApplicationID // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: store tmp%55#0 to l-stack (no copy) tmp%55#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: load tmp%55#0 from l-stack (no copy) tmp%55#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - assert // is not creating // arc4.abimethod(readonly=True) abi_routing/contract.py:116 - callsub get_asset // {get_asset} arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: store tmp%56#0 to l-stack (no copy) tmp%56#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - byte 0x151f7c75 // tmp%56#0,0x151f7c75 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - swap // load tmp%56#0 from l-stack (no copy) 0x151f7c75,tmp%56#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - concat // {concat} arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: store tmp%57#0 to l-stack (no copy) tmp%57#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - // virtual: load tmp%57#0 from l-stack (no copy) tmp%57#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - log // arc4.abimethod(readonly=True) abi_routing/contract.py:116 - int 1 // 1 arc4.abimethod(readonly=True) abi_routing/contract.py:116 - return // arc4.abimethod(readonly=True) abi_routing/contract.py:116 + txn OnCompletion // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: store tmp%53#0 to l-stack (no copy) tmp%53#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: load tmp%53#0 from l-stack (no copy) tmp%53#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + ! // {!} arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: store tmp%54#0 to l-stack (no copy) tmp%54#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: load tmp%54#0 from l-stack (no copy) tmp%54#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + assert // OnCompletion is NoOp // arc4.abimethod(readonly=True) abi_routing/contract.py:116 + txn ApplicationID // {txn} arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: store tmp%55#0 to l-stack (no copy) tmp%55#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: load tmp%55#0 from l-stack (no copy) tmp%55#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + assert // is not creating // arc4.abimethod(readonly=True) abi_routing/contract.py:116 + callsub get_asset // {get_asset} arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: store tmp%56#0 to l-stack (no copy) tmp%56#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + byte 0x151f7c75 // tmp%56#0,0x151f7c75 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + swap // load tmp%56#0 from l-stack (no copy) 0x151f7c75,tmp%56#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + concat // {concat} arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: store tmp%57#0 to l-stack (no copy) tmp%57#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + // virtual: load tmp%57#0 from l-stack (no copy) tmp%57#0 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + log // arc4.abimethod(readonly=True) abi_routing/contract.py:116 + int 1 // 1 arc4.abimethod(readonly=True) abi_routing/contract.py:116 + return // arc4.abimethod(readonly=True) abi_routing/contract.py:116 main_get_application_route@12: - txn OnCompletion // {txn} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: store tmp%58#0 to l-stack (no copy) tmp%58#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: load tmp%58#0 from l-stack (no copy) tmp%58#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - ! // {!} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: store tmp%59#0 to l-stack (no copy) tmp%59#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: load tmp%59#0 from l-stack (no copy) tmp%59#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - assert // OnCompletion is NoOp // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - txn ApplicationID // {txn} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: store tmp%60#0 to l-stack (no copy) tmp%60#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: load tmp%60#0 from l-stack (no copy) tmp%60#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - assert // is not creating // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - callsub get_app // {get_app} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: store tmp%61#0 to l-stack (no copy) tmp%61#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - byte 0x151f7c75 // tmp%61#0,0x151f7c75 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - swap // load tmp%61#0 from l-stack (no copy) 0x151f7c75,tmp%61#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - concat // {concat} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: store tmp%62#0 to l-stack (no copy) tmp%62#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - // virtual: load tmp%62#0 from l-stack (no copy) tmp%62#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - log // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - int 1 // 1 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 - return // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + txn OnCompletion // {txn} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: store tmp%58#0 to l-stack (no copy) tmp%58#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: load tmp%58#0 from l-stack (no copy) tmp%58#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + ! // {!} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: store tmp%59#0 to l-stack (no copy) tmp%59#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: load tmp%59#0 from l-stack (no copy) tmp%59#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + assert // OnCompletion is NoOp // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + txn ApplicationID // {txn} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: store tmp%60#0 to l-stack (no copy) tmp%60#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: load tmp%60#0 from l-stack (no copy) tmp%60#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + assert // is not creating // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + callsub get_app // {get_app} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: store tmp%61#0 to l-stack (no copy) tmp%61#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + byte 0x151f7c75 // tmp%61#0,0x151f7c75 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + swap // load tmp%61#0 from l-stack (no copy) 0x151f7c75,tmp%61#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + concat // {concat} arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: store tmp%62#0 to l-stack (no copy) tmp%62#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + // virtual: load tmp%62#0 from l-stack (no copy) tmp%62#0 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + log // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + int 1 // 1 arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 + return // arc4.abimethod(readonly=True, name="get_application") abi_routing/contract.py:120 main_get_an_int_route@13: - txn OnCompletion // {txn} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: store tmp%63#0 to l-stack (no copy) tmp%63#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: load tmp%63#0 from l-stack (no copy) tmp%63#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - ! // {!} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: store tmp%64#0 to l-stack (no copy) tmp%64#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: load tmp%64#0 from l-stack (no copy) tmp%64#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - assert // OnCompletion is NoOp // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - txn ApplicationID // {txn} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: store tmp%65#0 to l-stack (no copy) tmp%65#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: load tmp%65#0 from l-stack (no copy) tmp%65#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - assert // is not creating // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - callsub get_a_int // {get_a_int} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: store tmp%66#0 to l-stack (no copy) tmp%66#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - byte 0x151f7c75 // tmp%66#0,0x151f7c75 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - swap // load tmp%66#0 from l-stack (no copy) 0x151f7c75,tmp%66#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - concat // {concat} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: store tmp%67#0 to l-stack (no copy) tmp%67#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - // virtual: load tmp%67#0 from l-stack (no copy) tmp%67#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - log // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - int 1 // 1 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 - return // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + txn OnCompletion // {txn} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: store tmp%63#0 to l-stack (no copy) tmp%63#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: load tmp%63#0 from l-stack (no copy) tmp%63#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + ! // {!} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: store tmp%64#0 to l-stack (no copy) tmp%64#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: load tmp%64#0 from l-stack (no copy) tmp%64#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + assert // OnCompletion is NoOp // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + txn ApplicationID // {txn} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: store tmp%65#0 to l-stack (no copy) tmp%65#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: load tmp%65#0 from l-stack (no copy) tmp%65#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + assert // is not creating // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + callsub get_a_int // {get_a_int} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: store tmp%66#0 to l-stack (no copy) tmp%66#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + byte 0x151f7c75 // tmp%66#0,0x151f7c75 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + swap // load tmp%66#0 from l-stack (no copy) 0x151f7c75,tmp%66#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + concat // {concat} arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: store tmp%67#0 to l-stack (no copy) tmp%67#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + // virtual: load tmp%67#0 from l-stack (no copy) tmp%67#0 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + log // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + int 1 // 1 arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 + return // arc4.abimethod(readonly=True, name="get_an_int") abi_routing/contract.py:124 main_method_with_default_args_route@14: - txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - // virtual: store tmp%68#0 to l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - // virtual: load tmp%68#0 from l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - ! // {!} arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - // virtual: store tmp%69#0 to l-stack (no copy) tmp%69#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - // virtual: load tmp%69#0 from l-stack (no copy) tmp%69#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - // virtual: store tmp%70#0 to l-stack (no copy) tmp%70#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - // virtual: load tmp%70#0 from l-stack (no copy) tmp%70#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - assert // is not creating // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%71#0 to l-stack (no copy) tmp%71#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%71#0 from l-stack (no copy) tmp%71#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%72#0 to l-stack (no copy) tmp%72#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%72#0 from l-stack (no copy) tmp%72#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%73#0 to l-stack (no copy) tmp%73#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 2 // tmp%73#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%74#0 to l-stack (no copy) tmp%73#0,tmp%74#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%74#0 from l-stack (no copy) tmp%73#0,tmp%74#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%73#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%75#0 to l-stack (no copy) tmp%73#0,tmp%75#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%75#0 from l-stack (no copy) tmp%73#0,tmp%75#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // tmp%73#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%76#0 to l-stack (no copy) tmp%73#0,tmp%76#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 3 // tmp%73#0,tmp%76#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%77#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%77#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%77#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%77#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%73#0,tmp%76#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%78#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%78#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%78#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%78#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Accounts // tmp%73#0,tmp%76#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%79#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 4 // tmp%73#0,tmp%76#0,tmp%79#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%80#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%80#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%80#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%80#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%73#0,tmp%76#0,tmp%79#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%81#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%81#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%81#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%81#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Accounts // tmp%73#0,tmp%76#0,tmp%79#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%82#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 5 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%83#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%83#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%83#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%83#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%84#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%84#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%84#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%84#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Applications // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%85#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 6 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%86#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%86#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%86#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%86#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%87#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%87#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%87#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%87#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Applications // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%88#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 7 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%89#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 8 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%90#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 9 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%91#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 8 // load tmp%73#0 from l-stack (no copy) tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%76#0 from l-stack (no copy) tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%79#0 from l-stack (no copy) tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%82#0 from l-stack (no copy) tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%85#0 from l-stack (no copy) tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%88#0 from l-stack (no copy) tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%89#0 from l-stack (no copy) tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%90#0 from l-stack (no copy) tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - uncover 8 // load tmp%91#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - callsub method_with_default_args // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - int 1 // 1 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 - return // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + txn OnCompletion // {txn} arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + // virtual: store tmp%68#0 to l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + // virtual: load tmp%68#0 from l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + ! // {!} arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + // virtual: store tmp%69#0 to l-stack (no copy) tmp%69#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + // virtual: load tmp%69#0 from l-stack (no copy) tmp%69#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + assert // OnCompletion is NoOp // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + txn ApplicationID // {txn} arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + // virtual: store tmp%70#0 to l-stack (no copy) tmp%70#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + // virtual: load tmp%70#0 from l-stack (no copy) tmp%70#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + assert // is not creating // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%71#0 to l-stack (no copy) tmp%71#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%71#0 from l-stack (no copy) tmp%71#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // {btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%72#0 to l-stack (no copy) tmp%72#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%72#0 from l-stack (no copy) tmp%72#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // {txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%73#0 to l-stack (no copy) tmp%73#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 2 // tmp%73#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%74#0 to l-stack (no copy) tmp%73#0,tmp%74#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%74#0 from l-stack (no copy) tmp%73#0,tmp%74#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%73#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%75#0 to l-stack (no copy) tmp%73#0,tmp%75#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%75#0 from l-stack (no copy) tmp%73#0,tmp%75#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // tmp%73#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%76#0 to l-stack (no copy) tmp%73#0,tmp%76#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 3 // tmp%73#0,tmp%76#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%77#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%77#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%77#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%77#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%73#0,tmp%76#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%78#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%78#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%78#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%78#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Accounts // tmp%73#0,tmp%76#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%79#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 4 // tmp%73#0,tmp%76#0,tmp%79#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%80#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%80#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%80#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%80#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%73#0,tmp%76#0,tmp%79#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%81#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%81#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%81#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%81#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Accounts // tmp%73#0,tmp%76#0,tmp%79#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%82#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 5 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%83#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%83#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%83#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%83#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%84#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%84#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%84#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%84#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Applications // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%85#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 6 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%86#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%86#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%86#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%86#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%87#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%87#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%87#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%87#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Applications // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%88#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 7 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%89#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 8 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%90#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 9 // tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%91#0 to l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 8 // load tmp%73#0 from l-stack (no copy) tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%76#0 from l-stack (no copy) tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%79#0 from l-stack (no copy) tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%82#0 from l-stack (no copy) tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%85#0 from l-stack (no copy) tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%88#0 from l-stack (no copy) tmp%89#0,tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%89#0 from l-stack (no copy) tmp%90#0,tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%90#0 from l-stack (no copy) tmp%91#0,tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + uncover 8 // load tmp%91#0 from l-stack (no copy) tmp%73#0,tmp%76#0,tmp%79#0,tmp%82#0,tmp%85#0,tmp%88#0,tmp%89#0,tmp%90#0,tmp%91#0 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + callsub method_with_default_args // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + int 1 // 1 arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 + return // arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,\... abi_routing/contract.py:128-140 main_method_with_more_than_15_args_route@15: - txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:165 - // virtual: store tmp%92#0 to l-stack (no copy) tmp%92#0 arc4.abimethod abi_routing/contract.py:165 - // virtual: load tmp%92#0 from l-stack (no copy) tmp%92#0 arc4.abimethod abi_routing/contract.py:165 - ! // {!} arc4.abimethod abi_routing/contract.py:165 - // virtual: store tmp%93#0 to l-stack (no copy) tmp%93#0 arc4.abimethod abi_routing/contract.py:165 - // virtual: load tmp%93#0 from l-stack (no copy) tmp%93#0 arc4.abimethod abi_routing/contract.py:165 - assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:165 - txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:165 - // virtual: store tmp%94#0 to l-stack (no copy) tmp%94#0 arc4.abimethod abi_routing/contract.py:165 - // virtual: load tmp%94#0 from l-stack (no copy) tmp%94#0 arc4.abimethod abi_routing/contract.py:165 - assert // is not creating // arc4.abimethod abi_routing/contract.py:165 - txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%95#0 to l-stack (no copy) tmp%95#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 2 // tmp%95#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%96#0 to l-stack (no copy) tmp%95#0,tmp%96#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 3 // tmp%95#0,tmp%96#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%97#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 4 // tmp%95#0,tmp%96#0,tmp%97#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%98#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%98#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%98#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%98#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%95#0,tmp%96#0,tmp%97#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%99#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 5 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%100#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%100#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%100#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%100#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%101#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%101#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%101#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%101#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%102#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 6 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%103#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 7 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%104#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txn GroupIndex // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%107#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%107#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 - - // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store awst_tmp%108#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load awst_tmp%108#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%109#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%109#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 - == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%110#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%110#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%110#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%110#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%111#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 9 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%112#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 10 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%113#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 11 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%114#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 12 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%115#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 13 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%116#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 14 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%117#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%118#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%118#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 0 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%119#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%120#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%120#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 8 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%121#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%122#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%122#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 16 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%123#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%123#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%124#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%125#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%125#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 24 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%126#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%127#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%127#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 32 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%128#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%129#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 40 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0,40 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_index%130#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load item_index%130#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length%131#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load item_length%131#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 - + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length_plus_2%132#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load tmp%129#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_index%130#0,item_length_plus_2%132#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_index%130#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_length_plus_2%132#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_length_plus_2%132#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%133#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%133#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%134#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%135#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 42 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0,42 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_index%136#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load item_index%136#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length%137#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load item_length%137#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 - + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length_plus_2%138#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load tmp%135#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_index%136#0,item_length_plus_2%138#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_index%136#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_length_plus_2%138#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_length_plus_2%138#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%139#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%139#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%140#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%141#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%141#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 44 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%142#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%142#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%143#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%143#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%144#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txn GroupIndex // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%147#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%147#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 - - // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store awst_tmp%35#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load awst_tmp%35#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%148#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%148#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 - == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%149#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%149#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%149#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%149#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%150#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%150#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 45 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%151#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%152#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%152#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 53 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%153#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 25 // load tmp%95#0 from l-stack (no copy) tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%96#0 from l-stack (no copy) tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%97#0 from l-stack (no copy) tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%99#0 from l-stack (no copy) tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%102#0 from l-stack (no copy) tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%103#0 from l-stack (no copy) tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%104#0 from l-stack (no copy) awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load awst_tmp%108#0 from l-stack (no copy) tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%111#0 from l-stack (no copy) tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%112#0 from l-stack (no copy) tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%113#0 from l-stack (no copy) tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%114#0 from l-stack (no copy) tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%115#0 from l-stack (no copy) tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%116#0 from l-stack (no copy) tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%117#0 from l-stack (no copy) tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%119#0 from l-stack (no copy) tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%121#0 from l-stack (no copy) tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%124#0 from l-stack (no copy) tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%126#0 from l-stack (no copy) tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%128#0 from l-stack (no copy) tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%134#0 from l-stack (no copy) tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%140#0 from l-stack (no copy) tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%144#0 from l-stack (no copy) awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load awst_tmp%35#0 from l-stack (no copy) tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%151#0 from l-stack (no copy) tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%153#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0 arc4.abimethod abi_routing/contract.py:165 - callsub method_with_more_than_15_args // {method_with_more_than_15_args} arc4.abimethod abi_routing/contract.py:165 - // virtual: store tmp%154#0 to l-stack (no copy) tmp%154#0 arc4.abimethod abi_routing/contract.py:165 - byte 0x151f7c75 // tmp%154#0,0x151f7c75 arc4.abimethod abi_routing/contract.py:165 - swap // load tmp%154#0 from l-stack (no copy) 0x151f7c75,tmp%154#0 arc4.abimethod abi_routing/contract.py:165 - concat // {concat} arc4.abimethod abi_routing/contract.py:165 - // virtual: store tmp%155#0 to l-stack (no copy) tmp%155#0 arc4.abimethod abi_routing/contract.py:165 - // virtual: load tmp%155#0 from l-stack (no copy) tmp%155#0 arc4.abimethod abi_routing/contract.py:165 - log // arc4.abimethod abi_routing/contract.py:165 - int 1 // 1 arc4.abimethod abi_routing/contract.py:165 - return // arc4.abimethod abi_routing/contract.py:165 + txn OnCompletion // {txn} arc4.abimethod abi_routing/contract.py:165 + // virtual: store tmp%92#0 to l-stack (no copy) tmp%92#0 arc4.abimethod abi_routing/contract.py:165 + // virtual: load tmp%92#0 from l-stack (no copy) tmp%92#0 arc4.abimethod abi_routing/contract.py:165 + ! // {!} arc4.abimethod abi_routing/contract.py:165 + // virtual: store tmp%93#0 to l-stack (no copy) tmp%93#0 arc4.abimethod abi_routing/contract.py:165 + // virtual: load tmp%93#0 from l-stack (no copy) tmp%93#0 arc4.abimethod abi_routing/contract.py:165 + assert // OnCompletion is NoOp // arc4.abimethod abi_routing/contract.py:165 + txn ApplicationID // {txn} arc4.abimethod abi_routing/contract.py:165 + // virtual: store tmp%94#0 to l-stack (no copy) tmp%94#0 arc4.abimethod abi_routing/contract.py:165 + // virtual: load tmp%94#0 from l-stack (no copy) tmp%94#0 arc4.abimethod abi_routing/contract.py:165 + assert // is not creating // arc4.abimethod abi_routing/contract.py:165 + txna ApplicationArgs 1 // {txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%95#0 to l-stack (no copy) tmp%95#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 2 // tmp%95#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%96#0 to l-stack (no copy) tmp%95#0,tmp%96#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 3 // tmp%95#0,tmp%96#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%97#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 4 // tmp%95#0,tmp%96#0,tmp%97#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%98#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%98#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%98#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%98#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%95#0,tmp%96#0,tmp%97#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%99#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 5 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%100#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%100#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%100#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%100#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%101#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%101#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%101#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%101#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%102#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 6 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%103#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 7 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%104#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txn GroupIndex // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%107#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%107#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 + - // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store awst_tmp%108#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load awst_tmp%108#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%109#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%109#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 + == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%110#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%110#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%110#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%110#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%111#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 9 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%112#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 10 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%113#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 11 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%114#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 12 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%115#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 13 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%116#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 14 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%117#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%118#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%118#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 0 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%119#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%120#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%120#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 8 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%121#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%122#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%122#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 16 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%123#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%123#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%124#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%125#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%125#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 24 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%126#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%127#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%127#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 32 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%128#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%129#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 40 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0,40 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_index%130#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load item_index%130#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length%131#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load item_length%131#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 + + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length_plus_2%132#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load tmp%129#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_index%130#0,item_length_plus_2%132#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_index%130#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_length_plus_2%132#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_length_plus_2%132#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%133#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%133#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%134#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%135#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 42 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0,42 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_index%136#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load item_index%136#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length%137#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load item_length%137#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 + + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length_plus_2%138#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load tmp%135#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_index%136#0,item_length_plus_2%138#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_index%136#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_length_plus_2%138#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_length_plus_2%138#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%139#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%139#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%140#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%141#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%141#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 44 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%142#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%142#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%143#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%143#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%144#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txn GroupIndex // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%147#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%147#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 + - // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store awst_tmp%35#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load awst_tmp%35#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%148#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%148#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 + == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%149#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%149#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%149#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%149#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%150#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%150#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 45 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%151#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%152#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%152#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 53 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%153#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 25 // load tmp%95#0 from l-stack (no copy) tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%96#0 from l-stack (no copy) tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%97#0 from l-stack (no copy) tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%99#0 from l-stack (no copy) tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%102#0 from l-stack (no copy) tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%103#0 from l-stack (no copy) tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%104#0 from l-stack (no copy) awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load awst_tmp%108#0 from l-stack (no copy) tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%111#0 from l-stack (no copy) tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%112#0 from l-stack (no copy) tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%113#0 from l-stack (no copy) tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%114#0 from l-stack (no copy) tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%115#0 from l-stack (no copy) tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%116#0 from l-stack (no copy) tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%117#0 from l-stack (no copy) tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%119#0 from l-stack (no copy) tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%121#0 from l-stack (no copy) tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%124#0 from l-stack (no copy) tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%126#0 from l-stack (no copy) tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%128#0 from l-stack (no copy) tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%134#0 from l-stack (no copy) tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%140#0 from l-stack (no copy) tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%144#0 from l-stack (no copy) awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load awst_tmp%35#0 from l-stack (no copy) tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%151#0 from l-stack (no copy) tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%153#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0 arc4.abimethod abi_routing/contract.py:165 + callsub method_with_more_than_15_args // {method_with_more_than_15_args} arc4.abimethod abi_routing/contract.py:165 + // virtual: store tmp%154#0 to l-stack (no copy) tmp%154#0 arc4.abimethod abi_routing/contract.py:165 + byte 0x151f7c75 // tmp%154#0,0x151f7c75 arc4.abimethod abi_routing/contract.py:165 + swap // load tmp%154#0 from l-stack (no copy) 0x151f7c75,tmp%154#0 arc4.abimethod abi_routing/contract.py:165 + concat // {concat} arc4.abimethod abi_routing/contract.py:165 + // virtual: store tmp%155#0 to l-stack (no copy) tmp%155#0 arc4.abimethod abi_routing/contract.py:165 + // virtual: load tmp%155#0 from l-stack (no copy) tmp%155#0 arc4.abimethod abi_routing/contract.py:165 + log // arc4.abimethod abi_routing/contract.py:165 + int 1 // 1 arc4.abimethod abi_routing/contract.py:165 + return // arc4.abimethod abi_routing/contract.py:165 main_bare_routing@18: - txn OnCompletion // {txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%156#0 to l-stack (no copy) tmp%156#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%156#0 from l-stack (no copy) tmp%156#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - switch main_bare_abi_config@19 main_bare_abi_config@19 main_bare_abi_config@19 main_reject_bare_on_completion@20 main_bare_abi_config@19 main_bare_abi_config@19 // class Reference(ARC4Contract): abi_routing/contract.py:21 - err // reject transaction // class Reference(ARC4Contract): abi_routing/contract.py:21 + txn OnCompletion // {txn} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%156#0 to l-stack (no copy) tmp%156#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%156#0 from l-stack (no copy) tmp%156#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + switch main_bare_abi_config@19 main_bare_abi_config@19 main_bare_abi_config@19 main_reject_bare_on_completion@20 main_bare_abi_config@19 main_bare_abi_config@19 // class Reference(ARC4Contract): abi_routing/contract.py:21 + err // reject transaction // class Reference(ARC4Contract): abi_routing/contract.py:21 main_bare_abi_config@19: - txn ApplicationID // {txn} arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 - // virtual: store tmp%157#0 to l-stack (no copy) tmp%157#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 - // virtual: load tmp%157#0 from l-stack (no copy) tmp%157#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 - ! // {!} arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 - // virtual: store tmp%158#0 to l-stack (no copy) tmp%158#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 - // virtual: load tmp%158#0 from l-stack (no copy) tmp%158#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 - assert // is creating // arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 - callsub bare_abi_config // @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 - int 1 // 1 @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 - return // @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 + txn ApplicationID // {txn} arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 + // virtual: store tmp%157#0 to l-stack (no copy) tmp%157#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 + // virtual: load tmp%157#0 from l-stack (no copy) tmp%157#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 + ! // {!} arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 + // virtual: store tmp%158#0 to l-stack (no copy) tmp%158#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 + // virtual: load tmp%158#0 from l-stack (no copy) tmp%158#0 arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 + assert // is creating // arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"DeleteA... abi_routing/contract.py:65-74 + callsub bare_abi_config // @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 + int 1 // 1 @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 + return // @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 main_reject_bare_on_completion@20: - err // reject transaction // class Reference(ARC4Contract): abi_routing/contract.py:21 + err // reject transaction // class Reference(ARC4Contract): abi_routing/contract.py:21 // test_cases.abi_routing.contract.Reference.noop_with_uint64(a: bytes) -> bytes: noop_with_uint64: - proto 1 1 // (𝕡) a#0 | @arc4.abimethod\ndef noop_with_uint64(self, a: arc4.UInt64) -> arc4.UInt8: abi_routing/contract.py:31-32 + proto 1 1 // (𝕡) a#0 | @arc4.abimethod\ndef noop_with_uint64(self, a: arc4.UInt64) -> arc4.UInt8: abi_routing/contract.py:31-32 noop_with_uint64_block@0: - frame_dig -1 // load a#0 from parameters (𝕡) a#0 | a#0 a.decode() abi_routing/contract.py:33 - btoi // (𝕡) a#0 | {btoi} a.decode() abi_routing/contract.py:33 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0 | tmp%0#0 a.decode() abi_routing/contract.py:33 - int 1 // (𝕡) a#0 | tmp%0#0,1 1 abi_routing/contract.py:33 - swap // load tmp%0#0 from l-stack (no copy) (𝕡) a#0 | 1,tmp%0#0 result = 1 + a.decode() abi_routing/contract.py:33 - + // (𝕡) a#0 | {+} 1 + a.decode() abi_routing/contract.py:33 - // virtual: store result#0 to l-stack (no copy) (𝕡) a#0 | result#0 result = 1 + a.decode() abi_routing/contract.py:33 - // virtual: load result#0 from l-stack (no copy) (𝕡) a#0 | result#0 arc4.UInt8(result) abi_routing/contract.py:34 - itob // (𝕡) a#0 | {itob} arc4.UInt8(result) abi_routing/contract.py:34 - // virtual: store val_as_bytes%1#0 to l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:34 - // virtual: load val_as_bytes%1#0 from l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:34 - extract 7 1 // (𝕡) a#0 | {extract} arc4.UInt8(result) abi_routing/contract.py:34 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0 | tmp%2#0 arc4.UInt8(result) abi_routing/contract.py:34 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0 | tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:34 - retsub // tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:34 + frame_dig -1 // load a#0 from parameters (𝕡) a#0 | a#0 a.decode() abi_routing/contract.py:33 + btoi // (𝕡) a#0 | {btoi} a.decode() abi_routing/contract.py:33 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0 | tmp%0#0 a.decode() abi_routing/contract.py:33 + int 1 // (𝕡) a#0 | tmp%0#0,1 1 abi_routing/contract.py:33 + swap // load tmp%0#0 from l-stack (no copy) (𝕡) a#0 | 1,tmp%0#0 result = 1 + a.decode() abi_routing/contract.py:33 + + // (𝕡) a#0 | {+} 1 + a.decode() abi_routing/contract.py:33 + // virtual: store result#0 to l-stack (no copy) (𝕡) a#0 | result#0 result = 1 + a.decode() abi_routing/contract.py:33 + // virtual: load result#0 from l-stack (no copy) (𝕡) a#0 | result#0 arc4.UInt8(result) abi_routing/contract.py:34 + itob // (𝕡) a#0 | {itob} arc4.UInt8(result) abi_routing/contract.py:34 + // virtual: store val_as_bytes%1#0 to l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:34 + // virtual: load val_as_bytes%1#0 from l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:34 + extract 7 1 // (𝕡) a#0 | {extract} arc4.UInt8(result) abi_routing/contract.py:34 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0 | tmp%2#0 arc4.UInt8(result) abi_routing/contract.py:34 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0 | tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:34 + retsub // tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:34 // test_cases.abi_routing.contract.Reference.full_abi_config(a: bytes) -> bytes: full_abi_config: - proto 1 1 // (𝕡) a#0 | @arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteActio... abi_routing/contract.py:36-48 + proto 1 1 // (𝕡) a#0 | @arc4.abimethod(\nallow_actions=[\n"NoOp",\nOnCompleteAction.OptIn,\n"CloseOut",\nOnCompleteActio... abi_routing/contract.py:36-48 full_abi_config_block@0: - frame_dig -1 // load a#0 from parameters (𝕡) a#0 | a#0 a.decode() abi_routing/contract.py:49 - btoi // (𝕡) a#0 | {btoi} a.decode() abi_routing/contract.py:49 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0 | tmp%0#0 a.decode() abi_routing/contract.py:49 - int 1 // (𝕡) a#0 | tmp%0#0,1 1 abi_routing/contract.py:49 - swap // load tmp%0#0 from l-stack (no copy) (𝕡) a#0 | 1,tmp%0#0 result = UInt64(1) + a.decode() abi_routing/contract.py:49 - + // (𝕡) a#0 | {+} UInt64(1) + a.decode() abi_routing/contract.py:49 - // virtual: store result#0 to l-stack (no copy) (𝕡) a#0 | result#0 result = UInt64(1) + a.decode() abi_routing/contract.py:49 - // virtual: load result#0 from l-stack (no copy) (𝕡) a#0 | result#0 arc4.UInt8(result) abi_routing/contract.py:50 - itob // (𝕡) a#0 | {itob} arc4.UInt8(result) abi_routing/contract.py:50 - // virtual: store val_as_bytes%1#0 to l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:50 - // virtual: load val_as_bytes%1#0 from l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:50 - extract 7 1 // (𝕡) a#0 | {extract} arc4.UInt8(result) abi_routing/contract.py:50 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0 | tmp%2#0 arc4.UInt8(result) abi_routing/contract.py:50 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0 | tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:50 - retsub // tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:50 + frame_dig -1 // load a#0 from parameters (𝕡) a#0 | a#0 a.decode() abi_routing/contract.py:49 + btoi // (𝕡) a#0 | {btoi} a.decode() abi_routing/contract.py:49 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0 | tmp%0#0 a.decode() abi_routing/contract.py:49 + int 1 // (𝕡) a#0 | tmp%0#0,1 1 abi_routing/contract.py:49 + swap // load tmp%0#0 from l-stack (no copy) (𝕡) a#0 | 1,tmp%0#0 result = UInt64(1) + a.decode() abi_routing/contract.py:49 + + // (𝕡) a#0 | {+} UInt64(1) + a.decode() abi_routing/contract.py:49 + // virtual: store result#0 to l-stack (no copy) (𝕡) a#0 | result#0 result = UInt64(1) + a.decode() abi_routing/contract.py:49 + // virtual: load result#0 from l-stack (no copy) (𝕡) a#0 | result#0 arc4.UInt8(result) abi_routing/contract.py:50 + itob // (𝕡) a#0 | {itob} arc4.UInt8(result) abi_routing/contract.py:50 + // virtual: store val_as_bytes%1#0 to l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:50 + // virtual: load val_as_bytes%1#0 from l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:50 + extract 7 1 // (𝕡) a#0 | {extract} arc4.UInt8(result) abi_routing/contract.py:50 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0 | tmp%2#0 arc4.UInt8(result) abi_routing/contract.py:50 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0 | tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:50 + retsub // tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:50 // test_cases.abi_routing.contract.Reference.mixed_oca(a: bytes) -> bytes: mixed_oca: - proto 1 1 // (𝕡) a#0 | @arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\... abi_routing/contract.py:52-61 + proto 1 1 // (𝕡) a#0 | @arc4.abimethod(\nallow_actions=[\n"NoOp",\n"CloseOut",\n"DeleteApplication",\n],\ncreate=False,\... abi_routing/contract.py:52-61 mixed_oca_block@0: - frame_dig -1 // load a#0 from parameters (𝕡) a#0 | a#0 a.decode() abi_routing/contract.py:62 - btoi // (𝕡) a#0 | {btoi} a.decode() abi_routing/contract.py:62 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0 | tmp%0#0 a.decode() abi_routing/contract.py:62 - int 1 // (𝕡) a#0 | tmp%0#0,1 1 abi_routing/contract.py:62 - swap // load tmp%0#0 from l-stack (no copy) (𝕡) a#0 | 1,tmp%0#0 result = UInt64(1) + a.decode() abi_routing/contract.py:62 - + // (𝕡) a#0 | {+} UInt64(1) + a.decode() abi_routing/contract.py:62 - // virtual: store result#0 to l-stack (no copy) (𝕡) a#0 | result#0 result = UInt64(1) + a.decode() abi_routing/contract.py:62 - // virtual: load result#0 from l-stack (no copy) (𝕡) a#0 | result#0 arc4.UInt8(result) abi_routing/contract.py:63 - itob // (𝕡) a#0 | {itob} arc4.UInt8(result) abi_routing/contract.py:63 - // virtual: store val_as_bytes%1#0 to l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:63 - // virtual: load val_as_bytes%1#0 from l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:63 - extract 7 1 // (𝕡) a#0 | {extract} arc4.UInt8(result) abi_routing/contract.py:63 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0 | tmp%2#0 arc4.UInt8(result) abi_routing/contract.py:63 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0 | tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:63 - retsub // tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:63 + frame_dig -1 // load a#0 from parameters (𝕡) a#0 | a#0 a.decode() abi_routing/contract.py:62 + btoi // (𝕡) a#0 | {btoi} a.decode() abi_routing/contract.py:62 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0 | tmp%0#0 a.decode() abi_routing/contract.py:62 + int 1 // (𝕡) a#0 | tmp%0#0,1 1 abi_routing/contract.py:62 + swap // load tmp%0#0 from l-stack (no copy) (𝕡) a#0 | 1,tmp%0#0 result = UInt64(1) + a.decode() abi_routing/contract.py:62 + + // (𝕡) a#0 | {+} UInt64(1) + a.decode() abi_routing/contract.py:62 + // virtual: store result#0 to l-stack (no copy) (𝕡) a#0 | result#0 result = UInt64(1) + a.decode() abi_routing/contract.py:62 + // virtual: load result#0 from l-stack (no copy) (𝕡) a#0 | result#0 arc4.UInt8(result) abi_routing/contract.py:63 + itob // (𝕡) a#0 | {itob} arc4.UInt8(result) abi_routing/contract.py:63 + // virtual: store val_as_bytes%1#0 to l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:63 + // virtual: load val_as_bytes%1#0 from l-stack (no copy) (𝕡) a#0 | val_as_bytes%1#0 arc4.UInt8(result) abi_routing/contract.py:63 + extract 7 1 // (𝕡) a#0 | {extract} arc4.UInt8(result) abi_routing/contract.py:63 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0 | tmp%2#0 arc4.UInt8(result) abi_routing/contract.py:63 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0 | tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:63 + retsub // tmp%2#0 return arc4.UInt8(result) abi_routing/contract.py:63 // test_cases.abi_routing.contract.Reference.opt_into_asset(asset: uint64) -> void: opt_into_asset: - proto 1 0 // (𝕡) asset#0 | @arc4.abimethod\ndef opt_into_asset(self, asset: Asset) -> None: abi_routing/contract.py:78-79 + proto 1 0 // (𝕡) asset#0 | @arc4.abimethod\ndef opt_into_asset(self, asset: Asset) -> None: abi_routing/contract.py:78-79 opt_into_asset_block@0: - txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert op.Txn.sender abi_routing/contract.py:80-81 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender abi_routing/contract.py:80-81 - global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_address abi_routing/contract.py:80-81 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_address abi_routing/contract.py:80-81 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 - == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.cre... abi_routing/contract.py:80-81 - assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.cre... abi_routing/contract.py:80-81 - int 0 // (𝕡) asset#0 | 0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - byte "asa" // (𝕡) asset#0 | 0,"asa" ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" abi_routing/contract.py:82-83 - assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" abi_routing/contract.py:82-83 - byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa abi_routing/contract.py:84-85 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset abi_routing/contract.py:84-85 - app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset abi_routing/contract.py:84-85 - itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nop.ITxnCreate.begin() abi_routing/contract.py:87-88 - int axfer // (𝕡) asset#0 | axfer TransactionType.AssetTransfer abi_routing/contract.py:89 - itxn_field TypeEnum // (𝕡) asset#0 | op.ITxnCreate.set_type_enum(TransactionType.AssetTransfer) abi_routing/contract.py:89 - int 0 // (𝕡) asset#0 | 0 0 abi_routing/contract.py:90 - itxn_field Fee // (𝕡) asset#0 | op.ITxnCreate.set_fee(UInt64(0)) abi_routing/contract.py:90 - global CurrentApplicationAddress // (𝕡) asset#0 | {global} op.Global.current_application_address abi_routing/contract.py:91 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0 | tmp%6#0 op.Global.current_application_address abi_routing/contract.py:91 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0 | tmp%6#0 op.ITxnCreate.set_asset_receiver(op.Global.current_application_address) abi_routing/contract.py:91 - itxn_field AssetReceiver // (𝕡) asset#0 | op.ITxnCreate.set_asset_receiver(op.Global.current_application_address) abi_routing/contract.py:91 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 op.ITxnCreate.set_xfer_asset(asset.asset_id) abi_routing/contract.py:92 - itxn_field XferAsset // (𝕡) asset#0 | op.ITxnCreate.set_xfer_asset(asset.asset_id) abi_routing/contract.py:92 - itxn_submit // (𝕡) asset#0 | op.ITxnCreate.submit() abi_routing/contract.py:93 + txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert op.Txn.sender abi_routing/contract.py:80-81 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender abi_routing/contract.py:80-81 + global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_address abi_routing/contract.py:80-81 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_address abi_routing/contract.py:80-81 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 + == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.creator_ad... abi_routing/contract.py:80-81 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.cre... abi_routing/contract.py:80-81 + assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert op.Txn.sender == op.Global.cre... abi_routing/contract.py:80-81 + int 0 // (𝕡) asset#0 | 0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + byte "asa" // (𝕡) asset#0 | 0,"asa" ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + // virtual: store asa_exists%4#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + // virtual: store asa_value%3#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + // virtual: load asa_exists%4#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + assert // check asa exists // (𝕡) asset#0 | asa_value%3#0 ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + // virtual: load asa_value%3#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa abi_routing/contract.py:82-83 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" abi_routing/contract.py:82-83 + assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" abi_routing/contract.py:82-83 + byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa abi_routing/contract.py:84-85 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset abi_routing/contract.py:84-85 + app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset abi_routing/contract.py:84-85 + itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nop.ITxnCreate.begin() abi_routing/contract.py:87-88 + int axfer // (𝕡) asset#0 | axfer TransactionType.AssetTransfer abi_routing/contract.py:89 + itxn_field TypeEnum // (𝕡) asset#0 | op.ITxnCreate.set_type_enum(TransactionType.AssetTransfer) abi_routing/contract.py:89 + int 0 // (𝕡) asset#0 | 0 0 abi_routing/contract.py:90 + itxn_field Fee // (𝕡) asset#0 | op.ITxnCreate.set_fee(UInt64(0)) abi_routing/contract.py:90 + global CurrentApplicationAddress // (𝕡) asset#0 | {global} op.Global.current_application_address abi_routing/contract.py:91 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0 | tmp%6#0 op.Global.current_application_address abi_routing/contract.py:91 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0 | tmp%6#0 op.ITxnCreate.set_asset_receiver(op.Global.current_application_address) abi_routing/contract.py:91 + itxn_field AssetReceiver // (𝕡) asset#0 | op.ITxnCreate.set_asset_receiver(op.Global.current_application_address) abi_routing/contract.py:91 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 op.ITxnCreate.set_xfer_asset(asset.asset_id) abi_routing/contract.py:92 + itxn_field XferAsset // (𝕡) asset#0 | op.ITxnCreate.set_xfer_asset(asset.asset_id) abi_routing/contract.py:92 + itxn_submit // (𝕡) asset#0 | op.ITxnCreate.submit() abi_routing/contract.py:93 retsub // // test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: with_transactions: - proto 4 0 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | @arc4.abimethod\ndef with_transactions(\nself,\nasset: Asset,\nan_int: arc4.UInt64,\npay: gtxn.Pa... abi_routing/contract.py:95-102 + proto 4 0 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | @arc4.abimethod\ndef with_transactions(\nself,\nasset: Asset,\nan_int: arc4.UInt64,\npay: gtxn.Pa... abi_routing/contract.py:95-102 with_transactions_block@0: - int 0 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | 0 self.asa abi_routing/contract.py:103 - byte "asa" // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | 0,"asa" self.asa abi_routing/contract.py:103 - app_global_get_ex // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa abi_routing/contract.py:103 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.asa abi_routing/contract.py:103 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa abi_routing/contract.py:103 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa abi_routing/contract.py:103 - assert // check asa exists // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0 self.asa abi_routing/contract.py:103 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 - frame_dig -4 // load asset#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | app_global_get_ex_value%0#0,asset#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 - == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} self.asa == asset, "is correct asset" abi_routing/contract.py:103 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%2#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%2#0 assert self.asa == asset, "is correct asset" abi_routing/contract.py:103 - assert // is correct asset // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert self.asa == asset, "is correct asset" abi_routing/contract.py:103 - frame_dig -3 // load an_int#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | an_int#0 an_int.decode() abi_routing/contract.py:104 - btoi // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {btoi} an_int.decode() abi_routing/contract.py:104 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%3#0 an_int.decode() abi_routing/contract.py:104 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%3#0 an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 - int 1 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%3#0,1 1 abi_routing/contract.py:104 - == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%4#0 an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%4#0 assert an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 - assert // is correct int // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 - frame_dig -2 // load pay#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | pay#0 pay.receiver abi_routing/contract.py:105 - gtxns Receiver // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {gtxns} pay.receiver abi_routing/contract.py:105 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0 pay.receiver abi_routing/contract.py:105 - global CurrentApplicationAddress // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0,{global} op.Global.current_application_address abi_routing/contract.py:105 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0,tmp%6#0 op.Global.current_application_address abi_routing/contract.py:105 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%6#0,tmp%5#0 pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0,tmp%6#0 pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 - == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%7#0 pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%7#0 assert pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 - assert // is payment to app // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 - frame_dig -1 // load another_int#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | another_int#0 another_int.decode() abi_routing/contract.py:106 - btoi // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {btoi} another_int.decode() abi_routing/contract.py:106 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%8#0 another_int.decode() abi_routing/contract.py:106 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%8#0 another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 - int 2 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%8#0,2 2 abi_routing/contract.py:106 - == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%9#0 another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%9#0 assert another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 - assert // is correct int // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 + int 0 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | 0 self.asa abi_routing/contract.py:103 + byte "asa" // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | 0,"asa" self.asa abi_routing/contract.py:103 + app_global_get_ex // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa abi_routing/contract.py:103 + // virtual: store asa_exists%1#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | asa_exists%1#0,{app_global_get_ex}.0 self.asa abi_routing/contract.py:103 + // virtual: store asa_value%0#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | asa_value%0#0,asa_exists%1#0 self.asa abi_routing/contract.py:103 + // virtual: load asa_exists%1#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | asa_value%0#0,asa_exists%1#0 self.asa abi_routing/contract.py:103 + assert // check asa exists // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | asa_value%0#0 self.asa abi_routing/contract.py:103 + // virtual: load asa_value%0#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | asa_value%0#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 + frame_dig -4 // load asset#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | asa_value%0#0,asset#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 + == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} self.asa == asset, "is correct asset" abi_routing/contract.py:103 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%2#0 self.asa == asset, "is correct asset" abi_routing/contract.py:103 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%2#0 assert self.asa == asset, "is correct asset" abi_routing/contract.py:103 + assert // is correct asset // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert self.asa == asset, "is correct asset" abi_routing/contract.py:103 + frame_dig -3 // load an_int#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | an_int#0 an_int.decode() abi_routing/contract.py:104 + btoi // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {btoi} an_int.decode() abi_routing/contract.py:104 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%3#0 an_int.decode() abi_routing/contract.py:104 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%3#0 an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 + int 1 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%3#0,1 1 abi_routing/contract.py:104 + == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%4#0 an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%4#0 assert an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 + assert // is correct int // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert an_int.decode() == 1, "is correct int" abi_routing/contract.py:104 + frame_dig -2 // load pay#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | pay#0 pay.receiver abi_routing/contract.py:105 + gtxns Receiver // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {gtxns} pay.receiver abi_routing/contract.py:105 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0 pay.receiver abi_routing/contract.py:105 + global CurrentApplicationAddress // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0,{global} op.Global.current_application_address abi_routing/contract.py:105 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0,tmp%6#0 op.Global.current_application_address abi_routing/contract.py:105 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%6#0,tmp%5#0 pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%5#0,tmp%6#0 pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 + == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%7#0 pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%7#0 assert pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 + assert // is payment to app // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert pay.receiver == op.Global.current_application_address, "is payment to app" abi_routing/contract.py:105 + frame_dig -1 // load another_int#0 from parameters (𝕡) asset#0,an_int#0,pay#0,another_int#0 | another_int#0 another_int.decode() abi_routing/contract.py:106 + btoi // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {btoi} another_int.decode() abi_routing/contract.py:106 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%8#0 another_int.decode() abi_routing/contract.py:106 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%8#0 another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 + int 2 // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%8#0,2 2 abi_routing/contract.py:106 + == // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | {==} another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%9#0 another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) asset#0,an_int#0,pay#0,another_int#0 | tmp%9#0 assert another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 + assert // is correct int // (𝕡) asset#0,an_int#0,pay#0,another_int#0 | assert another_int.decode() == 2, "is correct int" abi_routing/contract.py:106 retsub // // test_cases.abi_routing.contract.Reference.compare_assets(asset_a: uint64, asset_b: uint64) -> void: compare_assets: - proto 2 0 // (𝕡) asset_a#0,asset_b#0 | @arc4.abimethod\ndef compare_assets(self, asset_a: Asset, asset_b: Asset) -> None: abi_routing/contract.py:108-109 + proto 2 0 // (𝕡) asset_a#0,asset_b#0 | @arc4.abimethod\ndef compare_assets(self, asset_a: Asset, asset_b: Asset) -> None: abi_routing/contract.py:108-109 compare_assets_block@0: - frame_dig -2 // load asset_a#0 from parameters (𝕡) asset_a#0,asset_b#0 | asset_a#0 asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 - frame_dig -1 // load asset_b#0 from parameters (𝕡) asset_a#0,asset_b#0 | asset_a#0,asset_b#0 asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 - == // (𝕡) asset_a#0,asset_b#0 | {==} asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset_a#0,asset_b#0 | tmp%0#0 asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset_a#0,asset_b#0 | tmp%0#0 assert asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 - assert // asset a == b // (𝕡) asset_a#0,asset_b#0 | assert asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 + frame_dig -2 // load asset_a#0 from parameters (𝕡) asset_a#0,asset_b#0 | asset_a#0 asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 + frame_dig -1 // load asset_b#0 from parameters (𝕡) asset_a#0,asset_b#0 | asset_a#0,asset_b#0 asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 + == // (𝕡) asset_a#0,asset_b#0 | {==} asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset_a#0,asset_b#0 | tmp%0#0 asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset_a#0,asset_b#0 | tmp%0#0 assert asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 + assert // asset a == b // (𝕡) asset_a#0,asset_b#0 | assert asset_a == asset_b, "asset a == b" abi_routing/contract.py:110 retsub // // test_cases.abi_routing.contract.Reference.get_address() -> bytes: get_address: - proto 0 1 // @arc4.abimethod(readonly=True)\ndef get_address(self) -> arc4.Address: abi_routing/contract.py:112-113 + proto 0 1 // @arc4.abimethod(readonly=True)\ndef get_address(self) -> arc4.Address: abi_routing/contract.py:112-113 get_address_block@0: - global ZeroAddress // {global} op.Global.zero_address abi_routing/contract.py:114 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 op.Global.zero_address abi_routing/contract.py:114 - // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 return arc4.Address.from_bytes(op.Global.zero_address.bytes) abi_routing/contract.py:114 - retsub // tmp%0#0 return arc4.Address.from_bytes(op.Global.zero_address.bytes) abi_routing/contract.py:114 + global ZeroAddress // {global} op.Global.zero_address abi_routing/contract.py:114 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 op.Global.zero_address abi_routing/contract.py:114 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 return arc4.Address.from_bytes(op.Global.zero_address.bytes) abi_routing/contract.py:114 + retsub // tmp%0#0 return arc4.Address.from_bytes(op.Global.zero_address.bytes) abi_routing/contract.py:114 // test_cases.abi_routing.contract.Reference.get_asset() -> bytes: get_asset: - proto 0 1 // @arc4.abimethod(readonly=True)\ndef get_asset(self) -> arc4.UInt64: abi_routing/contract.py:116-117 + proto 0 1 // @arc4.abimethod(readonly=True)\ndef get_asset(self) -> arc4.UInt64: abi_routing/contract.py:116-117 get_asset_block@0: - byte 0x00000000000001c8 // 0x00000000000001c8 456 abi_routing/contract.py:118 - retsub // 0x00000000000001c8 return arc4.UInt64(456) abi_routing/contract.py:118 + byte 0x00000000000001c8 // 0x00000000000001c8 456 abi_routing/contract.py:118 + retsub // 0x00000000000001c8 return arc4.UInt64(456) abi_routing/contract.py:118 // test_cases.abi_routing.contract.Reference.get_app() -> bytes: get_app: - proto 0 1 // @arc4.abimethod(readonly=True, name="get_application")\ndef get_app(self) -> arc4.UInt64: abi_routing/contract.py:120-121 + proto 0 1 // @arc4.abimethod(readonly=True, name="get_application")\ndef get_app(self) -> arc4.UInt64: abi_routing/contract.py:120-121 get_app_block@0: - byte 0x00000000000001c8 // 0x00000000000001c8 456 abi_routing/contract.py:122 - retsub // 0x00000000000001c8 return arc4.UInt64(456) abi_routing/contract.py:122 + byte 0x00000000000001c8 // 0x00000000000001c8 456 abi_routing/contract.py:122 + retsub // 0x00000000000001c8 return arc4.UInt64(456) abi_routing/contract.py:122 // test_cases.abi_routing.contract.Reference.get_a_int() -> bytes: get_a_int: - proto 0 1 // @arc4.abimethod(readonly=True, name="get_an_int")\ndef get_a_int(self) -> arc4.UInt64: abi_routing/contract.py:124-125 + proto 0 1 // @arc4.abimethod(readonly=True, name="get_an_int")\ndef get_a_int(self) -> arc4.UInt64: abi_routing/contract.py:124-125 get_a_int_block@0: - byte 0x0000000000000003 // 0x0000000000000003 3 abi_routing/contract.py:126 - retsub // 0x0000000000000003 return arc4.UInt64(3) abi_routing/contract.py:126 + byte 0x0000000000000003 // 0x0000000000000003 3 abi_routing/contract.py:126 + retsub // 0x0000000000000003 return arc4.UInt64(3) abi_routing/contract.py:126 // test_cases.abi_routing.contract.Reference.method_with_default_args(asset_from_storage: uint64, asset_from_function: uint64, account_from_storage: bytes, account_from_function: bytes, application_from_storage: uint64, application_from_function: uint64, bytes_from_storage: bytes, int_from_storage: bytes, int_from_function: bytes) -> void: method_with_default_args: - proto 9 0 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | @arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,... abi_routing/contract.py:128-152 + proto 9 0 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | @arc4.abimethod(\ndefault_args={\n"asset_from_storage": "asa",\n"asset_from_function": get_asset,... abi_routing/contract.py:128-152 method_with_default_args_block@0: - frame_dig -9 // load asset_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_storage#0 asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 - int 123 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_storage#0,123 123 abi_routing/contract.py:153 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%0#0 asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%0#0 assert asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 - assert // wrong asset from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 - frame_dig -8 // load asset_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_function#0 asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 - int 456 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_function#0,456 456 abi_routing/contract.py:154 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%1#0 asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%1#0 assert asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 - assert // wrong asset from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 - global CreatorAddress // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {global} op.Global.creator_address abi_routing/contract.py:155 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%2#0 op.Global.creator_address abi_routing/contract.py:155 - frame_dig -7 // load account_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%2#0,account_from_storage#0 account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 - swap // load tmp%2#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | account_from_storage#0,tmp%2#0 account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%3#0 account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%3#0 assert account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 - assert // wrong account from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 - global ZeroAddress // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {global} op.Global.zero_address abi_routing/contract.py:156 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%4#0 op.Global.zero_address abi_routing/contract.py:156 - frame_dig -6 // load account_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%4#0,account_from_function#0 account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 - swap // load tmp%4#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | account_from_function#0,tmp%4#0 account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%5#0 account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%5#0 assert account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 - assert // wrong account from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 - frame_dig -5 // load application_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_storage#0 application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 - int 123 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_storage#0,123 123 abi_routing/contract.py:157 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%6#0 application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%6#0 assert application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 - assert // wrong application from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 - frame_dig -4 // load application_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_function#0 application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 - int 456 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_function#0,456 456 abi_routing/contract.py:158 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%7#0 application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%7#0 assert application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 - assert // wrong application from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 - frame_dig -3 // load bytes_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | bytes_from_storage#0 bytes_from_storage[0] abi_routing/contract.py:159 - extract 0 1 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {extract} bytes_from_storage[0] abi_routing/contract.py:159 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%9#0 bytes_from_storage[0] abi_routing/contract.py:159 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%9#0 bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 - byte 0x07 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%9#0,0x07 7 abi_routing/contract.py:159 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%10#0 bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%10#0 assert bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 - assert // wrong 0th byte from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 - frame_dig -3 // load bytes_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | bytes_from_storage#0 bytes_from_storage[1] abi_routing/contract.py:160 - extract 1 1 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {extract} bytes_from_storage[1] abi_routing/contract.py:160 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%12#0 bytes_from_storage[1] abi_routing/contract.py:160 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%12#0 bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 - byte 0x08 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%12#0,0x08 8 abi_routing/contract.py:160 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%13#0 bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%13#0 assert bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 - assert // wrong 1st byte from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 - frame_dig -3 // load bytes_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | bytes_from_storage#0 bytes_from_storage[2] abi_routing/contract.py:161 - extract 2 1 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {extract} bytes_from_storage[2] abi_routing/contract.py:161 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%15#0 bytes_from_storage[2] abi_routing/contract.py:161 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%15#0 bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 - byte 0x09 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%15#0,0x09 9 abi_routing/contract.py:161 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%16#0 bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%16#0 assert bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 - assert // wrong 2nd byte from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 - frame_dig -2 // load int_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | int_from_storage#0 int_from_storage.decode() abi_routing/contract.py:162 - btoi // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {btoi} int_from_storage.decode() abi_routing/contract.py:162 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%17#0 int_from_storage.decode() abi_routing/contract.py:162 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%17#0 int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 - int 2 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%17#0,2 2 abi_routing/contract.py:162 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%18#0 int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%18#0 assert int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 - assert // wrong int from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 - frame_dig -1 // load int_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | int_from_function#0 int_from_function.decode() abi_routing/contract.py:163 - btoi // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {btoi} int_from_function.decode() abi_routing/contract.py:163 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%19#0 int_from_function.decode() abi_routing/contract.py:163 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%19#0 int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 - int 3 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%19#0,3 3 abi_routing/contract.py:163 - == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%20#0 int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%20#0 assert int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 - assert // wrong int from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 + frame_dig -9 // load asset_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_storage#0 asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 + int 123 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_storage#0,123 123 abi_routing/contract.py:153 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%0#0 asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%0#0 assert asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 + assert // wrong asset from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert asset_from_storage == Asset(123), "wrong asset from storage" abi_routing/contract.py:153 + frame_dig -8 // load asset_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_function#0 asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 + int 456 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | asset_from_function#0,456 456 abi_routing/contract.py:154 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%1#0 asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%1#0 assert asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 + assert // wrong asset from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert asset_from_function == Asset(456), "wrong asset from function" abi_routing/contract.py:154 + global CreatorAddress // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {global} op.Global.creator_address abi_routing/contract.py:155 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%2#0 op.Global.creator_address abi_routing/contract.py:155 + frame_dig -7 // load account_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%2#0,account_from_storage#0 account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 + swap // load tmp%2#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | account_from_storage#0,tmp%2#0 account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%3#0 account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%3#0 assert account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 + assert // wrong account from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert account_from_storage == op.Global.creator_address, "wrong account from storage" abi_routing/contract.py:155 + global ZeroAddress // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {global} op.Global.zero_address abi_routing/contract.py:156 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%4#0 op.Global.zero_address abi_routing/contract.py:156 + frame_dig -6 // load account_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%4#0,account_from_function#0 account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 + swap // load tmp%4#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | account_from_function#0,tmp%4#0 account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%5#0 account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%5#0 assert account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 + assert // wrong account from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert account_from_function == op.Global.zero_address, "wrong account from function" abi_routing/contract.py:156 + frame_dig -5 // load application_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_storage#0 application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 + int 123 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_storage#0,123 123 abi_routing/contract.py:157 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%6#0 application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%6#0 assert application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 + assert // wrong application from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert application_from_storage == Application(123), "wrong application from storage" abi_routing/contract.py:157 + frame_dig -4 // load application_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_function#0 application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 + int 456 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | application_from_function#0,456 456 abi_routing/contract.py:158 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%7#0 application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%7#0 assert application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 + assert // wrong application from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert application_from_function == Application(456), "wrong application from function" abi_routing/contract.py:158 + frame_dig -3 // load bytes_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | bytes_from_storage#0 bytes_from_storage[0] abi_routing/contract.py:159 + extract 0 1 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {extract} bytes_from_storage[0] abi_routing/contract.py:159 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%9#0 bytes_from_storage[0] abi_routing/contract.py:159 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%9#0 bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 + byte 0x07 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%9#0,0x07 7 abi_routing/contract.py:159 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%10#0 bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%10#0 assert bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 + assert // wrong 0th byte from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert bytes_from_storage[0] == arc4.Byte(7), "wrong 0th byte from storage" abi_routing/contract.py:159 + frame_dig -3 // load bytes_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | bytes_from_storage#0 bytes_from_storage[1] abi_routing/contract.py:160 + extract 1 1 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {extract} bytes_from_storage[1] abi_routing/contract.py:160 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%12#0 bytes_from_storage[1] abi_routing/contract.py:160 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%12#0 bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 + byte 0x08 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%12#0,0x08 8 abi_routing/contract.py:160 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%13#0 bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%13#0 assert bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 + assert // wrong 1st byte from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert bytes_from_storage[1] == arc4.Byte(8), "wrong 1st byte from storage" abi_routing/contract.py:160 + frame_dig -3 // load bytes_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | bytes_from_storage#0 bytes_from_storage[2] abi_routing/contract.py:161 + extract 2 1 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {extract} bytes_from_storage[2] abi_routing/contract.py:161 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%15#0 bytes_from_storage[2] abi_routing/contract.py:161 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%15#0 bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 + byte 0x09 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%15#0,0x09 9 abi_routing/contract.py:161 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%16#0 bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%16#0 assert bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 + assert // wrong 2nd byte from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert bytes_from_storage[2] == arc4.Byte(9), "wrong 2nd byte from storage" abi_routing/contract.py:161 + frame_dig -2 // load int_from_storage#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | int_from_storage#0 int_from_storage.decode() abi_routing/contract.py:162 + btoi // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {btoi} int_from_storage.decode() abi_routing/contract.py:162 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%17#0 int_from_storage.decode() abi_routing/contract.py:162 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%17#0 int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 + int 2 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%17#0,2 2 abi_routing/contract.py:162 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%18#0 int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%18#0 assert int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 + assert // wrong int from storage // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert int_from_storage.decode() == 2, "wrong int from storage" abi_routing/contract.py:162 + frame_dig -1 // load int_from_function#0 from parameters (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | int_from_function#0 int_from_function.decode() abi_routing/contract.py:163 + btoi // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {btoi} int_from_function.decode() abi_routing/contract.py:163 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%19#0 int_from_function.decode() abi_routing/contract.py:163 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%19#0 int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 + int 3 // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%19#0,3 3 abi_routing/contract.py:163 + == // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | {==} int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%20#0 int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | tmp%20#0 assert int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 + assert // wrong int from function // (𝕡) asset_from_storage#0,asset_from_function#0,account_from_storage#0,account_from_function#0,application_from_storage#0,application_from_function#0,bytes_from_storage#0,int_from_storage#0,int_from_function#0 | assert int_from_function.decode() == 3, "wrong int from function" abi_routing/contract.py:163 retsub // // test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(a: bytes, b: bytes, c: bytes, d: uint64, asset: uint64, e: bytes, f: bytes, pay: uint64, g: bytes, h: bytes, i: bytes, j: bytes, k: bytes, l: bytes, m: bytes, n: bytes, o: bytes, p: uint64, q: bytes, r: bytes, s: bytes, t: bytes, asset2: uint64, pay2: uint64, u: bytes, v: bytes) -> bytes: method_with_more_than_15_args: - proto 26 1 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | @arc4.abimethod\ndef method_with_more_than_15_args(\nself,\na: arc4.UInt64,\nb: arc4.UInt64,\nc: ... abi_routing/contract.py:165-195 + proto 26 1 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | @arc4.abimethod\ndef method_with_more_than_15_args(\nself,\na: arc4.UInt64,\nb: arc4.UInt64,\nc: ... abi_routing/contract.py:165-195 method_with_more_than_15_args_block@0: - txn NumAppArgs // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {txn} op.Txn.num_app_args abi_routing/contract.py:200 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%0#0 op.Txn.num_app_args abi_routing/contract.py:200 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%0#0 op.Txn.num_app_args == 16 abi_routing/contract.py:200 - int 16 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%0#0,16 16 abi_routing/contract.py:200 - == // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {==} op.Txn.num_app_args == 16 abi_routing/contract.py:200 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%1#0 op.Txn.num_app_args == 16 abi_routing/contract.py:200 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%1#0 assert op.Txn.num_app_args == 16 abi_routing/contract.py:200 - assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert op.Txn.num_app_args == 16 abi_routing/contract.py:200 - frame_dig -19 // load pay#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | pay#0 pay.amount abi_routing/contract.py:201 - gtxns Amount // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {gtxns} pay.amount abi_routing/contract.py:201 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%2#0 pay.amount abi_routing/contract.py:201 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%2#0 pay.amount == 100000 abi_routing/contract.py:201 - int 100000 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%2#0,100000 100000 abi_routing/contract.py:201 - == // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {==} pay.amount == 100000 abi_routing/contract.py:201 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%3#0 pay.amount == 100000 abi_routing/contract.py:201 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%3#0 assert pay.amount == 100000 abi_routing/contract.py:201 - assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert pay.amount == 100000 abi_routing/contract.py:201 - frame_dig -3 // load pay2#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | pay2#0 pay2.amount abi_routing/contract.py:202 - gtxns Amount // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {gtxns} pay2.amount abi_routing/contract.py:202 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%4#0 pay2.amount abi_routing/contract.py:202 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%4#0 pay2.amount == 200000 abi_routing/contract.py:202 - int 200000 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%4#0,200000 200000 abi_routing/contract.py:202 - == // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {==} pay2.amount == 200000 abi_routing/contract.py:202 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%5#0 pay2.amount == 200000 abi_routing/contract.py:202 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%5#0 assert pay2.amount == 200000 abi_routing/contract.py:202 - assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert pay2.amount == 200000 abi_routing/contract.py:202 - frame_dig -22 // load asset#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | asset#0 assert asset.asset_id abi_routing/contract.py:203 - assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert asset.asset_id abi_routing/contract.py:203 - frame_dig -4 // load asset2#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | asset2#0 assert asset2.asset_id abi_routing/contract.py:204 - assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert asset2.asset_id abi_routing/contract.py:204 - frame_dig -6 // load s#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | s#0 s + t abi_routing/contract.py:206 - frame_dig -5 // load t#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | s#0,t#0 s + t abi_routing/contract.py:206 - concat // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {concat} s + t abi_routing/contract.py:206 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%6#0 s + t abi_routing/contract.py:206 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%6#0 log(s + t) abi_routing/contract.py:206 - log // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | log(s + t) abi_routing/contract.py:206 - frame_dig -26 // load a#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | a#0 a.decode() abi_routing/contract.py:209 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {btoi} a.decode() abi_routing/contract.py:209 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0 a.decode() abi_routing/contract.py:209 - frame_dig -25 // load b#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,b#0 b.decode() abi_routing/contract.py:210 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,{btoi} b.decode() abi_routing/contract.py:210 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,tmp%8#0 b.decode() abi_routing/contract.py:210 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%8#0,tmp%7#0 a.decode()\n+ b.decode() abi_routing/contract.py:209-210 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,tmp%8#0 a.decode()\n+ b.decode() abi_routing/contract.py:209-210 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode() abi_routing/contract.py:209-210 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0 a.decode()\n+ b.decode() abi_routing/contract.py:209-210 - frame_dig -24 // load c#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,c#0 c.decode() abi_routing/contract.py:211 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,{btoi} c.decode() abi_routing/contract.py:211 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,tmp%10#0 c.decode() abi_routing/contract.py:211 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%10#0,tmp%9#0 a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,tmp%10#0 a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%11#0 a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%11#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 - frame_dig -23 // load d#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%11#0,d#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 - frame_dig -21 // load e#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,e#0 e.decode() abi_routing/contract.py:213 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,{btoi} e.decode() abi_routing/contract.py:213 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,tmp%13#0 e.decode() abi_routing/contract.py:213 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%13#0,tmp%12#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,tmp%13#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 - frame_dig -20 // load f#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,f#0 f.decode() abi_routing/contract.py:214 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,{btoi} f.decode() abi_routing/contract.py:214 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,tmp%15#0 f.decode() abi_routing/contract.py:214 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%15#0,tmp%14#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,tmp%15#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 - frame_dig -18 // load g#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,g#0 g.decode() abi_routing/contract.py:215 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,{btoi} g.decode() abi_routing/contract.py:215 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,tmp%17#0 g.decode() abi_routing/contract.py:215 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%17#0,tmp%16#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,tmp%17#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 - frame_dig -17 // load h#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,h#0 h.decode() abi_routing/contract.py:216 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,{btoi} h.decode() abi_routing/contract.py:216 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,tmp%19#0 h.decode() abi_routing/contract.py:216 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%19#0,tmp%18#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,tmp%19#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 - frame_dig -16 // load i#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,i#0 i.decode() abi_routing/contract.py:217 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,{btoi} i.decode() abi_routing/contract.py:217 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,tmp%21#0 i.decode() abi_routing/contract.py:217 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%21#0,tmp%20#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,tmp%21#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 - frame_dig -15 // load j#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,j#0 j.decode() abi_routing/contract.py:218 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,{btoi} j.decode() abi_routing/contract.py:218 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,tmp%23#0 j.decode() abi_routing/contract.py:218 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%23#0,tmp%22#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,tmp%23#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 - frame_dig -14 // load k#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,k#0 k.decode() abi_routing/contract.py:219 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,{btoi} k.decode() abi_routing/contract.py:219 - // virtual: store tmp%25#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,tmp%25#0 k.decode() abi_routing/contract.py:219 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%25#0,tmp%24#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 - // virtual: load tmp%25#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,tmp%25#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 - // virtual: store tmp%26#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 - frame_dig -13 // load l#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,l#0 l.decode() abi_routing/contract.py:220 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,{btoi} l.decode() abi_routing/contract.py:220 - // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,tmp%27#0 l.decode() abi_routing/contract.py:220 - // virtual: load tmp%26#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%27#0,tmp%26#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,tmp%27#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 - // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 - frame_dig -12 // load m#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,m#0 m.decode() abi_routing/contract.py:221 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,{btoi} m.decode() abi_routing/contract.py:221 - // virtual: store tmp%29#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,tmp%29#0 m.decode() abi_routing/contract.py:221 - // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%29#0,tmp%28#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 - // virtual: load tmp%29#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,tmp%29#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 - // virtual: store tmp%30#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 - frame_dig -11 // load n#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,n#0 n.decode() abi_routing/contract.py:222 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,{btoi} n.decode() abi_routing/contract.py:222 - // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,tmp%31#0 n.decode() abi_routing/contract.py:222 - // virtual: load tmp%30#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%31#0,tmp%30#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 - // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,tmp%31#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 - // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 - frame_dig -10 // load o#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,o#0 o.decode() abi_routing/contract.py:223 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,{btoi} o.decode() abi_routing/contract.py:223 - // virtual: store tmp%33#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,tmp%33#0 o.decode() abi_routing/contract.py:223 - // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%33#0,tmp%32#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 - // virtual: load tmp%33#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,tmp%33#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 - // virtual: store tmp%34#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%34#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 - // virtual: load tmp%34#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%34#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 - frame_dig -9 // load p#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%34#0,p#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 - // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 - frame_dig -8 // load q#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,q#0 q.decode() abi_routing/contract.py:225 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,{btoi} q.decode() abi_routing/contract.py:225 - // virtual: store tmp%36#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,tmp%36#0 q.decode() abi_routing/contract.py:225 - // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%36#0,tmp%35#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 - // virtual: load tmp%36#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,tmp%36#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 - // virtual: store tmp%37#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 - frame_dig -7 // load r#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,r#0 r.decode() abi_routing/contract.py:226 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,{btoi} r.decode() abi_routing/contract.py:226 - // virtual: store tmp%38#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,tmp%38#0 r.decode() abi_routing/contract.py:226 - // virtual: load tmp%37#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%38#0,tmp%37#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 - // virtual: load tmp%38#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,tmp%38#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 - // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 - frame_dig -2 // load u#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,u#0 u.decode() abi_routing/contract.py:227 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,{btoi} u.decode() abi_routing/contract.py:227 - // virtual: store tmp%40#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,tmp%40#0 u.decode() abi_routing/contract.py:227 - // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%40#0,tmp%39#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 - // virtual: load tmp%40#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,tmp%40#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 - // virtual: store tmp%41#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 - frame_dig -1 // load v#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,v#0 v.decode() abi_routing/contract.py:228 - btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,{btoi} v.decode() abi_routing/contract.py:228 - // virtual: store tmp%42#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,tmp%42#0 v.decode() abi_routing/contract.py:228 - // virtual: load tmp%41#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%42#0,tmp%41#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 - // virtual: load tmp%42#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,tmp%42#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 - + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 - // virtual: store tmp%43#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%43#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 - // virtual: load tmp%43#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%43#0 arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode... abi_routing/contract.py:208-229 - itob // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {itob} arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode... abi_routing/contract.py:208-229 - // virtual: store val_as_bytes%44#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | val_as_bytes%44#0 arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode... abi_routing/contract.py:208-229 - // virtual: load val_as_bytes%44#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | val_as_bytes%44#0 return arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g... abi_routing/contract.py:208-229 - retsub // val_as_bytes%44#0 return arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g... abi_routing/contract.py:208-229 + txn NumAppArgs // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {txn} op.Txn.num_app_args abi_routing/contract.py:200 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%0#0 op.Txn.num_app_args abi_routing/contract.py:200 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%0#0 op.Txn.num_app_args == 16 abi_routing/contract.py:200 + int 16 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%0#0,16 16 abi_routing/contract.py:200 + == // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {==} op.Txn.num_app_args == 16 abi_routing/contract.py:200 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%1#0 op.Txn.num_app_args == 16 abi_routing/contract.py:200 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%1#0 assert op.Txn.num_app_args == 16 abi_routing/contract.py:200 + assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert op.Txn.num_app_args == 16 abi_routing/contract.py:200 + frame_dig -19 // load pay#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | pay#0 pay.amount abi_routing/contract.py:201 + gtxns Amount // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {gtxns} pay.amount abi_routing/contract.py:201 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%2#0 pay.amount abi_routing/contract.py:201 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%2#0 pay.amount == 100000 abi_routing/contract.py:201 + int 100000 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%2#0,100000 100000 abi_routing/contract.py:201 + == // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {==} pay.amount == 100000 abi_routing/contract.py:201 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%3#0 pay.amount == 100000 abi_routing/contract.py:201 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%3#0 assert pay.amount == 100000 abi_routing/contract.py:201 + assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert pay.amount == 100000 abi_routing/contract.py:201 + frame_dig -3 // load pay2#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | pay2#0 pay2.amount abi_routing/contract.py:202 + gtxns Amount // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {gtxns} pay2.amount abi_routing/contract.py:202 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%4#0 pay2.amount abi_routing/contract.py:202 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%4#0 pay2.amount == 200000 abi_routing/contract.py:202 + int 200000 // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%4#0,200000 200000 abi_routing/contract.py:202 + == // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {==} pay2.amount == 200000 abi_routing/contract.py:202 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%5#0 pay2.amount == 200000 abi_routing/contract.py:202 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%5#0 assert pay2.amount == 200000 abi_routing/contract.py:202 + assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert pay2.amount == 200000 abi_routing/contract.py:202 + frame_dig -22 // load asset#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | asset#0 assert asset.asset_id abi_routing/contract.py:203 + assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert asset.asset_id abi_routing/contract.py:203 + frame_dig -4 // load asset2#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | asset2#0 assert asset2.asset_id abi_routing/contract.py:204 + assert // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | assert asset2.asset_id abi_routing/contract.py:204 + frame_dig -6 // load s#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | s#0 s + t abi_routing/contract.py:206 + frame_dig -5 // load t#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | s#0,t#0 s + t abi_routing/contract.py:206 + concat // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {concat} s + t abi_routing/contract.py:206 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%6#0 s + t abi_routing/contract.py:206 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%6#0 log(s + t) abi_routing/contract.py:206 + log // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | log(s + t) abi_routing/contract.py:206 + frame_dig -26 // load a#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | a#0 a.decode() abi_routing/contract.py:209 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {btoi} a.decode() abi_routing/contract.py:209 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0 a.decode() abi_routing/contract.py:209 + frame_dig -25 // load b#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,b#0 b.decode() abi_routing/contract.py:210 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,{btoi} b.decode() abi_routing/contract.py:210 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,tmp%8#0 b.decode() abi_routing/contract.py:210 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%8#0,tmp%7#0 a.decode()\n+ b.decode() abi_routing/contract.py:209-210 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%7#0,tmp%8#0 a.decode()\n+ b.decode() abi_routing/contract.py:209-210 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode() abi_routing/contract.py:209-210 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0 a.decode()\n+ b.decode() abi_routing/contract.py:209-210 + frame_dig -24 // load c#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,c#0 c.decode() abi_routing/contract.py:211 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,{btoi} c.decode() abi_routing/contract.py:211 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,tmp%10#0 c.decode() abi_routing/contract.py:211 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%10#0,tmp%9#0 a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%9#0,tmp%10#0 a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%11#0 a.decode()\n+ b.decode()\n+ c.decode() abi_routing/contract.py:209-211 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%11#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 + frame_dig -23 // load d#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%11#0,d#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d abi_routing/contract.py:209-212 + frame_dig -21 // load e#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,e#0 e.decode() abi_routing/contract.py:213 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,{btoi} e.decode() abi_routing/contract.py:213 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,tmp%13#0 e.decode() abi_routing/contract.py:213 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%13#0,tmp%12#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%12#0,tmp%13#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode() abi_routing/contract.py:209-213 + frame_dig -20 // load f#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,f#0 f.decode() abi_routing/contract.py:214 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,{btoi} f.decode() abi_routing/contract.py:214 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,tmp%15#0 f.decode() abi_routing/contract.py:214 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%15#0,tmp%14#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%14#0,tmp%15#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode() abi_routing/contract.py:209-214 + frame_dig -18 // load g#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,g#0 g.decode() abi_routing/contract.py:215 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,{btoi} g.decode() abi_routing/contract.py:215 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,tmp%17#0 g.decode() abi_routing/contract.py:215 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%17#0,tmp%16#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%16#0,tmp%17#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode() abi_routing/contract.py:209-215 + frame_dig -17 // load h#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,h#0 h.decode() abi_routing/contract.py:216 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,{btoi} h.decode() abi_routing/contract.py:216 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,tmp%19#0 h.decode() abi_routing/contract.py:216 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%19#0,tmp%18#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%18#0,tmp%19#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode() abi_routing/contract.py:209-216 + frame_dig -16 // load i#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,i#0 i.decode() abi_routing/contract.py:217 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,{btoi} i.decode() abi_routing/contract.py:217 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,tmp%21#0 i.decode() abi_routing/contract.py:217 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%21#0,tmp%20#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%20#0,tmp%21#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-217 + frame_dig -15 // load j#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,j#0 j.decode() abi_routing/contract.py:218 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,{btoi} j.decode() abi_routing/contract.py:218 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,tmp%23#0 j.decode() abi_routing/contract.py:218 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%23#0,tmp%22#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%22#0,tmp%23#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-218 + frame_dig -14 // load k#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,k#0 k.decode() abi_routing/contract.py:219 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,{btoi} k.decode() abi_routing/contract.py:219 + // virtual: store tmp%25#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,tmp%25#0 k.decode() abi_routing/contract.py:219 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%25#0,tmp%24#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 + // virtual: load tmp%25#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%24#0,tmp%25#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 + // virtual: store tmp%26#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-219 + frame_dig -13 // load l#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,l#0 l.decode() abi_routing/contract.py:220 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,{btoi} l.decode() abi_routing/contract.py:220 + // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,tmp%27#0 l.decode() abi_routing/contract.py:220 + // virtual: load tmp%26#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%27#0,tmp%26#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 + // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%26#0,tmp%27#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 + // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-220 + frame_dig -12 // load m#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,m#0 m.decode() abi_routing/contract.py:221 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,{btoi} m.decode() abi_routing/contract.py:221 + // virtual: store tmp%29#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,tmp%29#0 m.decode() abi_routing/contract.py:221 + // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%29#0,tmp%28#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 + // virtual: load tmp%29#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%28#0,tmp%29#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 + // virtual: store tmp%30#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-221 + frame_dig -11 // load n#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,n#0 n.decode() abi_routing/contract.py:222 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,{btoi} n.decode() abi_routing/contract.py:222 + // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,tmp%31#0 n.decode() abi_routing/contract.py:222 + // virtual: load tmp%30#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%31#0,tmp%30#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 + // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%30#0,tmp%31#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 + // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-222 + frame_dig -10 // load o#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,o#0 o.decode() abi_routing/contract.py:223 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,{btoi} o.decode() abi_routing/contract.py:223 + // virtual: store tmp%33#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,tmp%33#0 o.decode() abi_routing/contract.py:223 + // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%33#0,tmp%32#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 + // virtual: load tmp%33#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%32#0,tmp%33#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 + // virtual: store tmp%34#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%34#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-223 + // virtual: load tmp%34#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%34#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 + frame_dig -9 // load p#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%34#0,p#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 + // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-224 + frame_dig -8 // load q#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,q#0 q.decode() abi_routing/contract.py:225 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,{btoi} q.decode() abi_routing/contract.py:225 + // virtual: store tmp%36#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,tmp%36#0 q.decode() abi_routing/contract.py:225 + // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%36#0,tmp%35#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 + // virtual: load tmp%36#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%35#0,tmp%36#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 + // virtual: store tmp%37#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-225 + frame_dig -7 // load r#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,r#0 r.decode() abi_routing/contract.py:226 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,{btoi} r.decode() abi_routing/contract.py:226 + // virtual: store tmp%38#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,tmp%38#0 r.decode() abi_routing/contract.py:226 + // virtual: load tmp%37#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%38#0,tmp%37#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 + // virtual: load tmp%38#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%37#0,tmp%38#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 + // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-226 + frame_dig -2 // load u#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,u#0 u.decode() abi_routing/contract.py:227 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,{btoi} u.decode() abi_routing/contract.py:227 + // virtual: store tmp%40#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,tmp%40#0 u.decode() abi_routing/contract.py:227 + // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%40#0,tmp%39#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 + // virtual: load tmp%40#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%39#0,tmp%40#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 + // virtual: store tmp%41#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-227 + frame_dig -1 // load v#0 from parameters (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,v#0 v.decode() abi_routing/contract.py:228 + btoi // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,{btoi} v.decode() abi_routing/contract.py:228 + // virtual: store tmp%42#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,tmp%42#0 v.decode() abi_routing/contract.py:228 + // virtual: load tmp%41#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%42#0,tmp%41#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 + // virtual: load tmp%42#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%41#0,tmp%42#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 + + // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {+} a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 + // virtual: store tmp%43#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%43#0 a.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode()\n+ h.decode... abi_routing/contract.py:209-228 + // virtual: load tmp%43#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | tmp%43#0 arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode... abi_routing/contract.py:208-229 + itob // (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | {itob} arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode... abi_routing/contract.py:208-229 + // virtual: store val_as_bytes%44#0 to l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | val_as_bytes%44#0 arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g.decode... abi_routing/contract.py:208-229 + // virtual: load val_as_bytes%44#0 from l-stack (no copy) (𝕡) a#0,b#0,c#0,d#0,asset#0,e#0,f#0,pay#0,g#0,h#0,i#0,j#0,k#0,l#0,m#0,n#0,o#0,p#0,q#0,r#0,s#0,t#0,asset2#0,pay2#0,u#0,v#0 | val_as_bytes%44#0 return arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g... abi_routing/contract.py:208-229 + retsub // val_as_bytes%44#0 return arc4.UInt64(\na.decode()\n+ b.decode()\n+ c.decode()\n+ d\n+ e.decode()\n+ f.decode()\n+ g... abi_routing/contract.py:208-229 // test_cases.abi_routing.contract.Reference.bare_abi_config() -> void: bare_abi_config: - proto 0 0 // @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 + proto 0 0 // @arc4.baremethod(\nallow_actions=[\n"NoOp",\n"OptIn",\n"CloseOut",\n"UpdateApplication",\n"Delete... abi_routing/contract.py:65-75 bare_abi_config_block@0: - byte "Hello World" // "Hello World" b"Hello World" abi_routing/contract.py:76 - log // log(b"Hello World") abi_routing/contract.py:76 + byte "Hello World" // "Hello World" b"Hello World" abi_routing/contract.py:76 + log // log(b"Hello World") abi_routing/contract.py:76 retsub // // test_cases.abi_routing.contract.Reference.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: abi_routing/contract.py:22 + proto 0 0 // def __init__(self) -> None: abi_routing/contract.py:22 __init___block@0: - byte "asa" // "asa" self.asa abi_routing/contract.py:23 - int 123 // "asa",123 123 abi_routing/contract.py:23 - app_global_put // self.asa = Asset(123) abi_routing/contract.py:23 - byte "an_int" // "an_int" self.an_int abi_routing/contract.py:24 - int 2 // "an_int",2 2 abi_routing/contract.py:24 - app_global_put // self.an_int = UInt64(2) abi_routing/contract.py:24 - byte "some_bytes" // "some_bytes" self.some_bytes abi_routing/contract.py:25 - byte 0x070809 // "some_bytes",0x070809 Bytes3(arc4.Byte(7), arc4.Byte(8), arc4.Byte(9)) abi_routing/contract.py:25 - app_global_put // self.some_bytes = Bytes3(arc4.Byte(7), arc4.Byte(8), arc4.Byte(9)) abi_routing/contract.py:25 - txn Sender // {txn} op.Txn.sender abi_routing/contract.py:26 - // virtual: store new_state_value%1#0 to l-stack (no copy) new_state_value%1#0 op.Txn.sender abi_routing/contract.py:26 - byte "creator" // new_state_value%1#0,"creator" self.creator abi_routing/contract.py:26 - swap // load new_state_value%1#0 from l-stack (no copy) "creator",new_state_value%1#0 self.creator = op.Txn.sender abi_routing/contract.py:26 - app_global_put // self.creator = op.Txn.sender abi_routing/contract.py:26 - byte "app" // "app" self.app abi_routing/contract.py:27 - int 123 // "app",123 123 abi_routing/contract.py:27 - app_global_put // self.app = Application(123) abi_routing/contract.py:27 - method "get(uint64,byte[])byte[]" // method<"get(uint64,byte[])byte[]"> arc4.arc4_signature("get(uint64,byte[])byte[]") abi_routing/contract.py:29 - len // {len} arc4.arc4_signature("get(uint64,byte[])byte[]") abi_routing/contract.py:29 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 arc4.arc4_signature("get(uint64,byte[])byte[]") abi_routing/contract.py:29 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 assert arc4.arc4_signature("get(uint64,byte[])byte[]"), "has method selector" abi_routing/contract.py:29 - assert // has method selector // assert arc4.arc4_signature("get(uint64,byte[])byte[]"), "has method selector" abi_routing/contract.py:29 + byte "asa" // "asa" self.asa abi_routing/contract.py:23 + int 123 // "asa",123 123 abi_routing/contract.py:23 + app_global_put // self.asa = Asset(123) abi_routing/contract.py:23 + byte "an_int" // "an_int" self.an_int abi_routing/contract.py:24 + int 2 // "an_int",2 2 abi_routing/contract.py:24 + app_global_put // self.an_int = UInt64(2) abi_routing/contract.py:24 + byte "some_bytes" // "some_bytes" self.some_bytes abi_routing/contract.py:25 + byte 0x070809 // "some_bytes",0x070809 Bytes3(arc4.Byte(7), arc4.Byte(8), arc4.Byte(9)) abi_routing/contract.py:25 + app_global_put // self.some_bytes = Bytes3(arc4.Byte(7), arc4.Byte(8), arc4.Byte(9)) abi_routing/contract.py:25 + txn Sender // {txn} op.Txn.sender abi_routing/contract.py:26 + // virtual: store new_state_value%1#0 to l-stack (no copy) new_state_value%1#0 op.Txn.sender abi_routing/contract.py:26 + byte "creator" // new_state_value%1#0,"creator" self.creator abi_routing/contract.py:26 + swap // load new_state_value%1#0 from l-stack (no copy) "creator",new_state_value%1#0 self.creator = op.Txn.sender abi_routing/contract.py:26 + app_global_put // self.creator = op.Txn.sender abi_routing/contract.py:26 + byte "app" // "app" self.app abi_routing/contract.py:27 + int 123 // "app",123 123 abi_routing/contract.py:27 + app_global_put // self.app = Application(123) abi_routing/contract.py:27 + method "get(uint64,byte[])byte[]" // method<"get(uint64,byte[])byte[]"> arc4.arc4_signature("get(uint64,byte[])byte[]") abi_routing/contract.py:29 + len // {len} arc4.arc4_signature("get(uint64,byte[])byte[]") abi_routing/contract.py:29 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 arc4.arc4_signature("get(uint64,byte[])byte[]") abi_routing/contract.py:29 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 assert arc4.arc4_signature("get(uint64,byte[])byte[]"), "has method selector" abi_routing/contract.py:29 + assert // has method selector // assert arc4.arc4_signature("get(uint64,byte[])byte[]"), "has method selector" abi_routing/contract.py:29 retsub // diff --git a/test_cases/abi_routing/out/Reference.destructured.ir b/test_cases/abi_routing/out/Reference.destructured.ir index 1d94fe44a0..68603a24bc 100644 --- a/test_cases/abi_routing/out/Reference.destructured.ir +++ b/test_cases/abi_routing/out/Reference.destructured.ir @@ -264,9 +264,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -280,9 +280,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/out/Reference.ssa.ir b/test_cases/abi_routing/out/Reference.ssa.ir index f3183f48ff..8279dcf93c 100644 --- a/test_cases/abi_routing/out/Reference.ssa.ir +++ b/test_cases/abi_routing/out/Reference.ssa.ir @@ -273,9 +273,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -289,9 +289,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir index f6ccd1bdc6..1f2b56d02b 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir @@ -264,9 +264,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -280,9 +280,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir index 7d9e00081f..f84305b125 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir @@ -264,9 +264,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -280,9 +280,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir index 78d2e16cda..5b320b76ba 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir @@ -264,9 +264,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -280,9 +280,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir index 50205de6b2..93c3f8a141 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir @@ -264,9 +264,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -280,9 +280,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/out_O2/Reference.destructured.ir b/test_cases/abi_routing/out_O2/Reference.destructured.ir index 1d94fe44a0..68603a24bc 100644 --- a/test_cases/abi_routing/out_O2/Reference.destructured.ir +++ b/test_cases/abi_routing/out_O2/Reference.destructured.ir @@ -264,9 +264,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -280,9 +280,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir index 626c0fb6c1..22f09bcf77 100644 --- a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir +++ b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir @@ -276,9 +276,9 @@ contract test_cases.abi_routing.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -292,9 +292,9 @@ contract test_cases.abi_routing.contract.Reference: subroutine test_cases.abi_routing.contract.Reference.with_transactions(asset: uint64, an_int: bytes, pay: uint64, another_int: bytes) -> void: block@0: // L95 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // is correct asset let tmp%3#0: uint64 = (btoi an_int#0) let tmp%4#0: uint64 = (== tmp%3#0 1u) diff --git a/test_cases/abi_routing/puya.log b/test_cases/abi_routing/puya.log index 452ab57570..097550a697 100644 --- a/test_cases/abi_routing/puya.log +++ b/test_cases/abi_routing/puya.log @@ -1729,12 +1729,12 @@ debug: Inserted opt_into_asset_block@0.ops[33]: 'store tmp%6#0 to l-stack (copy) debug: Replaced opt_into_asset_block@0.ops[35]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted opt_into_asset_block@0.ops[3]: 'store tmp%1#0 to l-stack (copy)' debug: Replaced opt_into_asset_block@0.ops[6]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted opt_into_asset_block@0.ops[15]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced opt_into_asset_block@0.ops[18]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted opt_into_asset_block@0.ops[15]: 'store asa_exists%4#0 to l-stack (copy)' +debug: Replaced opt_into_asset_block@0.ops[18]: 'load asa_exists%4#0' with 'load asa_exists%4#0 from l-stack (no copy)' debug: Inserted opt_into_asset_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced opt_into_asset_block@0.ops[6]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' -debug: Inserted opt_into_asset_block@0.ops[18]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced opt_into_asset_block@0.ops[22]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' +debug: Inserted opt_into_asset_block@0.ops[18]: 'store asa_value%3#0 to l-stack (copy)' +debug: Replaced opt_into_asset_block@0.ops[22]: 'load asa_value%3#0' with 'load asa_value%3#0 from l-stack (no copy)' debug: Inserted with_transactions_block@0.ops[10]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced with_transactions_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted with_transactions_block@0.ops[16]: 'store tmp%3#0 to l-stack (copy)' @@ -1747,12 +1747,12 @@ debug: Inserted with_transactions_block@0.ops[39]: 'store tmp%8#0 to l-stack (co debug: Replaced with_transactions_block@0.ops[41]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' debug: Inserted with_transactions_block@0.ops[44]: 'store tmp%9#0 to l-stack (copy)' debug: Replaced with_transactions_block@0.ops[46]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' -debug: Inserted with_transactions_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced with_transactions_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted with_transactions_block@0.ops[3]: 'store asa_exists%1#0 to l-stack (copy)' +debug: Replaced with_transactions_block@0.ops[6]: 'load asa_exists%1#0' with 'load asa_exists%1#0 from l-stack (no copy)' debug: Inserted with_transactions_block@0.ops[30]: 'store tmp%6#0 to l-stack (copy)' debug: Replaced with_transactions_block@0.ops[33]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' -debug: Inserted with_transactions_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced with_transactions_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted with_transactions_block@0.ops[5]: 'store asa_value%0#0 to l-stack (copy)' +debug: Replaced with_transactions_block@0.ops[9]: 'load asa_value%0#0' with 'load asa_value%0#0 from l-stack (no copy)' debug: Inserted with_transactions_block@0.ops[29]: 'store tmp%5#0 to l-stack (copy)' debug: Replaced with_transactions_block@0.ops[34]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' debug: Inserted compare_assets_block@0.ops[3]: 'store tmp%0#0 to l-stack (copy)' diff --git a/test_cases/asset/out/Reference.approval.mir b/test_cases/asset/out/Reference.approval.mir index 519acc7c34..becd604e25 100644 --- a/test_cases/asset/out/Reference.approval.mir +++ b/test_cases/asset/out/Reference.approval.mir @@ -1,12 +1,12 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.asset.contract.Reference.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} - // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // // Implicit fall through to main_on_create@1 // @@ -15,282 +15,282 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txn NumAppArgs // {txn} Txn.num_app_args asset/contract.py:21 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 Txn.num_app_args asset/contract.py:21 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 Txn.num_app_args == 1: asset/contract.py:21 - int 1 // tmp%1#0,1 1 asset/contract.py:21 - == // {==} Txn.num_app_args == 1: asset/contract.py:21 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Txn.num_app_args == 1: asset/contract.py:21 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 if Txn.num_app_args == 1: asset/contract.py:21 - bz main_after_if_else@10 // if Txn.num_app_args == 1: asset/contract.py:21 - // Implicit fall through to main_if_body@3 // if Txn.num_app_args == 1: asset/contract.py:21 + txn NumAppArgs // {txn} Txn.num_app_args asset/contract.py:21 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 Txn.num_app_args asset/contract.py:21 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 Txn.num_app_args == 1: asset/contract.py:21 + int 1 // tmp%1#0,1 1 asset/contract.py:21 + == // {==} Txn.num_app_args == 1: asset/contract.py:21 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Txn.num_app_args == 1: asset/contract.py:21 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 if Txn.num_app_args == 1: asset/contract.py:21 + bz main_after_if_else@10 // if Txn.num_app_args == 1: asset/contract.py:21 + // Implicit fall through to main_if_body@3 // if Txn.num_app_args == 1: asset/contract.py:21 main_if_body@3: - txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:22 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 Txn.application_args(0) asset/contract.py:22 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 - byte "opt_in" // tmp%3#0,"opt_in" b"opt_in" asset/contract.py:22 - == // {==} Txn.application_args(0) == b"opt_in": asset/contract.py:22 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 if Txn.application_args(0) == b"opt_in": asset/contract.py:22 - bz main_else_body@5 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 - // Implicit fall through to main_if_body@4 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 + txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:22 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 Txn.application_args(0) asset/contract.py:22 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 + byte "opt_in" // tmp%3#0,"opt_in" b"opt_in" asset/contract.py:22 + == // {==} Txn.application_args(0) == b"opt_in": asset/contract.py:22 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 if Txn.application_args(0) == b"opt_in": asset/contract.py:22 + bz main_else_body@5 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 + // Implicit fall through to main_if_body@4 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 main_if_body@4: - txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:23 - // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:23 - // virtual: load asset#0 from l-stack (no copy) asset#0 self.opt_into_asset(asset) asset/contract.py:24 - callsub opt_into_asset // self.opt_into_asset(asset) asset/contract.py:24 + txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:23 + // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:23 + // virtual: load asset#0 from l-stack (no copy) asset#0 self.opt_into_asset(asset) asset/contract.py:24 + callsub opt_into_asset // self.opt_into_asset(asset) asset/contract.py:24 b main_after_if_else@10 // main_else_body@5: - txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:25 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 Txn.application_args(0) asset/contract.py:25 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - byte "is_opted_in" // tmp%5#0,"is_opted_in" b"is_opted_in" asset/contract.py:25 - == // {==} Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - assert // Expected opt_in or is_opted_in // elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:26 - // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:26 - // virtual: load asset#0 from l-stack (no copy) asset#0 self.is_opted_asset(asset) asset/contract.py:27 - callsub is_opted_asset // self.is_opted_asset(asset) asset/contract.py:27 + txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:25 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 Txn.application_args(0) asset/contract.py:25 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + byte "is_opted_in" // tmp%5#0,"is_opted_in" b"is_opted_in" asset/contract.py:25 + == // {==} Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + assert // Expected opt_in or is_opted_in // elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:26 + // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:26 + // virtual: load asset#0 from l-stack (no copy) asset#0 self.is_opted_asset(asset) asset/contract.py:27 + callsub is_opted_asset // self.is_opted_asset(asset) asset/contract.py:27 // Implicit fall through to main_after_if_else@10 // main_after_if_else@10: - int 1 // 1 True asset/contract.py:30 - return // return True asset/contract.py:30 + int 1 // 1 True asset/contract.py:30 + return // return True asset/contract.py:30 // test_cases.asset.contract.Reference.opt_into_asset(asset: uint64) -> void: opt_into_asset: - proto 1 0 // (𝕡) asset#0 | @subroutine\ndef opt_into_asset(self, asset: Asset) -> None: asset/contract.py:35-36 + proto 1 0 // (𝕡) asset#0 | @subroutine\ndef opt_into_asset(self, asset: Asset) -> None: asset/contract.py:35-36 opt_into_asset_block@0: - txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 - global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 - assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 - int 0 // (𝕡) asset#0 | 0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - byte "asa" // (𝕡) asset#0 | 0,"asa" ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: store app_global_get_ex_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: store app_global_get_ex_value%3#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: load app_global_get_ex_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0,app_global_get_ex_did_exist%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%3#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: load app_global_get_ex_value%3#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 - assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 - byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa asset/contract.py:41-42 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 - app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 - itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nITxnCreate.begin() asset/contract.py:44-45 - int axfer // (𝕡) asset#0 | axfer TransactionType.AssetTransfer asset/contract.py:46 - itxn_field TypeEnum // (𝕡) asset#0 | ITxnCreate.set_type_enum(TransactionType.AssetTransfer) asset/contract.py:46 - int 0 // (𝕡) asset#0 | 0 0 asset/contract.py:47 - itxn_field Fee // (𝕡) asset#0 | ITxnCreate.set_fee(UInt64(0)) asset/contract.py:47 - global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address asset/contract.py:48 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0 | tmp%6#0 Global.current_application_address asset/contract.py:48 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0 | tmp%6#0 ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 - itxn_field AssetReceiver // (𝕡) asset#0 | ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 - itxn_field XferAsset // (𝕡) asset#0 | ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 - itxn_submit // (𝕡) asset#0 | ITxnCreate.submit() asset/contract.py:50 + txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 + global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 + assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 + int 0 // (𝕡) asset#0 | 0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + byte "asa" // (𝕡) asset#0 | 0,"asa" ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: store asa_exists%4#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: store asa_value%3#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: load asa_exists%4#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + assert // check asa exists // (𝕡) asset#0 | asa_value%3#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: load asa_value%3#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 + assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 + byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa asset/contract.py:41-42 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 + app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 + itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nITxnCreate.begin() asset/contract.py:44-45 + int axfer // (𝕡) asset#0 | axfer TransactionType.AssetTransfer asset/contract.py:46 + itxn_field TypeEnum // (𝕡) asset#0 | ITxnCreate.set_type_enum(TransactionType.AssetTransfer) asset/contract.py:46 + int 0 // (𝕡) asset#0 | 0 0 asset/contract.py:47 + itxn_field Fee // (𝕡) asset#0 | ITxnCreate.set_fee(UInt64(0)) asset/contract.py:47 + global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address asset/contract.py:48 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0 | tmp%6#0 Global.current_application_address asset/contract.py:48 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0 | tmp%6#0 ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 + itxn_field AssetReceiver // (𝕡) asset#0 | ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 + itxn_field XferAsset // (𝕡) asset#0 | ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 + itxn_submit // (𝕡) asset#0 | ITxnCreate.submit() asset/contract.py:50 retsub // // test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: is_opted_asset: - proto 1 0 // (𝕡) asset#0 | @subroutine\ndef is_opted_asset(self, asset: Asset) -> None: asset/contract.py:52-53 + proto 1 0 // (𝕡) asset#0 | @subroutine\ndef is_opted_asset(self, asset: Asset) -> None: asset/contract.py:52-53 is_opted_asset_block@0: - int 0 // (𝕡) asset#0 | 0 self.asa asset/contract.py:54 - byte "asa" // (𝕡) asset#0 | 0,"asa" self.asa asset/contract.py:54 - app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa asset/contract.py:54 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.asa asset/contract.py:54 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa asset/contract.py:54 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.asa asset/contract.py:54 - assert // check asa exists // (𝕡) asset#0 | app_global_get_ex_value%0#0 self.asa asset/contract.py:54 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) (𝕡) asset#0 | app_global_get_ex_value%0#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | app_global_get_ex_value%0#0,asset#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - == // (𝕡) asset#0 | {==} self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - assert // asset self.asa == asset // (𝕡) asset#0 | assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.total asset/contract.py:55 - asset_params_get AssetTotal // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.total asset/contract.py:55 - // virtual: store maybe_value_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%4#0,{asset_params_get}.0 asset.total asset/contract.py:55 - // virtual: store maybe_value%3#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0,maybe_value_did_exist%4#0 asset.total asset/contract.py:55 - // virtual: load maybe_value_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0,maybe_value_did_exist%4#0 asset.total asset/contract.py:55 - assert // asset exists // (𝕡) asset#0 | maybe_value%3#0 asset.total asset/contract.py:55 - // virtual: load maybe_value%3#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0 asset.total == 10000000, "total" asset/contract.py:55 - int 10000000 // (𝕡) asset#0 | maybe_value%3#0,10000000 10000000 asset/contract.py:55 - == // (𝕡) asset#0 | {==} asset.total == 10000000, "total" asset/contract.py:55 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 asset.total == 10000000, "total" asset/contract.py:55 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 assert asset.total == 10000000, "total" asset/contract.py:55 - assert // total // (𝕡) asset#0 | assert asset.total == 10000000, "total" asset/contract.py:55 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.decimals asset/contract.py:56 - asset_params_get AssetDecimals // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.decimals asset/contract.py:56 - // virtual: store maybe_value_did_exist%7#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%7#0,{asset_params_get}.0 asset.decimals asset/contract.py:56 - // virtual: store maybe_value%6#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0,maybe_value_did_exist%7#0 asset.decimals asset/contract.py:56 - // virtual: load maybe_value_did_exist%7#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0,maybe_value_did_exist%7#0 asset.decimals asset/contract.py:56 - assert // asset exists // (𝕡) asset#0 | maybe_value%6#0 asset.decimals asset/contract.py:56 - // virtual: load maybe_value%6#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0 asset.decimals == 0, "decimals" asset/contract.py:56 - ! // (𝕡) asset#0 | {!} asset.decimals == 0, "decimals" asset/contract.py:56 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) asset#0 | tmp%8#0 asset.decimals == 0, "decimals" asset/contract.py:56 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) asset#0 | tmp%8#0 assert asset.decimals == 0, "decimals" asset/contract.py:56 - assert // decimals // (𝕡) asset#0 | assert asset.decimals == 0, "decimals" asset/contract.py:56 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.default_frozen asset/contract.py:57 - asset_params_get AssetDefaultFrozen // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.default_frozen asset/contract.py:57 - // virtual: store maybe_value_did_exist%10#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%10#0,{asset_params_get}.0 asset.default_frozen asset/contract.py:57 - // virtual: store maybe_value%9#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0,maybe_value_did_exist%10#0 asset.default_frozen asset/contract.py:57 - // virtual: load maybe_value_did_exist%10#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0,maybe_value_did_exist%10#0 asset.default_frozen asset/contract.py:57 - assert // asset exists // (𝕡) asset#0 | maybe_value%9#0 asset.default_frozen asset/contract.py:57 - // virtual: load maybe_value%9#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0 not asset.default_frozen asset/contract.py:57 - ! // (𝕡) asset#0 | {!} not asset.default_frozen asset/contract.py:57 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) asset#0 | tmp%11#0 not asset.default_frozen asset/contract.py:57 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) asset#0 | tmp%11#0 assert not asset.default_frozen, "default frozen" asset/contract.py:57 - assert // default frozen // (𝕡) asset#0 | assert not asset.default_frozen, "default frozen" asset/contract.py:57 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.unit_name asset/contract.py:58 - asset_params_get AssetUnitName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.unit_name asset/contract.py:58 - // virtual: store maybe_value_did_exist%13#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%13#0,{asset_params_get}.0 asset.unit_name asset/contract.py:58 - // virtual: store maybe_value%12#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0,maybe_value_did_exist%13#0 asset.unit_name asset/contract.py:58 - // virtual: load maybe_value_did_exist%13#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0,maybe_value_did_exist%13#0 asset.unit_name asset/contract.py:58 - assert // asset exists // (𝕡) asset#0 | maybe_value%12#0 asset.unit_name asset/contract.py:58 - // virtual: load maybe_value%12#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 - byte "a" // (𝕡) asset#0 | maybe_value%12#0,"a" b"a" asset/contract.py:58 - == // (𝕡) asset#0 | {==} asset.unit_name == b"a", "unit_name" asset/contract.py:58 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) asset#0 | tmp%14#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) asset#0 | tmp%14#0 assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 - assert // unit_name // (𝕡) asset#0 | assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.name asset/contract.py:59 - asset_params_get AssetName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.name asset/contract.py:59 - // virtual: store maybe_value_did_exist%16#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%16#0,{asset_params_get}.0 asset.name asset/contract.py:59 - // virtual: store maybe_value%15#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0,maybe_value_did_exist%16#0 asset.name asset/contract.py:59 - // virtual: load maybe_value_did_exist%16#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0,maybe_value_did_exist%16#0 asset.name asset/contract.py:59 - assert // asset exists // (𝕡) asset#0 | maybe_value%15#0 asset.name asset/contract.py:59 - // virtual: load maybe_value%15#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0 asset.name == b"asset a", "name" asset/contract.py:59 - byte "asset a" // (𝕡) asset#0 | maybe_value%15#0,"asset a" b"asset a" asset/contract.py:59 - == // (𝕡) asset#0 | {==} asset.name == b"asset a", "name" asset/contract.py:59 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) asset#0 | tmp%17#0 asset.name == b"asset a", "name" asset/contract.py:59 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) asset#0 | tmp%17#0 assert asset.name == b"asset a", "name" asset/contract.py:59 - assert // name // (𝕡) asset#0 | assert asset.name == b"asset a", "name" asset/contract.py:59 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.url asset/contract.py:60 - asset_params_get AssetURL // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.url asset/contract.py:60 - // virtual: store maybe_value_did_exist%19#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%19#0,{asset_params_get}.0 asset.url asset/contract.py:60 - // virtual: store maybe_value%18#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0,maybe_value_did_exist%19#0 asset.url asset/contract.py:60 - // virtual: load maybe_value_did_exist%19#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0,maybe_value_did_exist%19#0 asset.url asset/contract.py:60 - assert // asset exists // (𝕡) asset#0 | maybe_value%18#0 asset.url asset/contract.py:60 - // virtual: load maybe_value%18#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0 asset.url == b"", "URL" asset/contract.py:60 - byte "" // (𝕡) asset#0 | maybe_value%18#0,"" b"" asset/contract.py:60 - == // (𝕡) asset#0 | {==} asset.url == b"", "URL" asset/contract.py:60 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) asset#0 | tmp%20#0 asset.url == b"", "URL" asset/contract.py:60 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) asset#0 | tmp%20#0 assert asset.url == b"", "URL" asset/contract.py:60 - assert // URL // (𝕡) asset#0 | assert asset.url == b"", "URL" asset/contract.py:60 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.metadata_hash asset/contract.py:61 - asset_params_get AssetMetadataHash // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.metadata_hash asset/contract.py:61 - // virtual: store maybe_value_did_exist%22#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%22#0,{asset_params_get}.0 asset.metadata_hash asset/contract.py:61 - // virtual: store maybe_value%21#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,maybe_value_did_exist%22#0 asset.metadata_hash asset/contract.py:61 - // virtual: load maybe_value_did_exist%22#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,maybe_value_did_exist%22#0 asset.metadata_hash asset/contract.py:61 - assert // asset exists // (𝕡) asset#0 | maybe_value%21#0 asset.metadata_hash asset/contract.py:61 - int 32 // (𝕡) asset#0 | maybe_value%21#0,32 32 asset/contract.py:61 - bzero // (𝕡) asset#0 | maybe_value%21#0,{bzero} bzero(32) asset/contract.py:61 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,tmp%23#0 bzero(32) asset/contract.py:61 - // virtual: load maybe_value%21#0 from l-stack (no copy) (𝕡) asset#0 | tmp%23#0,maybe_value%21#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,tmp%23#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - == // (𝕡) asset#0 | {==} asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) asset#0 | tmp%24#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) asset#0 | tmp%24#0 assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - assert // hash // (𝕡) asset#0 | assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.manager asset/contract.py:62 - asset_params_get AssetManager // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.manager asset/contract.py:62 - // virtual: store maybe_value_did_exist%26#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%26#0,{asset_params_get}.0 asset.manager asset/contract.py:62 - // virtual: store maybe_value%25#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,maybe_value_did_exist%26#0 asset.manager asset/contract.py:62 - // virtual: load maybe_value_did_exist%26#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,maybe_value_did_exist%26#0 asset.manager asset/contract.py:62 - assert // asset exists // (𝕡) asset#0 | maybe_value%25#0 asset.manager asset/contract.py:62 - global ZeroAddress // (𝕡) asset#0 | maybe_value%25#0,{global} Global.zero_address asset/contract.py:62 - // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,tmp%27#0 Global.zero_address asset/contract.py:62 - // virtual: load maybe_value%25#0 from l-stack (no copy) (𝕡) asset#0 | tmp%27#0,maybe_value%25#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,tmp%27#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 - == // (𝕡) asset#0 | {==} asset.manager == Global.zero_address, "manager" asset/contract.py:62 - // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) asset#0 | tmp%28#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 - // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) asset#0 | tmp%28#0 assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 - assert // manager // (𝕡) asset#0 | assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.reserve asset/contract.py:63 - asset_params_get AssetReserve // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.reserve asset/contract.py:63 - // virtual: store maybe_value_did_exist%30#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%30#0,{asset_params_get}.0 asset.reserve asset/contract.py:63 - // virtual: store maybe_value%29#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,maybe_value_did_exist%30#0 asset.reserve asset/contract.py:63 - // virtual: load maybe_value_did_exist%30#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,maybe_value_did_exist%30#0 asset.reserve asset/contract.py:63 - assert // asset exists // (𝕡) asset#0 | maybe_value%29#0 asset.reserve asset/contract.py:63 - global ZeroAddress // (𝕡) asset#0 | maybe_value%29#0,{global} Global.zero_address asset/contract.py:63 - // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,tmp%31#0 Global.zero_address asset/contract.py:63 - // virtual: load maybe_value%29#0 from l-stack (no copy) (𝕡) asset#0 | tmp%31#0,maybe_value%29#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,tmp%31#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - == // (𝕡) asset#0 | {==} asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) asset#0 | tmp%32#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) asset#0 | tmp%32#0 assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - assert // reserve // (𝕡) asset#0 | assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.freeze asset/contract.py:64 - asset_params_get AssetFreeze // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.freeze asset/contract.py:64 - // virtual: store maybe_value_did_exist%34#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%34#0,{asset_params_get}.0 asset.freeze asset/contract.py:64 - // virtual: store maybe_value%33#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,maybe_value_did_exist%34#0 asset.freeze asset/contract.py:64 - // virtual: load maybe_value_did_exist%34#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,maybe_value_did_exist%34#0 asset.freeze asset/contract.py:64 - assert // asset exists // (𝕡) asset#0 | maybe_value%33#0 asset.freeze asset/contract.py:64 - global ZeroAddress // (𝕡) asset#0 | maybe_value%33#0,{global} Global.zero_address asset/contract.py:64 - // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,tmp%35#0 Global.zero_address asset/contract.py:64 - // virtual: load maybe_value%33#0 from l-stack (no copy) (𝕡) asset#0 | tmp%35#0,maybe_value%33#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,tmp%35#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - == // (𝕡) asset#0 | {==} asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - // virtual: store tmp%36#0 to l-stack (no copy) (𝕡) asset#0 | tmp%36#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - // virtual: load tmp%36#0 from l-stack (no copy) (𝕡) asset#0 | tmp%36#0 assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - assert // freeze // (𝕡) asset#0 | assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.clawback asset/contract.py:65 - asset_params_get AssetClawback // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.clawback asset/contract.py:65 - // virtual: store maybe_value_did_exist%38#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%38#0,{asset_params_get}.0 asset.clawback asset/contract.py:65 - // virtual: store maybe_value%37#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,maybe_value_did_exist%38#0 asset.clawback asset/contract.py:65 - // virtual: load maybe_value_did_exist%38#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,maybe_value_did_exist%38#0 asset.clawback asset/contract.py:65 - assert // asset exists // (𝕡) asset#0 | maybe_value%37#0 asset.clawback asset/contract.py:65 - global ZeroAddress // (𝕡) asset#0 | maybe_value%37#0,{global} Global.zero_address asset/contract.py:65 - // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,tmp%39#0 Global.zero_address asset/contract.py:65 - // virtual: load maybe_value%37#0 from l-stack (no copy) (𝕡) asset#0 | tmp%39#0,maybe_value%37#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,tmp%39#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - == // (𝕡) asset#0 | {==} asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - // virtual: store tmp%40#0 to l-stack (no copy) (𝕡) asset#0 | tmp%40#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - // virtual: load tmp%40#0 from l-stack (no copy) (𝕡) asset#0 | tmp%40#0 assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - assert // clawback // (𝕡) asset#0 | assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.creator asset/contract.py:66 - asset_params_get AssetCreator // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.creator asset/contract.py:66 - // virtual: store maybe_value_did_exist%42#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%42#0,{asset_params_get}.0 asset.creator asset/contract.py:66 - // virtual: store maybe_value%41#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,maybe_value_did_exist%42#0 asset.creator asset/contract.py:66 - // virtual: load maybe_value_did_exist%42#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,maybe_value_did_exist%42#0 asset.creator asset/contract.py:66 - assert // asset exists // (𝕡) asset#0 | maybe_value%41#0 asset.creator asset/contract.py:66 - global CreatorAddress // (𝕡) asset#0 | maybe_value%41#0,{global} Global.creator_address asset/contract.py:66 - // virtual: store tmp%43#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,tmp%43#0 Global.creator_address asset/contract.py:66 - // virtual: load maybe_value%41#0 from l-stack (no copy) (𝕡) asset#0 | tmp%43#0,maybe_value%41#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 - // virtual: load tmp%43#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,tmp%43#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 - == // (𝕡) asset#0 | {==} asset.creator == Global.creator_address, "creator" asset/contract.py:66 - // virtual: store tmp%44#0 to l-stack (no copy) (𝕡) asset#0 | tmp%44#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 - // virtual: load tmp%44#0 from l-stack (no copy) (𝕡) asset#0 | tmp%44#0 assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 - assert // creator // (𝕡) asset#0 | assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 + int 0 // (𝕡) asset#0 | 0 self.asa asset/contract.py:54 + byte "asa" // (𝕡) asset#0 | 0,"asa" self.asa asset/contract.py:54 + app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa asset/contract.py:54 + // virtual: store asa_exists%1#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%1#0,{app_global_get_ex}.0 self.asa asset/contract.py:54 + // virtual: store asa_value%0#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%0#0,asa_exists%1#0 self.asa asset/contract.py:54 + // virtual: load asa_exists%1#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%0#0,asa_exists%1#0 self.asa asset/contract.py:54 + assert // check asa exists // (𝕡) asset#0 | asa_value%0#0 self.asa asset/contract.py:54 + // virtual: load asa_value%0#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%0#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asa_value%0#0,asset#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + == // (𝕡) asset#0 | {==} self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + assert // asset self.asa == asset // (𝕡) asset#0 | assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.total asset/contract.py:55 + asset_params_get AssetTotal // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.total asset/contract.py:55 + // virtual: store maybe_value_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%4#0,{asset_params_get}.0 asset.total asset/contract.py:55 + // virtual: store maybe_value%3#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0,maybe_value_did_exist%4#0 asset.total asset/contract.py:55 + // virtual: load maybe_value_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0,maybe_value_did_exist%4#0 asset.total asset/contract.py:55 + assert // asset exists // (𝕡) asset#0 | maybe_value%3#0 asset.total asset/contract.py:55 + // virtual: load maybe_value%3#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0 asset.total == 10000000, "total" asset/contract.py:55 + int 10000000 // (𝕡) asset#0 | maybe_value%3#0,10000000 10000000 asset/contract.py:55 + == // (𝕡) asset#0 | {==} asset.total == 10000000, "total" asset/contract.py:55 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 asset.total == 10000000, "total" asset/contract.py:55 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 assert asset.total == 10000000, "total" asset/contract.py:55 + assert // total // (𝕡) asset#0 | assert asset.total == 10000000, "total" asset/contract.py:55 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.decimals asset/contract.py:56 + asset_params_get AssetDecimals // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.decimals asset/contract.py:56 + // virtual: store maybe_value_did_exist%7#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%7#0,{asset_params_get}.0 asset.decimals asset/contract.py:56 + // virtual: store maybe_value%6#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0,maybe_value_did_exist%7#0 asset.decimals asset/contract.py:56 + // virtual: load maybe_value_did_exist%7#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0,maybe_value_did_exist%7#0 asset.decimals asset/contract.py:56 + assert // asset exists // (𝕡) asset#0 | maybe_value%6#0 asset.decimals asset/contract.py:56 + // virtual: load maybe_value%6#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0 asset.decimals == 0, "decimals" asset/contract.py:56 + ! // (𝕡) asset#0 | {!} asset.decimals == 0, "decimals" asset/contract.py:56 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) asset#0 | tmp%8#0 asset.decimals == 0, "decimals" asset/contract.py:56 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) asset#0 | tmp%8#0 assert asset.decimals == 0, "decimals" asset/contract.py:56 + assert // decimals // (𝕡) asset#0 | assert asset.decimals == 0, "decimals" asset/contract.py:56 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.default_frozen asset/contract.py:57 + asset_params_get AssetDefaultFrozen // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.default_frozen asset/contract.py:57 + // virtual: store maybe_value_did_exist%10#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%10#0,{asset_params_get}.0 asset.default_frozen asset/contract.py:57 + // virtual: store maybe_value%9#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0,maybe_value_did_exist%10#0 asset.default_frozen asset/contract.py:57 + // virtual: load maybe_value_did_exist%10#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0,maybe_value_did_exist%10#0 asset.default_frozen asset/contract.py:57 + assert // asset exists // (𝕡) asset#0 | maybe_value%9#0 asset.default_frozen asset/contract.py:57 + // virtual: load maybe_value%9#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0 not asset.default_frozen asset/contract.py:57 + ! // (𝕡) asset#0 | {!} not asset.default_frozen asset/contract.py:57 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) asset#0 | tmp%11#0 not asset.default_frozen asset/contract.py:57 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) asset#0 | tmp%11#0 assert not asset.default_frozen, "default frozen" asset/contract.py:57 + assert // default frozen // (𝕡) asset#0 | assert not asset.default_frozen, "default frozen" asset/contract.py:57 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.unit_name asset/contract.py:58 + asset_params_get AssetUnitName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.unit_name asset/contract.py:58 + // virtual: store maybe_value_did_exist%13#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%13#0,{asset_params_get}.0 asset.unit_name asset/contract.py:58 + // virtual: store maybe_value%12#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0,maybe_value_did_exist%13#0 asset.unit_name asset/contract.py:58 + // virtual: load maybe_value_did_exist%13#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0,maybe_value_did_exist%13#0 asset.unit_name asset/contract.py:58 + assert // asset exists // (𝕡) asset#0 | maybe_value%12#0 asset.unit_name asset/contract.py:58 + // virtual: load maybe_value%12#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 + byte "a" // (𝕡) asset#0 | maybe_value%12#0,"a" b"a" asset/contract.py:58 + == // (𝕡) asset#0 | {==} asset.unit_name == b"a", "unit_name" asset/contract.py:58 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) asset#0 | tmp%14#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) asset#0 | tmp%14#0 assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 + assert // unit_name // (𝕡) asset#0 | assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.name asset/contract.py:59 + asset_params_get AssetName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.name asset/contract.py:59 + // virtual: store maybe_value_did_exist%16#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%16#0,{asset_params_get}.0 asset.name asset/contract.py:59 + // virtual: store maybe_value%15#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0,maybe_value_did_exist%16#0 asset.name asset/contract.py:59 + // virtual: load maybe_value_did_exist%16#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0,maybe_value_did_exist%16#0 asset.name asset/contract.py:59 + assert // asset exists // (𝕡) asset#0 | maybe_value%15#0 asset.name asset/contract.py:59 + // virtual: load maybe_value%15#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0 asset.name == b"asset a", "name" asset/contract.py:59 + byte "asset a" // (𝕡) asset#0 | maybe_value%15#0,"asset a" b"asset a" asset/contract.py:59 + == // (𝕡) asset#0 | {==} asset.name == b"asset a", "name" asset/contract.py:59 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) asset#0 | tmp%17#0 asset.name == b"asset a", "name" asset/contract.py:59 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) asset#0 | tmp%17#0 assert asset.name == b"asset a", "name" asset/contract.py:59 + assert // name // (𝕡) asset#0 | assert asset.name == b"asset a", "name" asset/contract.py:59 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.url asset/contract.py:60 + asset_params_get AssetURL // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.url asset/contract.py:60 + // virtual: store maybe_value_did_exist%19#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%19#0,{asset_params_get}.0 asset.url asset/contract.py:60 + // virtual: store maybe_value%18#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0,maybe_value_did_exist%19#0 asset.url asset/contract.py:60 + // virtual: load maybe_value_did_exist%19#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0,maybe_value_did_exist%19#0 asset.url asset/contract.py:60 + assert // asset exists // (𝕡) asset#0 | maybe_value%18#0 asset.url asset/contract.py:60 + // virtual: load maybe_value%18#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0 asset.url == b"", "URL" asset/contract.py:60 + byte "" // (𝕡) asset#0 | maybe_value%18#0,"" b"" asset/contract.py:60 + == // (𝕡) asset#0 | {==} asset.url == b"", "URL" asset/contract.py:60 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) asset#0 | tmp%20#0 asset.url == b"", "URL" asset/contract.py:60 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) asset#0 | tmp%20#0 assert asset.url == b"", "URL" asset/contract.py:60 + assert // URL // (𝕡) asset#0 | assert asset.url == b"", "URL" asset/contract.py:60 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.metadata_hash asset/contract.py:61 + asset_params_get AssetMetadataHash // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.metadata_hash asset/contract.py:61 + // virtual: store maybe_value_did_exist%22#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%22#0,{asset_params_get}.0 asset.metadata_hash asset/contract.py:61 + // virtual: store maybe_value%21#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,maybe_value_did_exist%22#0 asset.metadata_hash asset/contract.py:61 + // virtual: load maybe_value_did_exist%22#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,maybe_value_did_exist%22#0 asset.metadata_hash asset/contract.py:61 + assert // asset exists // (𝕡) asset#0 | maybe_value%21#0 asset.metadata_hash asset/contract.py:61 + int 32 // (𝕡) asset#0 | maybe_value%21#0,32 32 asset/contract.py:61 + bzero // (𝕡) asset#0 | maybe_value%21#0,{bzero} bzero(32) asset/contract.py:61 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,tmp%23#0 bzero(32) asset/contract.py:61 + // virtual: load maybe_value%21#0 from l-stack (no copy) (𝕡) asset#0 | tmp%23#0,maybe_value%21#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,tmp%23#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + == // (𝕡) asset#0 | {==} asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) asset#0 | tmp%24#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) asset#0 | tmp%24#0 assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + assert // hash // (𝕡) asset#0 | assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.manager asset/contract.py:62 + asset_params_get AssetManager // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.manager asset/contract.py:62 + // virtual: store maybe_value_did_exist%26#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%26#0,{asset_params_get}.0 asset.manager asset/contract.py:62 + // virtual: store maybe_value%25#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,maybe_value_did_exist%26#0 asset.manager asset/contract.py:62 + // virtual: load maybe_value_did_exist%26#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,maybe_value_did_exist%26#0 asset.manager asset/contract.py:62 + assert // asset exists // (𝕡) asset#0 | maybe_value%25#0 asset.manager asset/contract.py:62 + global ZeroAddress // (𝕡) asset#0 | maybe_value%25#0,{global} Global.zero_address asset/contract.py:62 + // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,tmp%27#0 Global.zero_address asset/contract.py:62 + // virtual: load maybe_value%25#0 from l-stack (no copy) (𝕡) asset#0 | tmp%27#0,maybe_value%25#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 + // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,tmp%27#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 + == // (𝕡) asset#0 | {==} asset.manager == Global.zero_address, "manager" asset/contract.py:62 + // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) asset#0 | tmp%28#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 + // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) asset#0 | tmp%28#0 assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 + assert // manager // (𝕡) asset#0 | assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.reserve asset/contract.py:63 + asset_params_get AssetReserve // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.reserve asset/contract.py:63 + // virtual: store maybe_value_did_exist%30#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%30#0,{asset_params_get}.0 asset.reserve asset/contract.py:63 + // virtual: store maybe_value%29#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,maybe_value_did_exist%30#0 asset.reserve asset/contract.py:63 + // virtual: load maybe_value_did_exist%30#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,maybe_value_did_exist%30#0 asset.reserve asset/contract.py:63 + assert // asset exists // (𝕡) asset#0 | maybe_value%29#0 asset.reserve asset/contract.py:63 + global ZeroAddress // (𝕡) asset#0 | maybe_value%29#0,{global} Global.zero_address asset/contract.py:63 + // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,tmp%31#0 Global.zero_address asset/contract.py:63 + // virtual: load maybe_value%29#0 from l-stack (no copy) (𝕡) asset#0 | tmp%31#0,maybe_value%29#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,tmp%31#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + == // (𝕡) asset#0 | {==} asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) asset#0 | tmp%32#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) asset#0 | tmp%32#0 assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + assert // reserve // (𝕡) asset#0 | assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.freeze asset/contract.py:64 + asset_params_get AssetFreeze // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.freeze asset/contract.py:64 + // virtual: store maybe_value_did_exist%34#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%34#0,{asset_params_get}.0 asset.freeze asset/contract.py:64 + // virtual: store maybe_value%33#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,maybe_value_did_exist%34#0 asset.freeze asset/contract.py:64 + // virtual: load maybe_value_did_exist%34#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,maybe_value_did_exist%34#0 asset.freeze asset/contract.py:64 + assert // asset exists // (𝕡) asset#0 | maybe_value%33#0 asset.freeze asset/contract.py:64 + global ZeroAddress // (𝕡) asset#0 | maybe_value%33#0,{global} Global.zero_address asset/contract.py:64 + // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,tmp%35#0 Global.zero_address asset/contract.py:64 + // virtual: load maybe_value%33#0 from l-stack (no copy) (𝕡) asset#0 | tmp%35#0,maybe_value%33#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,tmp%35#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + == // (𝕡) asset#0 | {==} asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + // virtual: store tmp%36#0 to l-stack (no copy) (𝕡) asset#0 | tmp%36#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + // virtual: load tmp%36#0 from l-stack (no copy) (𝕡) asset#0 | tmp%36#0 assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + assert // freeze // (𝕡) asset#0 | assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.clawback asset/contract.py:65 + asset_params_get AssetClawback // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.clawback asset/contract.py:65 + // virtual: store maybe_value_did_exist%38#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%38#0,{asset_params_get}.0 asset.clawback asset/contract.py:65 + // virtual: store maybe_value%37#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,maybe_value_did_exist%38#0 asset.clawback asset/contract.py:65 + // virtual: load maybe_value_did_exist%38#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,maybe_value_did_exist%38#0 asset.clawback asset/contract.py:65 + assert // asset exists // (𝕡) asset#0 | maybe_value%37#0 asset.clawback asset/contract.py:65 + global ZeroAddress // (𝕡) asset#0 | maybe_value%37#0,{global} Global.zero_address asset/contract.py:65 + // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,tmp%39#0 Global.zero_address asset/contract.py:65 + // virtual: load maybe_value%37#0 from l-stack (no copy) (𝕡) asset#0 | tmp%39#0,maybe_value%37#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,tmp%39#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + == // (𝕡) asset#0 | {==} asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + // virtual: store tmp%40#0 to l-stack (no copy) (𝕡) asset#0 | tmp%40#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + // virtual: load tmp%40#0 from l-stack (no copy) (𝕡) asset#0 | tmp%40#0 assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + assert // clawback // (𝕡) asset#0 | assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.creator asset/contract.py:66 + asset_params_get AssetCreator // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.creator asset/contract.py:66 + // virtual: store maybe_value_did_exist%42#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%42#0,{asset_params_get}.0 asset.creator asset/contract.py:66 + // virtual: store maybe_value%41#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,maybe_value_did_exist%42#0 asset.creator asset/contract.py:66 + // virtual: load maybe_value_did_exist%42#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,maybe_value_did_exist%42#0 asset.creator asset/contract.py:66 + assert // asset exists // (𝕡) asset#0 | maybe_value%41#0 asset.creator asset/contract.py:66 + global CreatorAddress // (𝕡) asset#0 | maybe_value%41#0,{global} Global.creator_address asset/contract.py:66 + // virtual: store tmp%43#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,tmp%43#0 Global.creator_address asset/contract.py:66 + // virtual: load maybe_value%41#0 from l-stack (no copy) (𝕡) asset#0 | tmp%43#0,maybe_value%41#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 + // virtual: load tmp%43#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,tmp%43#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 + == // (𝕡) asset#0 | {==} asset.creator == Global.creator_address, "creator" asset/contract.py:66 + // virtual: store tmp%44#0 to l-stack (no copy) (𝕡) asset#0 | tmp%44#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 + // virtual: load tmp%44#0 from l-stack (no copy) (𝕡) asset#0 | tmp%44#0 assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 + assert // creator // (𝕡) asset#0 | assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 retsub // // test_cases.asset.contract.Reference.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: asset/contract.py:17 + proto 0 0 // def __init__(self) -> None: asset/contract.py:17 __init___block@0: - byte "asa" // "asa" self.asa asset/contract.py:18 - int 0 // "asa",0 0 asset/contract.py:18 - app_global_put // self.asa = Asset(0) asset/contract.py:18 + byte "asa" // "asa" self.asa asset/contract.py:18 + int 0 // "asa",0 0 asset/contract.py:18 + app_global_put // self.asa = Asset(0) asset/contract.py:18 retsub // diff --git a/test_cases/asset/out/Reference.destructured.ir b/test_cases/asset/out/Reference.destructured.ir index 2ebc8010bd..546818da9a 100644 --- a/test_cases/asset/out/Reference.destructured.ir +++ b/test_cases/asset/out/Reference.destructured.ir @@ -35,9 +35,9 @@ contract test_cases.asset.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -51,9 +51,9 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) (assert maybe_value_did_exist%4#0) // asset exists diff --git a/test_cases/asset/out/Reference.ssa.ir b/test_cases/asset/out/Reference.ssa.ir index 757de16c9b..5014c98dd7 100644 --- a/test_cases/asset/out/Reference.ssa.ir +++ b/test_cases/asset/out/Reference.ssa.ir @@ -42,9 +42,9 @@ contract test_cases.asset.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -58,9 +58,9 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) (assert maybe_value_did_exist%4#0) // asset exists diff --git a/test_cases/asset/out/Reference.ssa.opt_pass_1.ir b/test_cases/asset/out/Reference.ssa.opt_pass_1.ir index ad249bf7aa..a1f0480564 100644 --- a/test_cases/asset/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/asset/out/Reference.ssa.opt_pass_1.ir @@ -35,9 +35,9 @@ contract test_cases.asset.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -51,9 +51,9 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) (assert maybe_value_did_exist%4#0) // asset exists diff --git a/test_cases/asset/out_O2/Reference.destructured.ir b/test_cases/asset/out_O2/Reference.destructured.ir index 2ebc8010bd..546818da9a 100644 --- a/test_cases/asset/out_O2/Reference.destructured.ir +++ b/test_cases/asset/out_O2/Reference.destructured.ir @@ -35,9 +35,9 @@ contract test_cases.asset.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -51,9 +51,9 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) (assert maybe_value_did_exist%4#0) // asset exists diff --git a/test_cases/asset/out_unoptimized/Reference.destructured.ir b/test_cases/asset/out_unoptimized/Reference.destructured.ir index 28685b4e91..2fc9e0a0e2 100644 --- a/test_cases/asset/out_unoptimized/Reference.destructured.ir +++ b/test_cases/asset/out_unoptimized/Reference.destructured.ir @@ -42,9 +42,9 @@ contract test_cases.asset.contract.Reference: let tmp%1#0: bytes = (global CreatorAddress) let tmp%2#0: uint64 = (== tmp%0#0 tmp%1#0) (assert tmp%2#0) // Only creator can opt in to ASA - let (app_global_get_ex_value%3#0: uint64, app_global_get_ex_did_exist%4#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%4#0) // check asa exists - let tmp%5#0: uint64 = (! app_global_get_ex_value%3#0) + let (asa_value%3#0: uint64, asa_exists%4#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%4#0) // check asa exists + let tmp%5#0: uint64 = (! asa_value%3#0) (assert tmp%5#0) // ASA already opted in (app_global_put "asa" asset#0) itxn_begin @@ -58,9 +58,9 @@ contract test_cases.asset.contract.Reference: subroutine test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: block@0: // L52 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "asa") - (assert app_global_get_ex_did_exist%1#0) // check asa exists - let tmp%2#0: uint64 = (== app_global_get_ex_value%0#0 asset#0) + let (asa_value%0#0: uint64, asa_exists%1#0: uint64) = (app_global_get_ex 0u "asa") + (assert asa_exists%1#0) // check asa exists + let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) (assert maybe_value_did_exist%4#0) // asset exists diff --git a/test_cases/asset/puya.log b/test_cases/asset/puya.log index 0bd48b6939..dc0730224d 100644 --- a/test_cases/asset/puya.log +++ b/test_cases/asset/puya.log @@ -495,12 +495,12 @@ debug: Inserted opt_into_asset_block@0.ops[33]: 'store tmp%6#0 to l-stack (copy) debug: Replaced opt_into_asset_block@0.ops[35]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted opt_into_asset_block@0.ops[3]: 'store tmp%1#0 to l-stack (copy)' debug: Replaced opt_into_asset_block@0.ops[6]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted opt_into_asset_block@0.ops[15]: 'store app_global_get_ex_did_exist%4#0 to l-stack (copy)' -debug: Replaced opt_into_asset_block@0.ops[18]: 'load app_global_get_ex_did_exist%4#0' with 'load app_global_get_ex_did_exist%4#0 from l-stack (no copy)' +debug: Inserted opt_into_asset_block@0.ops[15]: 'store asa_exists%4#0 to l-stack (copy)' +debug: Replaced opt_into_asset_block@0.ops[18]: 'load asa_exists%4#0' with 'load asa_exists%4#0 from l-stack (no copy)' debug: Inserted opt_into_asset_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced opt_into_asset_block@0.ops[6]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' -debug: Inserted opt_into_asset_block@0.ops[18]: 'store app_global_get_ex_value%3#0 to l-stack (copy)' -debug: Replaced opt_into_asset_block@0.ops[22]: 'load app_global_get_ex_value%3#0' with 'load app_global_get_ex_value%3#0 from l-stack (no copy)' +debug: Inserted opt_into_asset_block@0.ops[18]: 'store asa_value%3#0 to l-stack (copy)' +debug: Replaced opt_into_asset_block@0.ops[22]: 'load asa_value%3#0' with 'load asa_value%3#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[10]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[23]: 'store tmp%5#0 to l-stack (copy)' @@ -527,8 +527,8 @@ debug: Inserted is_opted_asset_block@0.ops[162]: 'store tmp%40#0 to l-stack (cop debug: Replaced is_opted_asset_block@0.ops[164]: 'load tmp%40#0' with 'load tmp%40#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[177]: 'store tmp%44#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[179]: 'load tmp%44#0' with 'load tmp%44#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[3]: 'store asa_exists%1#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[6]: 'load asa_exists%1#0' with 'load asa_exists%1#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[17]: 'store maybe_value_did_exist%4#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[20]: 'load maybe_value_did_exist%4#0' with 'load maybe_value_did_exist%4#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[31]: 'store maybe_value_did_exist%7#0 to l-stack (copy)' @@ -565,8 +565,8 @@ debug: Inserted is_opted_asset_block@0.ops[185]: 'store maybe_value_did_exist%42 debug: Replaced is_opted_asset_block@0.ops[188]: 'load maybe_value_did_exist%42#0' with 'load maybe_value_did_exist%42#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[191]: 'store tmp%43#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[194]: 'load tmp%43#0' with 'load tmp%43#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[5]: 'store asa_value%0#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[9]: 'load asa_value%0#0' with 'load asa_value%0#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[20]: 'store maybe_value%3#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[24]: 'load maybe_value%3#0' with 'load maybe_value%3#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[35]: 'store maybe_value%6#0 to l-stack (copy)' diff --git a/test_cases/augmented_assignment/out/Augmented.approval.mir b/test_cases/augmented_assignment/out/Augmented.approval.mir index 39557daf6f..1599e44d1e 100644 --- a/test_cases/augmented_assignment/out/Augmented.approval.mir +++ b/test_cases/augmented_assignment/out/Augmented.approval.mir @@ -1,143 +1,143 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.augmented_assignment.contract.Augmented.approval_program() -> uint64: main: - int 0 // allocate 1 to stack (𝕗) me#0 | + int 0 // allocate 1 to stack (𝕗) me#0 | main_block@0: - txn ApplicationID // (𝕗) me#0 | {txn} - // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) me#0 | app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) me#0 | app_id%0#0 - bnz main_entrypoint@2 // (𝕗) me#0 | - // Implicit fall through to main_on_create@1 // (𝕗) me#0 | + txn ApplicationID // (𝕗) me#0 | {txn} + // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) me#0 | app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) me#0 | app_id%0#0 + bnz main_entrypoint@2 // (𝕗) me#0 | + // Implicit fall through to main_on_create@1 // (𝕗) me#0 | main_on_create@1: - callsub __init__ // (𝕗) me#0 | - // Implicit fall through to main_entrypoint@2 // (𝕗) me#0 | + callsub __init__ // (𝕗) me#0 | + // Implicit fall through to main_entrypoint@2 // (𝕗) me#0 | main_entrypoint@2: - txn Sender // (𝕗) me#0 | {txn} op.Txn.sender augmented_assignment/contract.py:20 - bury 1 // store me#0 to f-stack (𝕗) me#0 | me = op.Txn.sender augmented_assignment/contract.py:20 - txn OnCompletion // (𝕗) me#0 | {txn} op.Txn.on_completion augmented_assignment/contract.py:22 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) me#0 | tmp%1#0 op.Txn.on_completion augmented_assignment/contract.py:22 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) me#0 | tmp%1#0 op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 - int OptIn // (𝕗) me#0 | tmp%1#0,OptIn OnCompleteAction.OptIn augmented_assignment/contract.py:22 - == // (𝕗) me#0 | {==} op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) me#0 | tmp%2#0 op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) me#0 | tmp%2#0 if op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 - bz main_after_if_else@4 // (𝕗) me#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 - // Implicit fall through to main_if_body@3 // (𝕗) me#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 + txn Sender // (𝕗) me#0 | {txn} op.Txn.sender augmented_assignment/contract.py:20 + bury 1 // store me#0 to f-stack (𝕗) me#0 | me = op.Txn.sender augmented_assignment/contract.py:20 + txn OnCompletion // (𝕗) me#0 | {txn} op.Txn.on_completion augmented_assignment/contract.py:22 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) me#0 | tmp%1#0 op.Txn.on_completion augmented_assignment/contract.py:22 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) me#0 | tmp%1#0 op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 + int OptIn // (𝕗) me#0 | tmp%1#0,OptIn OnCompleteAction.OptIn augmented_assignment/contract.py:22 + == // (𝕗) me#0 | {==} op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) me#0 | tmp%2#0 op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) me#0 | tmp%2#0 if op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 + bz main_after_if_else@4 // (𝕗) me#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 + // Implicit fall through to main_if_body@3 // (𝕗) me#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: augmented_assignment/contract.py:22 main_if_body@3: - dup // load me#0 from f-stack (𝕗) me#0 | me#0 self.my_uint[me] = UInt64(0) augmented_assignment/contract.py:23 - dup // store me#0 to l-stack (copy) (𝕗) me#0 | me#0,me#0 self.my_uint[me] = UInt64(0) augmented_assignment/contract.py:23 - byte "my_uint" // (𝕗) me#0 | me#0,me#0,"my_uint" self.my_uint[me] augmented_assignment/contract.py:23 - int 0 // (𝕗) me#0 | me#0,me#0,"my_uint",0 0 augmented_assignment/contract.py:23 - app_local_put // (𝕗) me#0 | me#0 self.my_uint[me] = UInt64(0) augmented_assignment/contract.py:23 - // virtual: load me#0 from l-stack (no copy) (𝕗) me#0 | me#0 self.my_bytes[me] = Bytes(b"") augmented_assignment/contract.py:24 - byte "my_bytes" // (𝕗) me#0 | me#0,"my_bytes" self.my_bytes[me] augmented_assignment/contract.py:24 - byte "" // (𝕗) me#0 | me#0,"my_bytes","" b"" augmented_assignment/contract.py:24 - app_local_put // (𝕗) me#0 | self.my_bytes[me] = Bytes(b"") augmented_assignment/contract.py:24 - // Implicit fall through to main_after_if_else@4 // (𝕗) me#0 | + dup // load me#0 from f-stack (𝕗) me#0 | me#0 self.my_uint[me] = UInt64(0) augmented_assignment/contract.py:23 + dup // store me#0 to l-stack (copy) (𝕗) me#0 | me#0,me#0 self.my_uint[me] = UInt64(0) augmented_assignment/contract.py:23 + byte "my_uint" // (𝕗) me#0 | me#0,me#0,"my_uint" self.my_uint[me] augmented_assignment/contract.py:23 + int 0 // (𝕗) me#0 | me#0,me#0,"my_uint",0 0 augmented_assignment/contract.py:23 + app_local_put // (𝕗) me#0 | me#0 self.my_uint[me] = UInt64(0) augmented_assignment/contract.py:23 + // virtual: load me#0 from l-stack (no copy) (𝕗) me#0 | me#0 self.my_bytes[me] = Bytes(b"") augmented_assignment/contract.py:24 + byte "my_bytes" // (𝕗) me#0 | me#0,"my_bytes" self.my_bytes[me] augmented_assignment/contract.py:24 + byte "" // (𝕗) me#0 | me#0,"my_bytes","" b"" augmented_assignment/contract.py:24 + app_local_put // (𝕗) me#0 | self.my_bytes[me] = Bytes(b"") augmented_assignment/contract.py:24 + // Implicit fall through to main_after_if_else@4 // (𝕗) me#0 | main_after_if_else@4: - txn ApplicationID // (𝕗) me#0 | {txn} op.Txn.application_id augmented_assignment/contract.py:25 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) me#0 | tmp%3#0 op.Txn.application_id augmented_assignment/contract.py:25 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) me#0 | tmp%3#0 op.Txn.application_id > 0: augmented_assignment/contract.py:25 - int 0 // (𝕗) me#0 | tmp%3#0,0 0 augmented_assignment/contract.py:25 - > // (𝕗) me#0 | {>} op.Txn.application_id > 0: augmented_assignment/contract.py:25 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) me#0 | tmp%4#0 op.Txn.application_id > 0: augmented_assignment/contract.py:25 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) me#0 | tmp%4#0 if op.Txn.application_id > 0: augmented_assignment/contract.py:25 - bz main_after_if_else@6 // (𝕗) me#0 | if op.Txn.application_id > 0: augmented_assignment/contract.py:25 - // Implicit fall through to main_if_body@5 // (𝕗) me#0 | if op.Txn.application_id > 0: augmented_assignment/contract.py:25 + txn ApplicationID // (𝕗) me#0 | {txn} op.Txn.application_id augmented_assignment/contract.py:25 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) me#0 | tmp%3#0 op.Txn.application_id augmented_assignment/contract.py:25 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕗) me#0 | tmp%3#0 op.Txn.application_id > 0: augmented_assignment/contract.py:25 + int 0 // (𝕗) me#0 | tmp%3#0,0 0 augmented_assignment/contract.py:25 + > // (𝕗) me#0 | {>} op.Txn.application_id > 0: augmented_assignment/contract.py:25 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) me#0 | tmp%4#0 op.Txn.application_id > 0: augmented_assignment/contract.py:25 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) me#0 | tmp%4#0 if op.Txn.application_id > 0: augmented_assignment/contract.py:25 + bz main_after_if_else@6 // (𝕗) me#0 | if op.Txn.application_id > 0: augmented_assignment/contract.py:25 + // Implicit fall through to main_if_body@5 // (𝕗) me#0 | if op.Txn.application_id > 0: augmented_assignment/contract.py:25 main_if_body@5: - txn NumAppArgs // (𝕗) me#0 | {txn} riable augmented assignment\nn = op.Txn.num_app_args augmented_assignment/contract.py:26-27 - // virtual: store n#0 to l-stack (no copy) (𝕗) me#0 | n#0 # variable augmented assignment\nn = op.Txn.num_app_args augmented_assignment/contract.py:26-27 - dup // load n#0 from l-stack (copy) (𝕗) me#0 | n#0,n#0 bytes_to_add = BigUInt(n).bytes augmented_assignment/contract.py:28 - itob // (𝕗) me#0 | n#0,{itob} BigUInt(n) augmented_assignment/contract.py:28 - swap // store bytes_to_add#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0 bytes_to_add = BigUInt(n).bytes augmented_assignment/contract.py:28 - dig 2 // load me#0 from f-stack (𝕗) me#0 | bytes_to_add#0,n#0,me#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + txn NumAppArgs // (𝕗) me#0 | {txn} riable augmented assignment\nn = op.Txn.num_app_args augmented_assignment/contract.py:26-27 + // virtual: store n#0 to l-stack (no copy) (𝕗) me#0 | n#0 # variable augmented assignment\nn = op.Txn.num_app_args augmented_assignment/contract.py:26-27 + dup // load n#0 from l-stack (copy) (𝕗) me#0 | n#0,n#0 bytes_to_add = BigUInt(n).bytes augmented_assignment/contract.py:28 + itob // (𝕗) me#0 | n#0,{itob} BigUInt(n) augmented_assignment/contract.py:28 + swap // store bytes_to_add#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0 bytes_to_add = BigUInt(n).bytes augmented_assignment/contract.py:28 + dig 2 // load me#0 from f-stack (𝕗) me#0 | bytes_to_add#0,n#0,me#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 dup - cover 2 // store me#0 to l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - int 0 // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - byte "my_uint" // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0,"my_uint" # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - app_local_get_ex // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{app_local_get_ex}.0,{app_local_get_ex}.1 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - // virtual: store app_local_get_ex_did_exist%6#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_did_exist%6#0,{app_local_get_ex}.0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - // virtual: store app_local_get_ex_value%5#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0,app_local_get_ex_did_exist%6#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - // virtual: load app_local_get_ex_did_exist%6#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0,app_local_get_ex_did_exist%6#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - assert // check my_uint exists for account // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - // virtual: load app_local_get_ex_value%5#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 - dig 1 // load n#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%5#0,n#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 - + // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{+} # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 - // virtual: store new_state_value%7#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%7#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 - dig 2 // load me#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%7#0,me#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 - byte "my_uint" // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%7#0,me#0,"my_uint" # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 - uncover 2 // load new_state_value%7#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,"my_uint",new_state_value%7#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 - app_local_put // (𝕗) me#0 | bytes_to_add#0,me#0,n#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 - dig 1 // load me#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0 self.my_bytes[me] augmented_assignment/contract.py:33 - int 0 // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0 self.my_bytes[me] augmented_assignment/contract.py:33 - byte "my_bytes" // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0,"my_bytes" self.my_bytes[me] augmented_assignment/contract.py:33 - app_local_get_ex // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{app_local_get_ex}.0,{app_local_get_ex}.1 self.my_bytes[me] augmented_assignment/contract.py:33 - // virtual: store app_local_get_ex_did_exist%9#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_did_exist%9#0,{app_local_get_ex}.0 self.my_bytes[me] augmented_assignment/contract.py:33 - // virtual: store app_local_get_ex_value%8#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0,app_local_get_ex_did_exist%9#0 self.my_bytes[me] augmented_assignment/contract.py:33 - // virtual: load app_local_get_ex_did_exist%9#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0,app_local_get_ex_did_exist%9#0 self.my_bytes[me] augmented_assignment/contract.py:33 - assert // check my_bytes exists for account // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0 self.my_bytes[me] augmented_assignment/contract.py:33 - // virtual: load app_local_get_ex_value%8#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 - dig 3 // load bytes_to_add#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,app_local_get_ex_value%8#0,bytes_to_add#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 - concat // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{concat} self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 - // virtual: store new_state_value%10#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%10#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 - uncover 2 // load me#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,new_state_value%10#0,me#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 - byte "my_bytes" // (𝕗) me#0 | bytes_to_add#0,n#0,new_state_value%10#0,me#0,"my_bytes" self.my_bytes[me] augmented_assignment/contract.py:33 - uncover 2 // load new_state_value%10#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,me#0,"my_bytes",new_state_value%10#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 - app_local_put // (𝕗) me#0 | bytes_to_add#0,n#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 - int 0 // (𝕗) me#0 | bytes_to_add#0,n#0,0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - byte "global_uint" // (𝕗) me#0 | bytes_to_add#0,n#0,0,"global_uint" # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - app_global_get_ex // (𝕗) me#0 | bytes_to_add#0,n#0,{app_global_get_ex}.0,{app_global_get_ex}.1 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - // virtual: store app_global_get_ex_did_exist%12#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_did_exist%12#0,{app_global_get_ex}.0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - // virtual: store app_global_get_ex_value%11#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - // virtual: load app_global_get_ex_did_exist%12#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0,app_global_get_ex_did_exist%12#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - assert // check global_uint exists // (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - // virtual: load app_global_get_ex_value%11#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,app_global_get_ex_value%11#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 - swap // load n#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%11#0,n#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 - + // (𝕗) me#0 | bytes_to_add#0,{+} # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 - // virtual: store new_state_value%13#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,new_state_value%13#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 - byte "global_uint" // (𝕗) me#0 | bytes_to_add#0,new_state_value%13#0,"global_uint" # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 - swap // load new_state_value%13#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,"global_uint",new_state_value%13#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 - app_global_put // (𝕗) me#0 | bytes_to_add#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 - int 0 // (𝕗) me#0 | bytes_to_add#0,0 self.global_bytes augmented_assignment/contract.py:37 - byte "global_bytes" // (𝕗) me#0 | bytes_to_add#0,0,"global_bytes" self.global_bytes augmented_assignment/contract.py:37 - app_global_get_ex // (𝕗) me#0 | bytes_to_add#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes augmented_assignment/contract.py:37 - // virtual: store app_global_get_ex_did_exist%15#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_did_exist%15#0,{app_global_get_ex}.0 self.global_bytes augmented_assignment/contract.py:37 - // virtual: store app_global_get_ex_value%14#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.global_bytes augmented_assignment/contract.py:37 - // virtual: load app_global_get_ex_did_exist%15#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.global_bytes augmented_assignment/contract.py:37 - assert // check global_bytes exists // (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0 self.global_bytes augmented_assignment/contract.py:37 - // virtual: load app_global_get_ex_value%14#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,app_global_get_ex_value%14#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 - swap // load bytes_to_add#0 from l-stack (no copy) (𝕗) me#0 | app_global_get_ex_value%14#0,bytes_to_add#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 - concat // (𝕗) me#0 | {concat} self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 - // virtual: store new_state_value%16#0 to l-stack (no copy) (𝕗) me#0 | new_state_value%16#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 - byte "global_bytes" // (𝕗) me#0 | new_state_value%16#0,"global_bytes" self.global_bytes augmented_assignment/contract.py:37 - swap // load new_state_value%16#0 from l-stack (no copy) (𝕗) me#0 | "global_bytes",new_state_value%16#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 - app_global_put // (𝕗) me#0 | self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 - // Implicit fall through to main_after_if_else@6 // (𝕗) me#0 | + cover 2 // store me#0 to l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + int 0 // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + byte "my_uint" // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0,"my_uint" # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + app_local_get_ex // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{app_local_get_ex}.0,{app_local_get_ex}.1 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + // virtual: store my_uint_exists%6#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_uint_exists%6#0,{app_local_get_ex}.0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + // virtual: store my_uint_value%5#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_uint_value%5#0,my_uint_exists%6#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + // virtual: load my_uint_exists%6#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_uint_value%5#0,my_uint_exists%6#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + assert // check my_uint exists for account // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_uint_value%5#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + // virtual: load my_uint_value%5#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_uint_value%5#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + dig 1 // load n#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_uint_value%5#0,n#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + + // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{+} # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + // virtual: store new_state_value%7#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%7#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + dig 2 // load me#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%7#0,me#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + byte "my_uint" // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%7#0,me#0,"my_uint" # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] augmented_assignment/contract.py:30-32 + uncover 2 // load new_state_value%7#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,"my_uint",new_state_value%7#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + app_local_put // (𝕗) me#0 | bytes_to_add#0,me#0,n#0 # local augmented assignment\n# this works, but need to silence mypy\nself.my_uint[me] += n augmented_assignment/contract.py:30-32 + dig 1 // load me#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0 self.my_bytes[me] augmented_assignment/contract.py:33 + int 0 // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0 self.my_bytes[me] augmented_assignment/contract.py:33 + byte "my_bytes" // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,me#0,0,"my_bytes" self.my_bytes[me] augmented_assignment/contract.py:33 + app_local_get_ex // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{app_local_get_ex}.0,{app_local_get_ex}.1 self.my_bytes[me] augmented_assignment/contract.py:33 + // virtual: store my_bytes_exists%9#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_bytes_exists%9#0,{app_local_get_ex}.0 self.my_bytes[me] augmented_assignment/contract.py:33 + // virtual: store my_bytes_value%8#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_bytes_value%8#0,my_bytes_exists%9#0 self.my_bytes[me] augmented_assignment/contract.py:33 + // virtual: load my_bytes_exists%9#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_bytes_value%8#0,my_bytes_exists%9#0 self.my_bytes[me] augmented_assignment/contract.py:33 + assert // check my_bytes exists for account // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_bytes_value%8#0 self.my_bytes[me] augmented_assignment/contract.py:33 + // virtual: load my_bytes_value%8#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_bytes_value%8#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 + dig 3 // load bytes_to_add#0 from l-stack (copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,my_bytes_value%8#0,bytes_to_add#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 + concat // (𝕗) me#0 | bytes_to_add#0,me#0,n#0,{concat} self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 + // virtual: store new_state_value%10#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,me#0,n#0,new_state_value%10#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 + uncover 2 // load me#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,new_state_value%10#0,me#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 + byte "my_bytes" // (𝕗) me#0 | bytes_to_add#0,n#0,new_state_value%10#0,me#0,"my_bytes" self.my_bytes[me] augmented_assignment/contract.py:33 + uncover 2 // load new_state_value%10#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,me#0,"my_bytes",new_state_value%10#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 + app_local_put // (𝕗) me#0 | bytes_to_add#0,n#0 self.my_bytes[me] += bytes_to_add augmented_assignment/contract.py:33 + int 0 // (𝕗) me#0 | bytes_to_add#0,n#0,0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + byte "global_uint" // (𝕗) me#0 | bytes_to_add#0,n#0,0,"global_uint" # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + app_global_get_ex // (𝕗) me#0 | bytes_to_add#0,n#0,{app_global_get_ex}.0,{app_global_get_ex}.1 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + // virtual: store global_uint_exists%12#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,global_uint_exists%12#0,{app_global_get_ex}.0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + // virtual: store global_uint_value%11#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,global_uint_value%11#0,global_uint_exists%12#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + // virtual: load global_uint_exists%12#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,global_uint_value%11#0,global_uint_exists%12#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + assert // check global_uint exists // (𝕗) me#0 | bytes_to_add#0,n#0,global_uint_value%11#0 # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + // virtual: load global_uint_value%11#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,n#0,global_uint_value%11#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 + swap // load n#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,global_uint_value%11#0,n#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 + + // (𝕗) me#0 | bytes_to_add#0,{+} # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 + // virtual: store new_state_value%13#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,new_state_value%13#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 + byte "global_uint" // (𝕗) me#0 | bytes_to_add#0,new_state_value%13#0,"global_uint" # global augmented assignment\nself.global_uint augmented_assignment/contract.py:35-36 + swap // load new_state_value%13#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,"global_uint",new_state_value%13#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 + app_global_put // (𝕗) me#0 | bytes_to_add#0 # global augmented assignment\nself.global_uint += n augmented_assignment/contract.py:35-36 + int 0 // (𝕗) me#0 | bytes_to_add#0,0 self.global_bytes augmented_assignment/contract.py:37 + byte "global_bytes" // (𝕗) me#0 | bytes_to_add#0,0,"global_bytes" self.global_bytes augmented_assignment/contract.py:37 + app_global_get_ex // (𝕗) me#0 | bytes_to_add#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.global_bytes augmented_assignment/contract.py:37 + // virtual: store global_bytes_exists%15#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,global_bytes_exists%15#0,{app_global_get_ex}.0 self.global_bytes augmented_assignment/contract.py:37 + // virtual: store global_bytes_value%14#0 to l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,global_bytes_value%14#0,global_bytes_exists%15#0 self.global_bytes augmented_assignment/contract.py:37 + // virtual: load global_bytes_exists%15#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,global_bytes_value%14#0,global_bytes_exists%15#0 self.global_bytes augmented_assignment/contract.py:37 + assert // check global_bytes exists // (𝕗) me#0 | bytes_to_add#0,global_bytes_value%14#0 self.global_bytes augmented_assignment/contract.py:37 + // virtual: load global_bytes_value%14#0 from l-stack (no copy) (𝕗) me#0 | bytes_to_add#0,global_bytes_value%14#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 + swap // load bytes_to_add#0 from l-stack (no copy) (𝕗) me#0 | global_bytes_value%14#0,bytes_to_add#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 + concat // (𝕗) me#0 | {concat} self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 + // virtual: store new_state_value%16#0 to l-stack (no copy) (𝕗) me#0 | new_state_value%16#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 + byte "global_bytes" // (𝕗) me#0 | new_state_value%16#0,"global_bytes" self.global_bytes augmented_assignment/contract.py:37 + swap // load new_state_value%16#0 from l-stack (no copy) (𝕗) me#0 | "global_bytes",new_state_value%16#0 self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 + app_global_put // (𝕗) me#0 | self.global_bytes += bytes_to_add augmented_assignment/contract.py:37 + // Implicit fall through to main_after_if_else@6 // (𝕗) me#0 | main_after_if_else@6: - int 1 // (𝕗) me#0 | 1 True augmented_assignment/contract.py:38 - return // (𝕗) me#0 | return True augmented_assignment/contract.py:38 + int 1 // (𝕗) me#0 | 1 True augmented_assignment/contract.py:38 + return // (𝕗) me#0 | return True augmented_assignment/contract.py:38 // test_cases.augmented_assignment.contract.Augmented.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: augmented_assignment/contract.py:13 + proto 0 0 // def __init__(self) -> None: augmented_assignment/contract.py:13 __init___block@0: - byte "global_uint" // "global_uint" self.global_uint augmented_assignment/contract.py:16 - int 0 // "global_uint",0 0 augmented_assignment/contract.py:16 - app_global_put // self.global_uint = UInt64(0) augmented_assignment/contract.py:16 - byte "global_bytes" // "global_bytes" self.global_bytes augmented_assignment/contract.py:17 - byte "" // "global_bytes","" b"" augmented_assignment/contract.py:17 - app_global_put // self.global_bytes = Bytes(b"") augmented_assignment/contract.py:17 + byte "global_uint" // "global_uint" self.global_uint augmented_assignment/contract.py:16 + int 0 // "global_uint",0 0 augmented_assignment/contract.py:16 + app_global_put // self.global_uint = UInt64(0) augmented_assignment/contract.py:16 + byte "global_bytes" // "global_bytes" self.global_bytes augmented_assignment/contract.py:17 + byte "" // "global_bytes","" b"" augmented_assignment/contract.py:17 + app_global_put // self.global_bytes = Bytes(b"") augmented_assignment/contract.py:17 retsub // diff --git a/test_cases/augmented_assignment/out/Augmented.destructured.ir b/test_cases/augmented_assignment/out/Augmented.destructured.ir index e34cbe0600..b323310971 100644 --- a/test_cases/augmented_assignment/out/Augmented.destructured.ir +++ b/test_cases/augmented_assignment/out/Augmented.destructured.ir @@ -23,21 +23,21 @@ contract test_cases.augmented_assignment.contract.Augmented: block@5: // if_body_L25 let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) - let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account - let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) + let (my_uint_value%5#0: uint64, my_uint_exists%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") + (assert my_uint_exists%6#0) // check my_uint exists for account + let new_state_value%7#0: uint64 = (+ my_uint_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) - let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account - let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) + let (my_bytes_value%8#0: bytes, my_bytes_exists%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") + (assert my_bytes_exists%9#0) // check my_bytes exists for account + let new_state_value%10#0: bytes = (concat my_bytes_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check global_uint exists - let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) + let (global_uint_value%11#0: uint64, global_uint_exists%12#0: uint64) = (app_global_get_ex 0u "global_uint") + (assert global_uint_exists%12#0) // check global_uint exists + let new_state_value%13#0: uint64 = (+ global_uint_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) - let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists - let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) + let (global_bytes_value%14#0: bytes, global_bytes_exists%15#0: uint64) = (app_global_get_ex 0u "global_bytes") + (assert global_bytes_exists%15#0) // check global_bytes exists + let new_state_value%16#0: bytes = (concat global_bytes_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 block@6: // after_if_else_L25 diff --git a/test_cases/augmented_assignment/out/Augmented.ssa.ir b/test_cases/augmented_assignment/out/Augmented.ssa.ir index e34cbe0600..b323310971 100644 --- a/test_cases/augmented_assignment/out/Augmented.ssa.ir +++ b/test_cases/augmented_assignment/out/Augmented.ssa.ir @@ -23,21 +23,21 @@ contract test_cases.augmented_assignment.contract.Augmented: block@5: // if_body_L25 let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) - let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account - let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) + let (my_uint_value%5#0: uint64, my_uint_exists%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") + (assert my_uint_exists%6#0) // check my_uint exists for account + let new_state_value%7#0: uint64 = (+ my_uint_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) - let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account - let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) + let (my_bytes_value%8#0: bytes, my_bytes_exists%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") + (assert my_bytes_exists%9#0) // check my_bytes exists for account + let new_state_value%10#0: bytes = (concat my_bytes_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check global_uint exists - let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) + let (global_uint_value%11#0: uint64, global_uint_exists%12#0: uint64) = (app_global_get_ex 0u "global_uint") + (assert global_uint_exists%12#0) // check global_uint exists + let new_state_value%13#0: uint64 = (+ global_uint_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) - let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists - let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) + let (global_bytes_value%14#0: bytes, global_bytes_exists%15#0: uint64) = (app_global_get_ex 0u "global_bytes") + (assert global_bytes_exists%15#0) // check global_bytes exists + let new_state_value%16#0: bytes = (concat global_bytes_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 block@6: // after_if_else_L25 diff --git a/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir b/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir index e34cbe0600..b323310971 100644 --- a/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir +++ b/test_cases/augmented_assignment/out_O2/Augmented.destructured.ir @@ -23,21 +23,21 @@ contract test_cases.augmented_assignment.contract.Augmented: block@5: // if_body_L25 let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) - let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account - let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) + let (my_uint_value%5#0: uint64, my_uint_exists%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") + (assert my_uint_exists%6#0) // check my_uint exists for account + let new_state_value%7#0: uint64 = (+ my_uint_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) - let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account - let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) + let (my_bytes_value%8#0: bytes, my_bytes_exists%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") + (assert my_bytes_exists%9#0) // check my_bytes exists for account + let new_state_value%10#0: bytes = (concat my_bytes_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check global_uint exists - let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) + let (global_uint_value%11#0: uint64, global_uint_exists%12#0: uint64) = (app_global_get_ex 0u "global_uint") + (assert global_uint_exists%12#0) // check global_uint exists + let new_state_value%13#0: uint64 = (+ global_uint_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) - let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists - let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) + let (global_bytes_value%14#0: bytes, global_bytes_exists%15#0: uint64) = (app_global_get_ex 0u "global_bytes") + (assert global_bytes_exists%15#0) // check global_bytes exists + let new_state_value%16#0: bytes = (concat global_bytes_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 block@6: // after_if_else_L25 diff --git a/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir b/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir index e34cbe0600..b323310971 100644 --- a/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir +++ b/test_cases/augmented_assignment/out_unoptimized/Augmented.destructured.ir @@ -23,21 +23,21 @@ contract test_cases.augmented_assignment.contract.Augmented: block@5: // if_body_L25 let n#0: uint64 = (txn NumAppArgs) let bytes_to_add#0: bytes = (itob n#0) - let (app_local_get_ex_value%5#0: uint64, app_local_get_ex_did_exist%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") - (assert app_local_get_ex_did_exist%6#0) // check my_uint exists for account - let new_state_value%7#0: uint64 = (+ app_local_get_ex_value%5#0 n#0) + let (my_uint_value%5#0: uint64, my_uint_exists%6#0: uint64) = (app_local_get_ex me#0 0u "my_uint") + (assert my_uint_exists%6#0) // check my_uint exists for account + let new_state_value%7#0: uint64 = (+ my_uint_value%5#0 n#0) (app_local_put me#0 "my_uint" new_state_value%7#0) - let (app_local_get_ex_value%8#0: bytes, app_local_get_ex_did_exist%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") - (assert app_local_get_ex_did_exist%9#0) // check my_bytes exists for account - let new_state_value%10#0: bytes = (concat app_local_get_ex_value%8#0 bytes_to_add#0) + let (my_bytes_value%8#0: bytes, my_bytes_exists%9#0: uint64) = (app_local_get_ex me#0 0u "my_bytes") + (assert my_bytes_exists%9#0) // check my_bytes exists for account + let new_state_value%10#0: bytes = (concat my_bytes_value%8#0 bytes_to_add#0) (app_local_put me#0 "my_bytes" new_state_value%10#0) - let (app_global_get_ex_value%11#0: uint64, app_global_get_ex_did_exist%12#0: uint64) = (app_global_get_ex 0u "global_uint") - (assert app_global_get_ex_did_exist%12#0) // check global_uint exists - let new_state_value%13#0: uint64 = (+ app_global_get_ex_value%11#0 n#0) + let (global_uint_value%11#0: uint64, global_uint_exists%12#0: uint64) = (app_global_get_ex 0u "global_uint") + (assert global_uint_exists%12#0) // check global_uint exists + let new_state_value%13#0: uint64 = (+ global_uint_value%11#0 n#0) (app_global_put "global_uint" new_state_value%13#0) - let (app_global_get_ex_value%14#0: bytes, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "global_bytes") - (assert app_global_get_ex_did_exist%15#0) // check global_bytes exists - let new_state_value%16#0: bytes = (concat app_global_get_ex_value%14#0 bytes_to_add#0) + let (global_bytes_value%14#0: bytes, global_bytes_exists%15#0: uint64) = (app_global_get_ex 0u "global_bytes") + (assert global_bytes_exists%15#0) // check global_bytes exists + let new_state_value%16#0: bytes = (concat global_bytes_value%14#0 bytes_to_add#0) (app_global_put "global_bytes" new_state_value%16#0) goto block@6 block@6: // after_if_else_L25 diff --git a/test_cases/augmented_assignment/puya.log b/test_cases/augmented_assignment/puya.log index 8af753ed7e..98d69dd418 100644 --- a/test_cases/augmented_assignment/puya.log +++ b/test_cases/augmented_assignment/puya.log @@ -379,30 +379,30 @@ debug: Inserted main_after_if_else@4.ops[6]: 'store tmp%4#0 to l-stack (copy)' debug: Replaced main_after_if_else@4.ops[8]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' debug: Inserted main_if_body@5.ops[1]: 'store n#0 to l-stack (copy)' debug: Replaced main_if_body@5.ops[3]: 'load n#0' with 'load n#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[10]: 'store app_local_get_ex_did_exist%6#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[13]: 'load app_local_get_ex_did_exist%6#0' with 'load app_local_get_ex_did_exist%6#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[27]: 'store app_local_get_ex_did_exist%9#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[30]: 'load app_local_get_ex_did_exist%9#0' with 'load app_local_get_ex_did_exist%9#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[43]: 'store app_global_get_ex_did_exist%12#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[46]: 'load app_global_get_ex_did_exist%12#0' with 'load app_global_get_ex_did_exist%12#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[10]: 'store my_uint_exists%6#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[13]: 'load my_uint_exists%6#0' with 'load my_uint_exists%6#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[27]: 'store my_bytes_exists%9#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[30]: 'load my_bytes_exists%9#0' with 'load my_bytes_exists%9#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[43]: 'store global_uint_exists%12#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[46]: 'load global_uint_exists%12#0' with 'load global_uint_exists%12#0 from l-stack (no copy)' debug: Inserted main_if_body@5.ops[51]: 'store new_state_value%13#0 to l-stack (copy)' debug: Replaced main_if_body@5.ops[54]: 'load new_state_value%13#0' with 'load new_state_value%13#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[59]: 'store app_global_get_ex_did_exist%15#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[62]: 'load app_global_get_ex_did_exist%15#0' with 'load app_global_get_ex_did_exist%15#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[59]: 'store global_bytes_exists%15#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[62]: 'load global_bytes_exists%15#0' with 'load global_bytes_exists%15#0 from l-stack (no copy)' debug: Inserted main_if_body@5.ops[67]: 'store new_state_value%16#0 to l-stack (copy)' debug: Replaced main_if_body@5.ops[70]: 'load new_state_value%16#0' with 'load new_state_value%16#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[12]: 'store app_local_get_ex_value%5#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[16]: 'load app_local_get_ex_value%5#0' with 'load app_local_get_ex_value%5#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[12]: 'store my_uint_value%5#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[16]: 'load my_uint_value%5#0' with 'load my_uint_value%5#0 from l-stack (no copy)' debug: Inserted main_if_body@5.ops[19]: 'store new_state_value%7#0 to l-stack (copy)' debug: Replaced main_if_body@5.ops[23]: 'load new_state_value%7#0' with 'load new_state_value%7#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[31]: 'store app_local_get_ex_value%8#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[35]: 'load app_local_get_ex_value%8#0' with 'load app_local_get_ex_value%8#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[31]: 'store my_bytes_value%8#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[35]: 'load my_bytes_value%8#0' with 'load my_bytes_value%8#0 from l-stack (no copy)' debug: Inserted main_if_body@5.ops[38]: 'store new_state_value%10#0 to l-stack (copy)' debug: Replaced main_if_body@5.ops[42]: 'load new_state_value%10#0' with 'load new_state_value%10#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[49]: 'store app_global_get_ex_value%11#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[53]: 'load app_global_get_ex_value%11#0' with 'load app_global_get_ex_value%11#0 from l-stack (no copy)' -debug: Inserted main_if_body@5.ops[66]: 'store app_global_get_ex_value%14#0 to l-stack (copy)' -debug: Replaced main_if_body@5.ops[70]: 'load app_global_get_ex_value%14#0' with 'load app_global_get_ex_value%14#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[49]: 'store global_uint_value%11#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[53]: 'load global_uint_value%11#0' with 'load global_uint_value%11#0 from l-stack (no copy)' +debug: Inserted main_if_body@5.ops[66]: 'store global_bytes_value%14#0 to l-stack (copy)' +debug: Replaced main_if_body@5.ops[70]: 'load global_bytes_value%14#0' with 'load global_bytes_value%14#0 from l-stack (no copy)' debug: Inserted main_if_body@5.ops[22]: 'store me#0 to l-stack (copy)' debug: Replaced main_if_body@5.ops[26]: 'load me#0' with 'load me#0 from l-stack (no copy)' debug: Inserted main_if_body@5.ops[4]: 'store n#0 to l-stack (copy)' diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir b/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir index 258c5facf6..97268e0a54 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.approval.mir @@ -1,12 +1,12 @@ -// Op // Op Description Stack (out) Live (out) X stack Source code Source line +// Op // Op Description Stack (out) Live (out) X stack Source code Source line #pragma version 10 // test_cases.conditional_execution.contract.ConditionalExecutionContract.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} - // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // // Implicit fall through to main_on_create@1 // @@ -15,423 +15,423 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - int 1 // 1 execute rhs if lhs is True\nself.func_a(True conditional_execution/contract.py:10-11 - callsub func_a // {func_a} # 'or' won't execute rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:10-11 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 # 'or' won't execute rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:10-11 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 - bnz main_bool_merge@6 // # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 - // Implicit fall through to main_or_contd@3 // # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 + int 1 // 1 execute rhs if lhs is True\nself.func_a(True conditional_execution/contract.py:10-11 + callsub func_a // {func_a} # 'or' won't execute rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:10-11 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 # 'or' won't execute rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:10-11 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 + bnz main_bool_merge@6 // # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 + // Implicit fall through to main_or_contd@3 // # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 main_or_contd@3: - int 1 // 1 s True\nself.func_a(True) or self.func_b(True conditional_execution/contract.py:10-11 - callsub func_b // {func_b} rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 - pop // rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 - // Implicit fall through to main_bool_merge@6 // # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 + int 1 // 1 s True\nself.func_a(True) or self.func_b(True conditional_execution/contract.py:10-11 + callsub func_b // {func_b} rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 + pop // rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 + // Implicit fall through to main_bool_merge@6 // # 'or' won't execute rhs if lhs is True\nself.func_a(True) or self.func_b(True) conditional_execution/contract.py:10-11 main_bool_merge@6: - int 0 // 0 self.did_execute_a conditional_execution/contract.py:13 - byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:13 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:13 - // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:13 - // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.did_execute_a conditional_execution/contract.py:13 - // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.did_execute_a conditional_execution/contract.py:13 - assert // check did_execute_a exists // app_global_get_ex_value%4#0 self.did_execute_a conditional_execution/contract.py:13 - // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) app_global_get_ex_value%4#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 - bz main_bool_false@9 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 - // Implicit fall through to main_and_contd@7 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 + int 0 // 0 self.did_execute_a conditional_execution/contract.py:13 + byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:13 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:13 + // virtual: store did_execute_a_exists%5#0 to l-stack (no copy) did_execute_a_exists%5#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:13 + // virtual: store did_execute_a_value%4#0 to l-stack (no copy) did_execute_a_value%4#0,did_execute_a_exists%5#0 self.did_execute_a conditional_execution/contract.py:13 + // virtual: load did_execute_a_exists%5#0 from l-stack (no copy) did_execute_a_value%4#0,did_execute_a_exists%5#0 self.did_execute_a conditional_execution/contract.py:13 + assert // check did_execute_a exists // did_execute_a_value%4#0 self.did_execute_a conditional_execution/contract.py:13 + // virtual: load did_execute_a_value%4#0 from l-stack (no copy) did_execute_a_value%4#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 + bz main_bool_false@9 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 + // Implicit fall through to main_and_contd@7 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:13 main_and_contd@7: - int 0 // 0 self.did_execute_b conditional_execution/contract.py:13 - byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:13 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:13 - // virtual: store app_global_get_ex_did_exist%7#0 to l-stack (no copy) app_global_get_ex_did_exist%7#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:13 - // virtual: store app_global_get_ex_value%6#0 to l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.did_execute_b conditional_execution/contract.py:13 - // virtual: load app_global_get_ex_did_exist%7#0 from l-stack (no copy) app_global_get_ex_value%6#0,app_global_get_ex_did_exist%7#0 self.did_execute_b conditional_execution/contract.py:13 - assert // check did_execute_b exists // app_global_get_ex_value%6#0 self.did_execute_b conditional_execution/contract.py:13 - // virtual: load app_global_get_ex_value%6#0 from l-stack (no copy) app_global_get_ex_value%6#0 not self.did_execute_b conditional_execution/contract.py:13 - bnz main_bool_false@9 // not self.did_execute_b conditional_execution/contract.py:13 - // Implicit fall through to main_bool_true@8 // not self.did_execute_b conditional_execution/contract.py:13 + int 0 // 0 self.did_execute_b conditional_execution/contract.py:13 + byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:13 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:13 + // virtual: store did_execute_b_exists%7#0 to l-stack (no copy) did_execute_b_exists%7#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:13 + // virtual: store did_execute_b_value%6#0 to l-stack (no copy) did_execute_b_value%6#0,did_execute_b_exists%7#0 self.did_execute_b conditional_execution/contract.py:13 + // virtual: load did_execute_b_exists%7#0 from l-stack (no copy) did_execute_b_value%6#0,did_execute_b_exists%7#0 self.did_execute_b conditional_execution/contract.py:13 + assert // check did_execute_b exists // did_execute_b_value%6#0 self.did_execute_b conditional_execution/contract.py:13 + // virtual: load did_execute_b_value%6#0 from l-stack (no copy) did_execute_b_value%6#0 not self.did_execute_b conditional_execution/contract.py:13 + bnz main_bool_false@9 // not self.did_execute_b conditional_execution/contract.py:13 + // Implicit fall through to main_bool_true@8 // not self.did_execute_b conditional_execution/contract.py:13 main_bool_true@8: - int 1 // 1 - // virtual: store and_result%8#0 to x-stack (no copy) (𝕏) and_result%8#0 | - b main_bool_merge@10 // (𝕏) and_result%8#0 | and_result%8#0 + int 1 // 1 + // virtual: store and_result%8#0 to x-stack (no copy) (𝕏) and_result%8#0 | + b main_bool_merge@10 // (𝕏) and_result%8#0 | and_result%8#0 main_bool_false@9: - int 0 // 0 - // virtual: store and_result%8#0 to x-stack (no copy) (𝕏) and_result%8#0 | - // Implicit fall through to main_bool_merge@10 // (𝕏) and_result%8#0 | and_result%8#0 + int 0 // 0 + // virtual: store and_result%8#0 to x-stack (no copy) (𝕏) and_result%8#0 | + // Implicit fall through to main_bool_merge@10 // (𝕏) and_result%8#0 | and_result%8#0 main_bool_merge@10: - // virtual: load and_result%8#0 from x-stack and_result%8#0 and_result%8#0 self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:12-14 - callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:12-14 - int 0 // 0 tes rhs if lhs is False\nself.func_a(False conditional_execution/contract.py:16-17 - callsub func_a // {func_a} # 'or' executes rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:16-17 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 # 'or' executes rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:16-17 - // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 - bnz main_bool_merge@14 // # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 - // Implicit fall through to main_or_contd@11 // # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 + // virtual: load and_result%8#0 from x-stack and_result%8#0 and_result%8#0 self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:12-14 + callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:12-14 + int 0 // 0 tes rhs if lhs is False\nself.func_a(False conditional_execution/contract.py:16-17 + callsub func_a // {func_a} # 'or' executes rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:16-17 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 # 'or' executes rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:16-17 + // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 + bnz main_bool_merge@14 // # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 + // Implicit fall through to main_or_contd@11 // # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 main_or_contd@11: - int 1 // 1 e\nself.func_a(False) or self.func_b(True conditional_execution/contract.py:16-17 - callsub func_b // {func_b} lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 - pop // lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 - // Implicit fall through to main_bool_merge@14 // # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 + int 1 // 1 e\nself.func_a(False) or self.func_b(True conditional_execution/contract.py:16-17 + callsub func_b // {func_b} lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 + pop // lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 + // Implicit fall through to main_bool_merge@14 // # 'or' executes rhs if lhs is False\nself.func_a(False) or self.func_b(True) conditional_execution/contract.py:16-17 main_bool_merge@14: - int 0 // 0 self.did_execute_a conditional_execution/contract.py:19 - byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:19 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:19 - // virtual: store app_global_get_ex_did_exist%13#0 to l-stack (no copy) app_global_get_ex_did_exist%13#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:19 - // virtual: store app_global_get_ex_value%12#0 to l-stack (no copy) app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.did_execute_a conditional_execution/contract.py:19 - // virtual: load app_global_get_ex_did_exist%13#0 from l-stack (no copy) app_global_get_ex_value%12#0,app_global_get_ex_did_exist%13#0 self.did_execute_a conditional_execution/contract.py:19 - assert // check did_execute_a exists // app_global_get_ex_value%12#0 self.did_execute_a conditional_execution/contract.py:19 - // virtual: load app_global_get_ex_value%12#0 from l-stack (no copy) app_global_get_ex_value%12#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 - bz main_bool_false@17 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 - // Implicit fall through to main_and_contd@15 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 + int 0 // 0 self.did_execute_a conditional_execution/contract.py:19 + byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:19 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:19 + // virtual: store did_execute_a_exists%13#0 to l-stack (no copy) did_execute_a_exists%13#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:19 + // virtual: store did_execute_a_value%12#0 to l-stack (no copy) did_execute_a_value%12#0,did_execute_a_exists%13#0 self.did_execute_a conditional_execution/contract.py:19 + // virtual: load did_execute_a_exists%13#0 from l-stack (no copy) did_execute_a_value%12#0,did_execute_a_exists%13#0 self.did_execute_a conditional_execution/contract.py:19 + assert // check did_execute_a exists // did_execute_a_value%12#0 self.did_execute_a conditional_execution/contract.py:19 + // virtual: load did_execute_a_value%12#0 from l-stack (no copy) did_execute_a_value%12#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 + bz main_bool_false@17 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 + // Implicit fall through to main_and_contd@15 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 main_and_contd@15: - int 0 // 0 self.did_execute_b conditional_execution/contract.py:19 - byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:19 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:19 - // virtual: store app_global_get_ex_did_exist%15#0 to l-stack (no copy) app_global_get_ex_did_exist%15#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:19 - // virtual: store app_global_get_ex_value%14#0 to l-stack (no copy) app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.did_execute_b conditional_execution/contract.py:19 - // virtual: load app_global_get_ex_did_exist%15#0 from l-stack (no copy) app_global_get_ex_value%14#0,app_global_get_ex_did_exist%15#0 self.did_execute_b conditional_execution/contract.py:19 - assert // check did_execute_b exists // app_global_get_ex_value%14#0 self.did_execute_b conditional_execution/contract.py:19 - // virtual: load app_global_get_ex_value%14#0 from l-stack (no copy) app_global_get_ex_value%14#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 - bz main_bool_false@17 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 - // Implicit fall through to main_bool_true@16 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 + int 0 // 0 self.did_execute_b conditional_execution/contract.py:19 + byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:19 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:19 + // virtual: store did_execute_b_exists%15#0 to l-stack (no copy) did_execute_b_exists%15#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:19 + // virtual: store did_execute_b_value%14#0 to l-stack (no copy) did_execute_b_value%14#0,did_execute_b_exists%15#0 self.did_execute_b conditional_execution/contract.py:19 + // virtual: load did_execute_b_exists%15#0 from l-stack (no copy) did_execute_b_value%14#0,did_execute_b_exists%15#0 self.did_execute_b conditional_execution/contract.py:19 + assert // check did_execute_b exists // did_execute_b_value%14#0 self.did_execute_b conditional_execution/contract.py:19 + // virtual: load did_execute_b_value%14#0 from l-stack (no copy) did_execute_b_value%14#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 + bz main_bool_false@17 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 + // Implicit fall through to main_bool_true@16 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:19 main_bool_true@16: - int 1 // 1 - // virtual: store and_result%16#0 to x-stack (no copy) (𝕏) and_result%16#0 | - b main_bool_merge@18 // (𝕏) and_result%16#0 | and_result%16#0 + int 1 // 1 + // virtual: store and_result%16#0 to x-stack (no copy) (𝕏) and_result%16#0 | + b main_bool_merge@18 // (𝕏) and_result%16#0 | and_result%16#0 main_bool_false@17: - int 0 // 0 - // virtual: store and_result%16#0 to x-stack (no copy) (𝕏) and_result%16#0 | - // Implicit fall through to main_bool_merge@18 // (𝕏) and_result%16#0 | and_result%16#0 + int 0 // 0 + // virtual: store and_result%16#0 to x-stack (no copy) (𝕏) and_result%16#0 | + // Implicit fall through to main_bool_merge@18 // (𝕏) and_result%16#0 | and_result%16#0 main_bool_merge@18: - // virtual: load and_result%16#0 from x-stack and_result%16#0 and_result%16#0 self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:18-20 - callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:18-20 - int 0 // 0 t execute rhs if lhs is False\nself.func_a(False conditional_execution/contract.py:22-23 - callsub func_a // {func_a} # 'and' won't execute rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:22-23 - // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 # 'and' won't execute rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:22-23 - // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 - bz main_bool_merge@22 // # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 - // Implicit fall through to main_and_contd@19 // # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 + // virtual: load and_result%16#0 from x-stack and_result%16#0 and_result%16#0 self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:18-20 + callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:18-20 + int 0 // 0 t execute rhs if lhs is False\nself.func_a(False conditional_execution/contract.py:22-23 + callsub func_a // {func_a} # 'and' won't execute rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:22-23 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 # 'and' won't execute rhs if lhs is False\nself.func_a(False) conditional_execution/contract.py:22-23 + // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 + bz main_bool_merge@22 // # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 + // Implicit fall through to main_and_contd@19 // # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 main_and_contd@19: - int 1 // 1 False\nself.func_a(False) and self.func_b(True conditional_execution/contract.py:22-23 - callsub func_b // {func_b} hs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 - pop // hs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 - // Implicit fall through to main_bool_merge@22 // # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 + int 1 // 1 False\nself.func_a(False) and self.func_b(True conditional_execution/contract.py:22-23 + callsub func_b // {func_b} hs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 + pop // hs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 + // Implicit fall through to main_bool_merge@22 // # 'and' won't execute rhs if lhs is False\nself.func_a(False) and self.func_b(True) conditional_execution/contract.py:22-23 main_bool_merge@22: - int 0 // 0 self.did_execute_a conditional_execution/contract.py:25 - byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:25 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:25 - // virtual: store app_global_get_ex_did_exist%21#0 to l-stack (no copy) app_global_get_ex_did_exist%21#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:25 - // virtual: store app_global_get_ex_value%20#0 to l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.did_execute_a conditional_execution/contract.py:25 - // virtual: load app_global_get_ex_did_exist%21#0 from l-stack (no copy) app_global_get_ex_value%20#0,app_global_get_ex_did_exist%21#0 self.did_execute_a conditional_execution/contract.py:25 - assert // check did_execute_a exists // app_global_get_ex_value%20#0 self.did_execute_a conditional_execution/contract.py:25 - // virtual: load app_global_get_ex_value%20#0 from l-stack (no copy) app_global_get_ex_value%20#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 - bz main_bool_false@25 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 - // Implicit fall through to main_and_contd@23 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 + int 0 // 0 self.did_execute_a conditional_execution/contract.py:25 + byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:25 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:25 + // virtual: store did_execute_a_exists%21#0 to l-stack (no copy) did_execute_a_exists%21#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:25 + // virtual: store did_execute_a_value%20#0 to l-stack (no copy) did_execute_a_value%20#0,did_execute_a_exists%21#0 self.did_execute_a conditional_execution/contract.py:25 + // virtual: load did_execute_a_exists%21#0 from l-stack (no copy) did_execute_a_value%20#0,did_execute_a_exists%21#0 self.did_execute_a conditional_execution/contract.py:25 + assert // check did_execute_a exists // did_execute_a_value%20#0 self.did_execute_a conditional_execution/contract.py:25 + // virtual: load did_execute_a_value%20#0 from l-stack (no copy) did_execute_a_value%20#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 + bz main_bool_false@25 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 + // Implicit fall through to main_and_contd@23 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:25 main_and_contd@23: - int 0 // 0 self.did_execute_b conditional_execution/contract.py:25 - byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:25 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:25 - // virtual: store app_global_get_ex_did_exist%23#0 to l-stack (no copy) app_global_get_ex_did_exist%23#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:25 - // virtual: store app_global_get_ex_value%22#0 to l-stack (no copy) app_global_get_ex_value%22#0,app_global_get_ex_did_exist%23#0 self.did_execute_b conditional_execution/contract.py:25 - // virtual: load app_global_get_ex_did_exist%23#0 from l-stack (no copy) app_global_get_ex_value%22#0,app_global_get_ex_did_exist%23#0 self.did_execute_b conditional_execution/contract.py:25 - assert // check did_execute_b exists // app_global_get_ex_value%22#0 self.did_execute_b conditional_execution/contract.py:25 - // virtual: load app_global_get_ex_value%22#0 from l-stack (no copy) app_global_get_ex_value%22#0 not self.did_execute_b conditional_execution/contract.py:25 - bnz main_bool_false@25 // not self.did_execute_b conditional_execution/contract.py:25 - // Implicit fall through to main_bool_true@24 // not self.did_execute_b conditional_execution/contract.py:25 + int 0 // 0 self.did_execute_b conditional_execution/contract.py:25 + byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:25 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:25 + // virtual: store did_execute_b_exists%23#0 to l-stack (no copy) did_execute_b_exists%23#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:25 + // virtual: store did_execute_b_value%22#0 to l-stack (no copy) did_execute_b_value%22#0,did_execute_b_exists%23#0 self.did_execute_b conditional_execution/contract.py:25 + // virtual: load did_execute_b_exists%23#0 from l-stack (no copy) did_execute_b_value%22#0,did_execute_b_exists%23#0 self.did_execute_b conditional_execution/contract.py:25 + assert // check did_execute_b exists // did_execute_b_value%22#0 self.did_execute_b conditional_execution/contract.py:25 + // virtual: load did_execute_b_value%22#0 from l-stack (no copy) did_execute_b_value%22#0 not self.did_execute_b conditional_execution/contract.py:25 + bnz main_bool_false@25 // not self.did_execute_b conditional_execution/contract.py:25 + // Implicit fall through to main_bool_true@24 // not self.did_execute_b conditional_execution/contract.py:25 main_bool_true@24: - int 1 // 1 - // virtual: store and_result%24#0 to x-stack (no copy) (𝕏) and_result%24#0 | - b main_bool_merge@26 // (𝕏) and_result%24#0 | and_result%24#0 + int 1 // 1 + // virtual: store and_result%24#0 to x-stack (no copy) (𝕏) and_result%24#0 | + b main_bool_merge@26 // (𝕏) and_result%24#0 | and_result%24#0 main_bool_false@25: - int 0 // 0 - // virtual: store and_result%24#0 to x-stack (no copy) (𝕏) and_result%24#0 | - // Implicit fall through to main_bool_merge@26 // (𝕏) and_result%24#0 | and_result%24#0 + int 0 // 0 + // virtual: store and_result%24#0 to x-stack (no copy) (𝕏) and_result%24#0 | + // Implicit fall through to main_bool_merge@26 // (𝕏) and_result%24#0 | and_result%24#0 main_bool_merge@26: - // virtual: load and_result%24#0 from x-stack and_result%24#0 and_result%24#0 self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:24-26 - callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:24-26 - int 1 // 1 utes rhs if lhs is True\nself.func_a(True conditional_execution/contract.py:28-29 - callsub func_a // {func_a} # 'and' executes rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:28-29 - // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 # 'and' executes rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:28-29 - // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 - bz main_bool_merge@30 // # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 - // Implicit fall through to main_and_contd@27 // # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 + // virtual: load and_result%24#0 from x-stack and_result%24#0 and_result%24#0 self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:24-26 + callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:24-26 + int 1 // 1 utes rhs if lhs is True\nself.func_a(True conditional_execution/contract.py:28-29 + callsub func_a // {func_a} # 'and' executes rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:28-29 + // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 # 'and' executes rhs if lhs is True\nself.func_a(True) conditional_execution/contract.py:28-29 + // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 + bz main_bool_merge@30 // # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 + // Implicit fall through to main_and_contd@27 // # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 main_and_contd@27: - int 1 // 1 e\nself.func_a(True) and self.func_b(True conditional_execution/contract.py:28-29 - callsub func_b // {func_b} f lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 - pop // f lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 - // Implicit fall through to main_bool_merge@30 // # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 + int 1 // 1 e\nself.func_a(True) and self.func_b(True conditional_execution/contract.py:28-29 + callsub func_b // {func_b} f lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 + pop // f lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 + // Implicit fall through to main_bool_merge@30 // # 'and' executes rhs if lhs is True\nself.func_a(True) and self.func_b(True) conditional_execution/contract.py:28-29 main_bool_merge@30: - int 0 // 0 self.did_execute_a conditional_execution/contract.py:31 - byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:31 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:31 - // virtual: store app_global_get_ex_did_exist%29#0 to l-stack (no copy) app_global_get_ex_did_exist%29#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:31 - // virtual: store app_global_get_ex_value%28#0 to l-stack (no copy) app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.did_execute_a conditional_execution/contract.py:31 - // virtual: load app_global_get_ex_did_exist%29#0 from l-stack (no copy) app_global_get_ex_value%28#0,app_global_get_ex_did_exist%29#0 self.did_execute_a conditional_execution/contract.py:31 - assert // check did_execute_a exists // app_global_get_ex_value%28#0 self.did_execute_a conditional_execution/contract.py:31 - // virtual: load app_global_get_ex_value%28#0 from l-stack (no copy) app_global_get_ex_value%28#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 - bz main_bool_false@33 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 - // Implicit fall through to main_and_contd@31 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 + int 0 // 0 self.did_execute_a conditional_execution/contract.py:31 + byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:31 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:31 + // virtual: store did_execute_a_exists%29#0 to l-stack (no copy) did_execute_a_exists%29#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:31 + // virtual: store did_execute_a_value%28#0 to l-stack (no copy) did_execute_a_value%28#0,did_execute_a_exists%29#0 self.did_execute_a conditional_execution/contract.py:31 + // virtual: load did_execute_a_exists%29#0 from l-stack (no copy) did_execute_a_value%28#0,did_execute_a_exists%29#0 self.did_execute_a conditional_execution/contract.py:31 + assert // check did_execute_a exists // did_execute_a_value%28#0 self.did_execute_a conditional_execution/contract.py:31 + // virtual: load did_execute_a_value%28#0 from l-stack (no copy) did_execute_a_value%28#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 + bz main_bool_false@33 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 + // Implicit fall through to main_and_contd@31 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 main_and_contd@31: - int 0 // 0 self.did_execute_b conditional_execution/contract.py:31 - byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:31 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:31 - // virtual: store app_global_get_ex_did_exist%31#0 to l-stack (no copy) app_global_get_ex_did_exist%31#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:31 - // virtual: store app_global_get_ex_value%30#0 to l-stack (no copy) app_global_get_ex_value%30#0,app_global_get_ex_did_exist%31#0 self.did_execute_b conditional_execution/contract.py:31 - // virtual: load app_global_get_ex_did_exist%31#0 from l-stack (no copy) app_global_get_ex_value%30#0,app_global_get_ex_did_exist%31#0 self.did_execute_b conditional_execution/contract.py:31 - assert // check did_execute_b exists // app_global_get_ex_value%30#0 self.did_execute_b conditional_execution/contract.py:31 - // virtual: load app_global_get_ex_value%30#0 from l-stack (no copy) app_global_get_ex_value%30#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 - bz main_bool_false@33 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 - // Implicit fall through to main_bool_true@32 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 + int 0 // 0 self.did_execute_b conditional_execution/contract.py:31 + byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:31 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:31 + // virtual: store did_execute_b_exists%31#0 to l-stack (no copy) did_execute_b_exists%31#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:31 + // virtual: store did_execute_b_value%30#0 to l-stack (no copy) did_execute_b_value%30#0,did_execute_b_exists%31#0 self.did_execute_b conditional_execution/contract.py:31 + // virtual: load did_execute_b_exists%31#0 from l-stack (no copy) did_execute_b_value%30#0,did_execute_b_exists%31#0 self.did_execute_b conditional_execution/contract.py:31 + assert // check did_execute_b exists // did_execute_b_value%30#0 self.did_execute_b conditional_execution/contract.py:31 + // virtual: load did_execute_b_value%30#0 from l-stack (no copy) did_execute_b_value%30#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 + bz main_bool_false@33 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 + // Implicit fall through to main_bool_true@32 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:31 main_bool_true@32: - int 1 // 1 - // virtual: store and_result%32#0 to x-stack (no copy) (𝕏) and_result%32#0 | - b main_bool_merge@34 // (𝕏) and_result%32#0 | and_result%32#0 + int 1 // 1 + // virtual: store and_result%32#0 to x-stack (no copy) (𝕏) and_result%32#0 | + b main_bool_merge@34 // (𝕏) and_result%32#0 | and_result%32#0 main_bool_false@33: - int 0 // 0 - // virtual: store and_result%32#0 to x-stack (no copy) (𝕏) and_result%32#0 | - // Implicit fall through to main_bool_merge@34 // (𝕏) and_result%32#0 | and_result%32#0 + int 0 // 0 + // virtual: store and_result%32#0 to x-stack (no copy) (𝕏) and_result%32#0 | + // Implicit fall through to main_bool_merge@34 // (𝕏) and_result%32#0 | and_result%32#0 main_bool_merge@34: - // virtual: load and_result%32#0 from x-stack and_result%32#0 and_result%32#0 self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:30-32 - callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:30-32 - int 1 // 1 fully evaluated before indexing is done\n(self.func_a(True conditional_execution/contract.py:34-35 - callsub func_a // {func_a} Tuples are fully evaluated before indexing is done\n(self.func_a(True) conditional_execution/contract.py:34-35 - pop // Tuples are fully evaluated before indexing is done\n(self.func_a(True) conditional_execution/contract.py:34-35 - int 1 // 1 ore indexing is done\n(self.func_a(True), self.func_b(True conditional_execution/contract.py:34-35 - callsub func_b // {func_b} valuated before indexing is done\n(self.func_a(True), self.func_b(True) conditional_execution/contract.py:34-35 - pop // valuated before indexing is done\n(self.func_a(True), self.func_b(True) conditional_execution/contract.py:34-35 - int 0 // 0 self.did_execute_a conditional_execution/contract.py:37 - byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:37 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:37 - // virtual: store app_global_get_ex_did_exist%36#0 to l-stack (no copy) app_global_get_ex_did_exist%36#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:37 - // virtual: store app_global_get_ex_value%35#0 to l-stack (no copy) app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.did_execute_a conditional_execution/contract.py:37 - // virtual: load app_global_get_ex_did_exist%36#0 from l-stack (no copy) app_global_get_ex_value%35#0,app_global_get_ex_did_exist%36#0 self.did_execute_a conditional_execution/contract.py:37 - assert // check did_execute_a exists // app_global_get_ex_value%35#0 self.did_execute_a conditional_execution/contract.py:37 - // virtual: load app_global_get_ex_value%35#0 from l-stack (no copy) app_global_get_ex_value%35#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 - bz main_bool_false@37 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 - // Implicit fall through to main_and_contd@35 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 + // virtual: load and_result%32#0 from x-stack and_result%32#0 and_result%32#0 self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:30-32 + callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:30-32 + int 1 // 1 fully evaluated before indexing is done\n(self.func_a(True conditional_execution/contract.py:34-35 + callsub func_a // {func_a} Tuples are fully evaluated before indexing is done\n(self.func_a(True) conditional_execution/contract.py:34-35 + pop // Tuples are fully evaluated before indexing is done\n(self.func_a(True) conditional_execution/contract.py:34-35 + int 1 // 1 ore indexing is done\n(self.func_a(True), self.func_b(True conditional_execution/contract.py:34-35 + callsub func_b // {func_b} valuated before indexing is done\n(self.func_a(True), self.func_b(True) conditional_execution/contract.py:34-35 + pop // valuated before indexing is done\n(self.func_a(True), self.func_b(True) conditional_execution/contract.py:34-35 + int 0 // 0 self.did_execute_a conditional_execution/contract.py:37 + byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:37 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:37 + // virtual: store did_execute_a_exists%36#0 to l-stack (no copy) did_execute_a_exists%36#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:37 + // virtual: store did_execute_a_value%35#0 to l-stack (no copy) did_execute_a_value%35#0,did_execute_a_exists%36#0 self.did_execute_a conditional_execution/contract.py:37 + // virtual: load did_execute_a_exists%36#0 from l-stack (no copy) did_execute_a_value%35#0,did_execute_a_exists%36#0 self.did_execute_a conditional_execution/contract.py:37 + assert // check did_execute_a exists // did_execute_a_value%35#0 self.did_execute_a conditional_execution/contract.py:37 + // virtual: load did_execute_a_value%35#0 from l-stack (no copy) did_execute_a_value%35#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 + bz main_bool_false@37 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 + // Implicit fall through to main_and_contd@35 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 main_and_contd@35: - int 0 // 0 self.did_execute_b conditional_execution/contract.py:37 - byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:37 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:37 - // virtual: store app_global_get_ex_did_exist%38#0 to l-stack (no copy) app_global_get_ex_did_exist%38#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:37 - // virtual: store app_global_get_ex_value%37#0 to l-stack (no copy) app_global_get_ex_value%37#0,app_global_get_ex_did_exist%38#0 self.did_execute_b conditional_execution/contract.py:37 - // virtual: load app_global_get_ex_did_exist%38#0 from l-stack (no copy) app_global_get_ex_value%37#0,app_global_get_ex_did_exist%38#0 self.did_execute_b conditional_execution/contract.py:37 - assert // check did_execute_b exists // app_global_get_ex_value%37#0 self.did_execute_b conditional_execution/contract.py:37 - // virtual: load app_global_get_ex_value%37#0 from l-stack (no copy) app_global_get_ex_value%37#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 - bz main_bool_false@37 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 - // Implicit fall through to main_bool_true@36 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 + int 0 // 0 self.did_execute_b conditional_execution/contract.py:37 + byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:37 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:37 + // virtual: store did_execute_b_exists%38#0 to l-stack (no copy) did_execute_b_exists%38#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:37 + // virtual: store did_execute_b_value%37#0 to l-stack (no copy) did_execute_b_value%37#0,did_execute_b_exists%38#0 self.did_execute_b conditional_execution/contract.py:37 + // virtual: load did_execute_b_exists%38#0 from l-stack (no copy) did_execute_b_value%37#0,did_execute_b_exists%38#0 self.did_execute_b conditional_execution/contract.py:37 + assert // check did_execute_b exists // did_execute_b_value%37#0 self.did_execute_b conditional_execution/contract.py:37 + // virtual: load did_execute_b_value%37#0 from l-stack (no copy) did_execute_b_value%37#0 self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 + bz main_bool_false@37 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 + // Implicit fall through to main_bool_true@36 // self.did_execute_a and self.did_execute_b conditional_execution/contract.py:37 main_bool_true@36: - int 1 // 1 - // virtual: store and_result%39#0 to x-stack (no copy) (𝕏) and_result%39#0 | - b main_bool_merge@38 // (𝕏) and_result%39#0 | and_result%39#0 + int 1 // 1 + // virtual: store and_result%39#0 to x-stack (no copy) (𝕏) and_result%39#0 | + b main_bool_merge@38 // (𝕏) and_result%39#0 | and_result%39#0 main_bool_false@37: - int 0 // 0 - // virtual: store and_result%39#0 to x-stack (no copy) (𝕏) and_result%39#0 | - // Implicit fall through to main_bool_merge@38 // (𝕏) and_result%39#0 | and_result%39#0 + int 0 // 0 + // virtual: store and_result%39#0 to x-stack (no copy) (𝕏) and_result%39#0 | + // Implicit fall through to main_bool_merge@38 // (𝕏) and_result%39#0 | and_result%39#0 main_bool_merge@38: - // virtual: load and_result%39#0 from x-stack and_result%39#0 and_result%39#0 self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:36-38 - callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:36-38 - int 1 // 1 if condition is True\nself.func_a(True) if self.func_c(True conditional_execution/contract.py:40-41 - callsub func_c // {func_c} on't execute if condition is True\nself.func_a(True) if self.func_c(True) conditional_execution/contract.py:40-41 - // virtual: store tmp%40#0 to l-stack (no copy) tmp%40#0 on't execute if condition is True\nself.func_a(True) if self.func_c(True) conditional_execution/contract.py:40-41 - // virtual: load tmp%40#0 from l-stack (no copy) tmp%40#0 # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 - bz main_ternary_false@40 // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 - // Implicit fall through to main_ternary_true@39 // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 + // virtual: load and_result%39#0 from x-stack and_result%39#0 and_result%39#0 self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:36-38 + callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:36-38 + int 1 // 1 if condition is True\nself.func_a(True) if self.func_c(True conditional_execution/contract.py:40-41 + callsub func_c // {func_c} on't execute if condition is True\nself.func_a(True) if self.func_c(True) conditional_execution/contract.py:40-41 + // virtual: store tmp%40#0 to l-stack (no copy) tmp%40#0 on't execute if condition is True\nself.func_a(True) if self.func_c(True) conditional_execution/contract.py:40-41 + // virtual: load tmp%40#0 from l-stack (no copy) tmp%40#0 # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 + bz main_ternary_false@40 // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 + // Implicit fall through to main_ternary_true@39 // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 main_ternary_true@39: - int 1 // 1 ndition won't execute if condition is True\nself.func_a(True conditional_execution/contract.py:40-41 - callsub func_a // {func_a} # Ternary condition won't execute if condition is True\nself.func_a(True) conditional_execution/contract.py:40-41 - pop // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 + int 1 // 1 ndition won't execute if condition is True\nself.func_a(True conditional_execution/contract.py:40-41 + callsub func_a // {func_a} # Ternary condition won't execute if condition is True\nself.func_a(True) conditional_execution/contract.py:40-41 + pop // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 b main_ternary_merge@41 // main_ternary_false@40: - int 1 // 1 ion is True\nself.func_a(True) if self.func_c(True) else self.func_b(True conditional_execution/contract.py:40-41 - callsub func_b // {func_b} r> if condition is True\nself.func_a(True) if self.func_c(True) else self.func_b(True) conditional_execution/contract.py:40-41 - pop // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 + int 1 // 1 ion is True\nself.func_a(True) if self.func_c(True) else self.func_b(True conditional_execution/contract.py:40-41 + callsub func_b // {func_b} r> if condition is True\nself.func_a(True) if self.func_c(True) else self.func_b(True) conditional_execution/contract.py:40-41 + pop // # Ternary condition won't execute if condition is True\nself.func_a(True) if self.fu... conditional_execution/contract.py:40-41 // Implicit fall through to main_ternary_merge@41 // main_ternary_merge@41: - int 0 // 0 self.did_execute_a conditional_execution/contract.py:43 - byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:43 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:43 - // virtual: store app_global_get_ex_did_exist%43#0 to l-stack (no copy) app_global_get_ex_did_exist%43#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:43 - // virtual: store app_global_get_ex_value%42#0 to l-stack (no copy) app_global_get_ex_value%42#0,app_global_get_ex_did_exist%43#0 self.did_execute_a conditional_execution/contract.py:43 - // virtual: load app_global_get_ex_did_exist%43#0 from l-stack (no copy) app_global_get_ex_value%42#0,app_global_get_ex_did_exist%43#0 self.did_execute_a conditional_execution/contract.py:43 - assert // check did_execute_a exists // app_global_get_ex_value%42#0 self.did_execute_a conditional_execution/contract.py:43 - // virtual: load app_global_get_ex_value%42#0 from l-stack (no copy) app_global_get_ex_value%42#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 - bz main_bool_false@44 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 - // Implicit fall through to main_and_contd@42 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 + int 0 // 0 self.did_execute_a conditional_execution/contract.py:43 + byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:43 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:43 + // virtual: store did_execute_a_exists%43#0 to l-stack (no copy) did_execute_a_exists%43#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:43 + // virtual: store did_execute_a_value%42#0 to l-stack (no copy) did_execute_a_value%42#0,did_execute_a_exists%43#0 self.did_execute_a conditional_execution/contract.py:43 + // virtual: load did_execute_a_exists%43#0 from l-stack (no copy) did_execute_a_value%42#0,did_execute_a_exists%43#0 self.did_execute_a conditional_execution/contract.py:43 + assert // check did_execute_a exists // did_execute_a_value%42#0 self.did_execute_a conditional_execution/contract.py:43 + // virtual: load did_execute_a_value%42#0 from l-stack (no copy) did_execute_a_value%42#0 self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 + bz main_bool_false@44 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 + // Implicit fall through to main_and_contd@42 // self.did_execute_a and not self.did_execute_b conditional_execution/contract.py:43 main_and_contd@42: - int 0 // 0 self.did_execute_b conditional_execution/contract.py:43 - byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:43 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:43 - // virtual: store app_global_get_ex_did_exist%45#0 to l-stack (no copy) app_global_get_ex_did_exist%45#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:43 - // virtual: store app_global_get_ex_value%44#0 to l-stack (no copy) app_global_get_ex_value%44#0,app_global_get_ex_did_exist%45#0 self.did_execute_b conditional_execution/contract.py:43 - // virtual: load app_global_get_ex_did_exist%45#0 from l-stack (no copy) app_global_get_ex_value%44#0,app_global_get_ex_did_exist%45#0 self.did_execute_b conditional_execution/contract.py:43 - assert // check did_execute_b exists // app_global_get_ex_value%44#0 self.did_execute_b conditional_execution/contract.py:43 - // virtual: load app_global_get_ex_value%44#0 from l-stack (no copy) app_global_get_ex_value%44#0 not self.did_execute_b conditional_execution/contract.py:43 - bnz main_bool_false@44 // not self.did_execute_b conditional_execution/contract.py:43 - // Implicit fall through to main_bool_true@43 // not self.did_execute_b conditional_execution/contract.py:43 + int 0 // 0 self.did_execute_b conditional_execution/contract.py:43 + byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:43 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:43 + // virtual: store did_execute_b_exists%45#0 to l-stack (no copy) did_execute_b_exists%45#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:43 + // virtual: store did_execute_b_value%44#0 to l-stack (no copy) did_execute_b_value%44#0,did_execute_b_exists%45#0 self.did_execute_b conditional_execution/contract.py:43 + // virtual: load did_execute_b_exists%45#0 from l-stack (no copy) did_execute_b_value%44#0,did_execute_b_exists%45#0 self.did_execute_b conditional_execution/contract.py:43 + assert // check did_execute_b exists // did_execute_b_value%44#0 self.did_execute_b conditional_execution/contract.py:43 + // virtual: load did_execute_b_value%44#0 from l-stack (no copy) did_execute_b_value%44#0 not self.did_execute_b conditional_execution/contract.py:43 + bnz main_bool_false@44 // not self.did_execute_b conditional_execution/contract.py:43 + // Implicit fall through to main_bool_true@43 // not self.did_execute_b conditional_execution/contract.py:43 main_bool_true@43: - int 1 // 1 - // virtual: store and_result%46#0 to x-stack (no copy) (𝕏) and_result%46#0 | - b main_bool_merge@45 // (𝕏) and_result%46#0 | and_result%46#0 + int 1 // 1 + // virtual: store and_result%46#0 to x-stack (no copy) (𝕏) and_result%46#0 | + b main_bool_merge@45 // (𝕏) and_result%46#0 | and_result%46#0 main_bool_false@44: - int 0 // 0 - // virtual: store and_result%46#0 to x-stack (no copy) (𝕏) and_result%46#0 | - // Implicit fall through to main_bool_merge@45 // (𝕏) and_result%46#0 | and_result%46#0 + int 0 // 0 + // virtual: store and_result%46#0 to x-stack (no copy) (𝕏) and_result%46#0 | + // Implicit fall through to main_bool_merge@45 // (𝕏) and_result%46#0 | and_result%46#0 main_bool_merge@45: - // virtual: load and_result%46#0 from x-stack and_result%46#0 and_result%46#0 self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:42-44 - callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:42-44 - int 0 // 0 if condition is False\nself.func_a(True) if self.func_c(False conditional_execution/contract.py:46-47 - callsub func_c // {func_c} on't execute if condition is False\nself.func_a(True) if self.func_c(False) conditional_execution/contract.py:46-47 - // virtual: store tmp%47#0 to l-stack (no copy) tmp%47#0 on't execute if condition is False\nself.func_a(True) if self.func_c(False) conditional_execution/contract.py:46-47 - // virtual: load tmp%47#0 from l-stack (no copy) tmp%47#0 # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 - bz main_ternary_false@47 // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 - // Implicit fall through to main_ternary_true@46 // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 + // virtual: load and_result%46#0 from x-stack and_result%46#0 and_result%46#0 self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:42-44 + callsub assert_and_reset // self.assert_and_reset(\nself.did_execute_a and not self.did_execute_b,\n) conditional_execution/contract.py:42-44 + int 0 // 0 if condition is False\nself.func_a(True) if self.func_c(False conditional_execution/contract.py:46-47 + callsub func_c // {func_c} on't execute if condition is False\nself.func_a(True) if self.func_c(False) conditional_execution/contract.py:46-47 + // virtual: store tmp%47#0 to l-stack (no copy) tmp%47#0 on't execute if condition is False\nself.func_a(True) if self.func_c(False) conditional_execution/contract.py:46-47 + // virtual: load tmp%47#0 from l-stack (no copy) tmp%47#0 # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 + bz main_ternary_false@47 // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 + // Implicit fall through to main_ternary_true@46 // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 main_ternary_true@46: - int 1 // 1 ndition won't execute if condition is False\nself.func_a(True conditional_execution/contract.py:46-47 - callsub func_a // {func_a} # Ternary condition won't execute if condition is False\nself.func_a(True) conditional_execution/contract.py:46-47 - pop // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 + int 1 // 1 ndition won't execute if condition is False\nself.func_a(True conditional_execution/contract.py:46-47 + callsub func_a // {func_a} # Ternary condition won't execute if condition is False\nself.func_a(True) conditional_execution/contract.py:46-47 + pop // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 b main_ternary_merge@48 // main_ternary_false@47: - int 1 // 1 n is False\nself.func_a(True) if self.func_c(False) else self.func_b(True conditional_execution/contract.py:46-47 - callsub func_b // {func_b} if condition is False\nself.func_a(True) if self.func_c(False) else self.func_b(True) conditional_execution/contract.py:46-47 - pop // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 + int 1 // 1 n is False\nself.func_a(True) if self.func_c(False) else self.func_b(True conditional_execution/contract.py:46-47 + callsub func_b // {func_b} if condition is False\nself.func_a(True) if self.func_c(False) else self.func_b(True) conditional_execution/contract.py:46-47 + pop // # Ternary condition won't execute if condition is False\nself.func_a(True) if self.fu... conditional_execution/contract.py:46-47 // Implicit fall through to main_ternary_merge@48 // main_ternary_merge@48: - int 0 // 0 self.did_execute_a conditional_execution/contract.py:49 - byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:49 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:49 - // virtual: store app_global_get_ex_did_exist%50#0 to l-stack (no copy) app_global_get_ex_did_exist%50#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:49 - // virtual: store app_global_get_ex_value%49#0 to l-stack (no copy) app_global_get_ex_value%49#0,app_global_get_ex_did_exist%50#0 self.did_execute_a conditional_execution/contract.py:49 - // virtual: load app_global_get_ex_did_exist%50#0 from l-stack (no copy) app_global_get_ex_value%49#0,app_global_get_ex_did_exist%50#0 self.did_execute_a conditional_execution/contract.py:49 - assert // check did_execute_a exists // app_global_get_ex_value%49#0 self.did_execute_a conditional_execution/contract.py:49 - // virtual: load app_global_get_ex_value%49#0 from l-stack (no copy) app_global_get_ex_value%49#0 not self.did_execute_a conditional_execution/contract.py:49 - bnz main_bool_false@51 // not self.did_execute_a conditional_execution/contract.py:49 - // Implicit fall through to main_and_contd@49 // not self.did_execute_a conditional_execution/contract.py:49 + int 0 // 0 self.did_execute_a conditional_execution/contract.py:49 + byte "did_execute_a" // 0,"did_execute_a" self.did_execute_a conditional_execution/contract.py:49 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_a conditional_execution/contract.py:49 + // virtual: store did_execute_a_exists%50#0 to l-stack (no copy) did_execute_a_exists%50#0,{app_global_get_ex}.0 self.did_execute_a conditional_execution/contract.py:49 + // virtual: store did_execute_a_value%49#0 to l-stack (no copy) did_execute_a_value%49#0,did_execute_a_exists%50#0 self.did_execute_a conditional_execution/contract.py:49 + // virtual: load did_execute_a_exists%50#0 from l-stack (no copy) did_execute_a_value%49#0,did_execute_a_exists%50#0 self.did_execute_a conditional_execution/contract.py:49 + assert // check did_execute_a exists // did_execute_a_value%49#0 self.did_execute_a conditional_execution/contract.py:49 + // virtual: load did_execute_a_value%49#0 from l-stack (no copy) did_execute_a_value%49#0 not self.did_execute_a conditional_execution/contract.py:49 + bnz main_bool_false@51 // not self.did_execute_a conditional_execution/contract.py:49 + // Implicit fall through to main_and_contd@49 // not self.did_execute_a conditional_execution/contract.py:49 main_and_contd@49: - int 0 // 0 self.did_execute_b conditional_execution/contract.py:49 - byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:49 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:49 - // virtual: store app_global_get_ex_did_exist%52#0 to l-stack (no copy) app_global_get_ex_did_exist%52#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:49 - // virtual: store app_global_get_ex_value%51#0 to l-stack (no copy) app_global_get_ex_value%51#0,app_global_get_ex_did_exist%52#0 self.did_execute_b conditional_execution/contract.py:49 - // virtual: load app_global_get_ex_did_exist%52#0 from l-stack (no copy) app_global_get_ex_value%51#0,app_global_get_ex_did_exist%52#0 self.did_execute_b conditional_execution/contract.py:49 - assert // check did_execute_b exists // app_global_get_ex_value%51#0 self.did_execute_b conditional_execution/contract.py:49 - // virtual: load app_global_get_ex_value%51#0 from l-stack (no copy) app_global_get_ex_value%51#0 not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 - bz main_bool_false@51 // not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 - // Implicit fall through to main_bool_true@50 // not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 + int 0 // 0 self.did_execute_b conditional_execution/contract.py:49 + byte "did_execute_b" // 0,"did_execute_b" self.did_execute_b conditional_execution/contract.py:49 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.did_execute_b conditional_execution/contract.py:49 + // virtual: store did_execute_b_exists%52#0 to l-stack (no copy) did_execute_b_exists%52#0,{app_global_get_ex}.0 self.did_execute_b conditional_execution/contract.py:49 + // virtual: store did_execute_b_value%51#0 to l-stack (no copy) did_execute_b_value%51#0,did_execute_b_exists%52#0 self.did_execute_b conditional_execution/contract.py:49 + // virtual: load did_execute_b_exists%52#0 from l-stack (no copy) did_execute_b_value%51#0,did_execute_b_exists%52#0 self.did_execute_b conditional_execution/contract.py:49 + assert // check did_execute_b exists // did_execute_b_value%51#0 self.did_execute_b conditional_execution/contract.py:49 + // virtual: load did_execute_b_value%51#0 from l-stack (no copy) did_execute_b_value%51#0 not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 + bz main_bool_false@51 // not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 + // Implicit fall through to main_bool_true@50 // not self.did_execute_a and self.did_execute_b conditional_execution/contract.py:49 main_bool_true@50: - int 1 // 1 - // virtual: store and_result%53#0 to x-stack (no copy) (𝕏) and_result%53#0 | - b main_bool_merge@52 // (𝕏) and_result%53#0 | and_result%53#0 + int 1 // 1 + // virtual: store and_result%53#0 to x-stack (no copy) (𝕏) and_result%53#0 | + b main_bool_merge@52 // (𝕏) and_result%53#0 | and_result%53#0 main_bool_false@51: - int 0 // 0 - // virtual: store and_result%53#0 to x-stack (no copy) (𝕏) and_result%53#0 | - // Implicit fall through to main_bool_merge@52 // (𝕏) and_result%53#0 | and_result%53#0 + int 0 // 0 + // virtual: store and_result%53#0 to x-stack (no copy) (𝕏) and_result%53#0 | + // Implicit fall through to main_bool_merge@52 // (𝕏) and_result%53#0 | and_result%53#0 main_bool_merge@52: - // virtual: load and_result%53#0 from x-stack and_result%53#0 and_result%53#0 self.assert_and_reset(\nnot self.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:48-50 - callsub assert_and_reset // self.assert_and_reset(\nnot self.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:48-50 - int 1 // 1 True conditional_execution/contract.py:52 - return // return True conditional_execution/contract.py:52 + // virtual: load and_result%53#0 from x-stack and_result%53#0 and_result%53#0 self.assert_and_reset(\nnot self.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:48-50 + callsub assert_and_reset // self.assert_and_reset(\nnot self.did_execute_a and self.did_execute_b,\n) conditional_execution/contract.py:48-50 + int 1 // 1 True conditional_execution/contract.py:52 + return // return True conditional_execution/contract.py:52 // test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(ret_val: uint64) -> uint64: func_a: - proto 1 1 // (𝕡) ret_val#0 | @subroutine\ndef func_a(self, ret_val: bool) -> bool: conditional_execution/contract.py:63-64 + proto 1 1 // (𝕡) ret_val#0 | @subroutine\ndef func_a(self, ret_val: bool) -> bool: conditional_execution/contract.py:63-64 func_a_block@0: - byte "did_execute_a" // (𝕡) ret_val#0 | "did_execute_a" self.did_execute_a conditional_execution/contract.py:65 - int 1 // (𝕡) ret_val#0 | "did_execute_a",1 True conditional_execution/contract.py:65 - app_global_put // (𝕡) ret_val#0 | self.did_execute_a = True conditional_execution/contract.py:65 - frame_dig -1 // load ret_val#0 from parameters (𝕡) ret_val#0 | ret_val#0 return ret_val conditional_execution/contract.py:66 - retsub // ret_val#0 return ret_val conditional_execution/contract.py:66 + byte "did_execute_a" // (𝕡) ret_val#0 | "did_execute_a" self.did_execute_a conditional_execution/contract.py:65 + int 1 // (𝕡) ret_val#0 | "did_execute_a",1 True conditional_execution/contract.py:65 + app_global_put // (𝕡) ret_val#0 | self.did_execute_a = True conditional_execution/contract.py:65 + frame_dig -1 // load ret_val#0 from parameters (𝕡) ret_val#0 | ret_val#0 return ret_val conditional_execution/contract.py:66 + retsub // ret_val#0 return ret_val conditional_execution/contract.py:66 // test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(ret_val: uint64) -> uint64: func_b: - proto 1 1 // (𝕡) ret_val#0 | @subroutine\ndef func_b(self, ret_val: bool) -> bool: conditional_execution/contract.py:68-69 + proto 1 1 // (𝕡) ret_val#0 | @subroutine\ndef func_b(self, ret_val: bool) -> bool: conditional_execution/contract.py:68-69 func_b_block@0: - byte "did_execute_b" // (𝕡) ret_val#0 | "did_execute_b" self.did_execute_b conditional_execution/contract.py:70 - int 1 // (𝕡) ret_val#0 | "did_execute_b",1 True conditional_execution/contract.py:70 - app_global_put // (𝕡) ret_val#0 | self.did_execute_b = True conditional_execution/contract.py:70 - frame_dig -1 // load ret_val#0 from parameters (𝕡) ret_val#0 | ret_val#0 return ret_val conditional_execution/contract.py:71 - retsub // ret_val#0 return ret_val conditional_execution/contract.py:71 + byte "did_execute_b" // (𝕡) ret_val#0 | "did_execute_b" self.did_execute_b conditional_execution/contract.py:70 + int 1 // (𝕡) ret_val#0 | "did_execute_b",1 True conditional_execution/contract.py:70 + app_global_put // (𝕡) ret_val#0 | self.did_execute_b = True conditional_execution/contract.py:70 + frame_dig -1 // load ret_val#0 from parameters (𝕡) ret_val#0 | ret_val#0 return ret_val conditional_execution/contract.py:71 + retsub // ret_val#0 return ret_val conditional_execution/contract.py:71 // test_cases.conditional_execution.contract.ConditionalExecutionContract.assert_and_reset(condition: uint64) -> void: assert_and_reset: - proto 1 0 // (𝕡) condition#0 | @subroutine\ndef assert_and_reset(self, condition: bool) -> None: conditional_execution/contract.py:57-58 + proto 1 0 // (𝕡) condition#0 | @subroutine\ndef assert_and_reset(self, condition: bool) -> None: conditional_execution/contract.py:57-58 assert_and_reset_block@0: - frame_dig -1 // load condition#0 from parameters (𝕡) condition#0 | condition#0 assert condition conditional_execution/contract.py:59 - assert // (𝕡) condition#0 | assert condition conditional_execution/contract.py:59 - byte "did_execute_b" // (𝕡) condition#0 | "did_execute_b" self.did_execute_b conditional_execution/contract.py:60 - int 0 // (𝕡) condition#0 | "did_execute_b",0 False conditional_execution/contract.py:60 - app_global_put // (𝕡) condition#0 | self.did_execute_b = False conditional_execution/contract.py:60 - byte "did_execute_a" // (𝕡) condition#0 | "did_execute_a" self.did_execute_a conditional_execution/contract.py:61 - int 0 // (𝕡) condition#0 | "did_execute_a",0 False conditional_execution/contract.py:61 - app_global_put // (𝕡) condition#0 | self.did_execute_a = False conditional_execution/contract.py:61 + frame_dig -1 // load condition#0 from parameters (𝕡) condition#0 | condition#0 assert condition conditional_execution/contract.py:59 + assert // (𝕡) condition#0 | assert condition conditional_execution/contract.py:59 + byte "did_execute_b" // (𝕡) condition#0 | "did_execute_b" self.did_execute_b conditional_execution/contract.py:60 + int 0 // (𝕡) condition#0 | "did_execute_b",0 False conditional_execution/contract.py:60 + app_global_put // (𝕡) condition#0 | self.did_execute_b = False conditional_execution/contract.py:60 + byte "did_execute_a" // (𝕡) condition#0 | "did_execute_a" self.did_execute_a conditional_execution/contract.py:61 + int 0 // (𝕡) condition#0 | "did_execute_a",0 False conditional_execution/contract.py:61 + app_global_put // (𝕡) condition#0 | self.did_execute_a = False conditional_execution/contract.py:61 retsub // // test_cases.conditional_execution.contract.ConditionalExecutionContract.func_c(ret_val: uint64) -> uint64: func_c: - proto 1 1 // (𝕡) ret_val#0 | @subroutine\ndef func_c(self, ret_val: bool) -> bool: conditional_execution/contract.py:73-74 + proto 1 1 // (𝕡) ret_val#0 | @subroutine\ndef func_c(self, ret_val: bool) -> bool: conditional_execution/contract.py:73-74 func_c_block@0: - frame_dig -1 // load ret_val#0 from parameters (𝕡) ret_val#0 | ret_val#0 return ret_val conditional_execution/contract.py:75 - retsub // ret_val#0 return ret_val conditional_execution/contract.py:75 + frame_dig -1 // load ret_val#0 from parameters (𝕡) ret_val#0 | ret_val#0 return ret_val conditional_execution/contract.py:75 + retsub // ret_val#0 return ret_val conditional_execution/contract.py:75 // test_cases.conditional_execution.contract.ConditionalExecutionContract.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: conditional_execution/contract.py:5 + proto 0 0 // def __init__(self) -> None: conditional_execution/contract.py:5 __init___block@0: - byte "did_execute_a" // "did_execute_a" self.did_execute_a conditional_execution/contract.py:6 - int 0 // "did_execute_a",0 False conditional_execution/contract.py:6 - app_global_put // self.did_execute_a = False conditional_execution/contract.py:6 - byte "did_execute_b" // "did_execute_b" self.did_execute_b conditional_execution/contract.py:7 - int 0 // "did_execute_b",0 False conditional_execution/contract.py:7 - app_global_put // self.did_execute_b = False conditional_execution/contract.py:7 + byte "did_execute_a" // "did_execute_a" self.did_execute_a conditional_execution/contract.py:6 + int 0 // "did_execute_a",0 False conditional_execution/contract.py:6 + app_global_put // self.did_execute_a = False conditional_execution/contract.py:6 + byte "did_execute_b" // "did_execute_b" self.did_execute_b conditional_execution/contract.py:7 + int 0 // "did_execute_b",0 False conditional_execution/contract.py:7 + app_global_put // self.did_execute_b = False conditional_execution/contract.py:7 retsub // diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir index b568cfd4c9..801c79afcb 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.destructured.ir @@ -14,13 +14,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%2#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@6 block@6: // bool_merge_L10 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists - goto app_global_get_ex_value%4#0 ? block@7 : block@9 + let (did_execute_a_value%4#0: uint64, did_execute_a_exists%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%5#0) // check did_execute_a exists + goto did_execute_a_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists - goto app_global_get_ex_value%6#0 ? block@9 : block@8 + let (did_execute_b_value%6#0: uint64, did_execute_b_exists%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%7#0) // check did_execute_b exists + goto did_execute_b_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u goto block@10 @@ -35,13 +35,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%10#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@14 block@14: // bool_merge_L16 - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists - goto app_global_get_ex_value%12#0 ? block@15 : block@17 + let (did_execute_a_value%12#0: uint64, did_execute_a_exists%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%13#0) // check did_execute_a exists + goto did_execute_a_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists - goto app_global_get_ex_value%14#0 ? block@16 : block@17 + let (did_execute_b_value%14#0: uint64, did_execute_b_exists%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%15#0) // check did_execute_b exists + goto did_execute_b_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u goto block@18 @@ -56,13 +56,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%18#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@22 block@22: // bool_merge_L22 - let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists - goto app_global_get_ex_value%20#0 ? block@23 : block@25 + let (did_execute_a_value%20#0: uint64, did_execute_a_exists%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%21#0) // check did_execute_a exists + goto did_execute_a_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 - let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists - goto app_global_get_ex_value%22#0 ? block@25 : block@24 + let (did_execute_b_value%22#0: uint64, did_execute_b_exists%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%23#0) // check did_execute_b exists + goto did_execute_b_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u goto block@26 @@ -77,13 +77,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%26#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@30 block@30: // bool_merge_L28 - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists - goto app_global_get_ex_value%28#0 ? block@31 : block@33 + let (did_execute_a_value%28#0: uint64, did_execute_a_exists%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%29#0) // check did_execute_a exists + goto did_execute_a_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 - let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists - goto app_global_get_ex_value%30#0 ? block@32 : block@33 + let (did_execute_b_value%30#0: uint64, did_execute_b_exists%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%31#0) // check did_execute_b exists + goto did_execute_b_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u goto block@34 @@ -94,13 +94,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: test_cases.conditional_execution.contract.ConditionalExecutionContract.assert_and_reset(and_result%32#0) let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists - goto app_global_get_ex_value%35#0 ? block@35 : block@37 + let (did_execute_a_value%35#0: uint64, did_execute_a_exists%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%36#0) // check did_execute_a exists + goto did_execute_a_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 - let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists - goto app_global_get_ex_value%37#0 ? block@36 : block@37 + let (did_execute_b_value%37#0: uint64, did_execute_b_exists%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%38#0) // check did_execute_b exists + goto did_execute_b_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u goto block@38 @@ -118,13 +118,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%41#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@41 block@41: // ternary_merge_L40 - let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists - goto app_global_get_ex_value%42#0 ? block@42 : block@44 + let (did_execute_a_value%42#0: uint64, did_execute_a_exists%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%43#0) // check did_execute_a exists + goto did_execute_a_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 - let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists - goto app_global_get_ex_value%44#0 ? block@44 : block@43 + let (did_execute_b_value%44#0: uint64, did_execute_b_exists%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%45#0) // check did_execute_b exists + goto did_execute_b_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u goto block@45 @@ -142,13 +142,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%48#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@48 block@48: // ternary_merge_L46 - let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists - goto app_global_get_ex_value%49#0 ? block@51 : block@49 + let (did_execute_a_value%49#0: uint64, did_execute_a_exists%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%50#0) // check did_execute_a exists + goto did_execute_a_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 - let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists - goto app_global_get_ex_value%51#0 ? block@50 : block@51 + let (did_execute_b_value%51#0: uint64, did_execute_b_exists%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%52#0) // check did_execute_b exists + goto did_execute_b_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u goto block@52 diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir index 8c8ca50fa9..cb35074c1c 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.ir @@ -21,13 +21,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@6 block@6: // bool_merge_L10 let or_result%3#2: uint64 = φ(or_result%3#0 <- block@4, or_result%3#1 <- block@5) - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists - goto app_global_get_ex_value%4#0 ? block@7 : block@9 + let (did_execute_a_value%4#0: uint64, did_execute_a_exists%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%5#0) // check did_execute_a exists + goto did_execute_a_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists - goto app_global_get_ex_value%6#0 ? block@9 : block@8 + let (did_execute_b_value%6#0: uint64, did_execute_b_exists%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%7#0) // check did_execute_b exists + goto did_execute_b_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u goto block@10 @@ -50,13 +50,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@14 block@14: // bool_merge_L16 let or_result%11#2: uint64 = φ(or_result%11#0 <- block@12, or_result%11#1 <- block@13) - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists - goto app_global_get_ex_value%12#0 ? block@15 : block@17 + let (did_execute_a_value%12#0: uint64, did_execute_a_exists%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%13#0) // check did_execute_a exists + goto did_execute_a_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists - goto app_global_get_ex_value%14#0 ? block@16 : block@17 + let (did_execute_b_value%14#0: uint64, did_execute_b_exists%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%15#0) // check did_execute_b exists + goto did_execute_b_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u goto block@18 @@ -79,13 +79,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@22 block@22: // bool_merge_L22 let and_result%19#2: uint64 = φ(and_result%19#0 <- block@20, and_result%19#1 <- block@21) - let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists - goto app_global_get_ex_value%20#0 ? block@23 : block@25 + let (did_execute_a_value%20#0: uint64, did_execute_a_exists%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%21#0) // check did_execute_a exists + goto did_execute_a_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 - let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists - goto app_global_get_ex_value%22#0 ? block@25 : block@24 + let (did_execute_b_value%22#0: uint64, did_execute_b_exists%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%23#0) // check did_execute_b exists + goto did_execute_b_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u goto block@26 @@ -108,13 +108,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@30 block@30: // bool_merge_L28 let and_result%27#2: uint64 = φ(and_result%27#0 <- block@28, and_result%27#1 <- block@29) - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists - goto app_global_get_ex_value%28#0 ? block@31 : block@33 + let (did_execute_a_value%28#0: uint64, did_execute_a_exists%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%29#0) // check did_execute_a exists + goto did_execute_a_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 - let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists - goto app_global_get_ex_value%30#0 ? block@32 : block@33 + let (did_execute_b_value%30#0: uint64, did_execute_b_exists%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%31#0) // check did_execute_b exists + goto did_execute_b_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u goto block@34 @@ -126,13 +126,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: test_cases.conditional_execution.contract.ConditionalExecutionContract.assert_and_reset(and_result%32#2) let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists - goto app_global_get_ex_value%35#0 ? block@35 : block@37 + let (did_execute_a_value%35#0: uint64, did_execute_a_exists%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%36#0) // check did_execute_a exists + goto did_execute_a_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 - let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists - goto app_global_get_ex_value%37#0 ? block@36 : block@37 + let (did_execute_b_value%37#0: uint64, did_execute_b_exists%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%38#0) // check did_execute_b exists + goto did_execute_b_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u goto block@38 @@ -152,13 +152,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@41 block@41: // ternary_merge_L40 let ternary_result%41#2: uint64 = φ(ternary_result%41#0 <- block@39, ternary_result%41#1 <- block@40) - let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists - goto app_global_get_ex_value%42#0 ? block@42 : block@44 + let (did_execute_a_value%42#0: uint64, did_execute_a_exists%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%43#0) // check did_execute_a exists + goto did_execute_a_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 - let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists - goto app_global_get_ex_value%44#0 ? block@44 : block@43 + let (did_execute_b_value%44#0: uint64, did_execute_b_exists%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%45#0) // check did_execute_b exists + goto did_execute_b_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u goto block@45 @@ -178,13 +178,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: goto block@48 block@48: // ternary_merge_L46 let ternary_result%48#2: uint64 = φ(ternary_result%48#0 <- block@46, ternary_result%48#1 <- block@47) - let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists - goto app_global_get_ex_value%49#0 ? block@51 : block@49 + let (did_execute_a_value%49#0: uint64, did_execute_a_exists%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%50#0) // check did_execute_a exists + goto did_execute_a_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 - let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists - goto app_global_get_ex_value%51#0 ? block@50 : block@51 + let (did_execute_b_value%51#0: uint64, did_execute_b_exists%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%52#0) // check did_execute_b exists + goto did_execute_b_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u goto block@52 diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir index 37ff0b3cde..1daadbf0c3 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_1.ir @@ -20,13 +20,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let or_result%3#1: uint64 = 0u goto block@6 block@6: // bool_merge_L10 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists - goto app_global_get_ex_value%4#0 ? block@7 : block@9 + let (did_execute_a_value%4#0: uint64, did_execute_a_exists%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%5#0) // check did_execute_a exists + goto did_execute_a_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists - goto app_global_get_ex_value%6#0 ? block@9 : block@8 + let (did_execute_b_value%6#0: uint64, did_execute_b_exists%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%7#0) // check did_execute_b exists + goto did_execute_b_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u goto block@10 @@ -48,13 +48,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let or_result%11#1: uint64 = 0u goto block@14 block@14: // bool_merge_L16 - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists - goto app_global_get_ex_value%12#0 ? block@15 : block@17 + let (did_execute_a_value%12#0: uint64, did_execute_a_exists%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%13#0) // check did_execute_a exists + goto did_execute_a_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists - goto app_global_get_ex_value%14#0 ? block@16 : block@17 + let (did_execute_b_value%14#0: uint64, did_execute_b_exists%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%15#0) // check did_execute_b exists + goto did_execute_b_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u goto block@18 @@ -76,13 +76,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let and_result%19#1: uint64 = 0u goto block@22 block@22: // bool_merge_L22 - let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists - goto app_global_get_ex_value%20#0 ? block@23 : block@25 + let (did_execute_a_value%20#0: uint64, did_execute_a_exists%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%21#0) // check did_execute_a exists + goto did_execute_a_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 - let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists - goto app_global_get_ex_value%22#0 ? block@25 : block@24 + let (did_execute_b_value%22#0: uint64, did_execute_b_exists%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%23#0) // check did_execute_b exists + goto did_execute_b_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u goto block@26 @@ -104,13 +104,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let and_result%27#1: uint64 = 0u goto block@30 block@30: // bool_merge_L28 - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists - goto app_global_get_ex_value%28#0 ? block@31 : block@33 + let (did_execute_a_value%28#0: uint64, did_execute_a_exists%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%29#0) // check did_execute_a exists + goto did_execute_a_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 - let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists - goto app_global_get_ex_value%30#0 ? block@32 : block@33 + let (did_execute_b_value%30#0: uint64, did_execute_b_exists%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%31#0) // check did_execute_b exists + goto did_execute_b_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u goto block@34 @@ -122,13 +122,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: test_cases.conditional_execution.contract.ConditionalExecutionContract.assert_and_reset(and_result%32#2) let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists - goto app_global_get_ex_value%35#0 ? block@35 : block@37 + let (did_execute_a_value%35#0: uint64, did_execute_a_exists%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%36#0) // check did_execute_a exists + goto did_execute_a_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 - let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists - goto app_global_get_ex_value%37#0 ? block@36 : block@37 + let (did_execute_b_value%37#0: uint64, did_execute_b_exists%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%38#0) // check did_execute_b exists + goto did_execute_b_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u goto block@38 @@ -147,13 +147,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%41#1: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@41 block@41: // ternary_merge_L40 - let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists - goto app_global_get_ex_value%42#0 ? block@42 : block@44 + let (did_execute_a_value%42#0: uint64, did_execute_a_exists%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%43#0) // check did_execute_a exists + goto did_execute_a_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 - let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists - goto app_global_get_ex_value%44#0 ? block@44 : block@43 + let (did_execute_b_value%44#0: uint64, did_execute_b_exists%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%45#0) // check did_execute_b exists + goto did_execute_b_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u goto block@45 @@ -172,13 +172,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%48#1: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@48 block@48: // ternary_merge_L46 - let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists - goto app_global_get_ex_value%49#0 ? block@51 : block@49 + let (did_execute_a_value%49#0: uint64, did_execute_a_exists%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%50#0) // check did_execute_a exists + goto did_execute_a_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 - let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists - goto app_global_get_ex_value%51#0 ? block@50 : block@51 + let (did_execute_b_value%51#0: uint64, did_execute_b_exists%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%52#0) // check did_execute_b exists + goto did_execute_b_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u goto block@52 diff --git a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir index 0df305b4ba..bcd41eb9f3 100644 --- a/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir +++ b/test_cases/conditional_execution/out/ConditionalExecutionContract.ssa.opt_pass_2.ir @@ -14,13 +14,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%2#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@6 block@6: // bool_merge_L10 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists - goto app_global_get_ex_value%4#0 ? block@7 : block@9 + let (did_execute_a_value%4#0: uint64, did_execute_a_exists%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%5#0) // check did_execute_a exists + goto did_execute_a_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists - goto app_global_get_ex_value%6#0 ? block@9 : block@8 + let (did_execute_b_value%6#0: uint64, did_execute_b_exists%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%7#0) // check did_execute_b exists + goto did_execute_b_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u goto block@10 @@ -36,13 +36,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%10#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@14 block@14: // bool_merge_L16 - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists - goto app_global_get_ex_value%12#0 ? block@15 : block@17 + let (did_execute_a_value%12#0: uint64, did_execute_a_exists%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%13#0) // check did_execute_a exists + goto did_execute_a_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists - goto app_global_get_ex_value%14#0 ? block@16 : block@17 + let (did_execute_b_value%14#0: uint64, did_execute_b_exists%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%15#0) // check did_execute_b exists + goto did_execute_b_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u goto block@18 @@ -58,13 +58,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%18#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@22 block@22: // bool_merge_L22 - let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists - goto app_global_get_ex_value%20#0 ? block@23 : block@25 + let (did_execute_a_value%20#0: uint64, did_execute_a_exists%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%21#0) // check did_execute_a exists + goto did_execute_a_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 - let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists - goto app_global_get_ex_value%22#0 ? block@25 : block@24 + let (did_execute_b_value%22#0: uint64, did_execute_b_exists%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%23#0) // check did_execute_b exists + goto did_execute_b_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u goto block@26 @@ -80,13 +80,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%26#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@30 block@30: // bool_merge_L28 - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists - goto app_global_get_ex_value%28#0 ? block@31 : block@33 + let (did_execute_a_value%28#0: uint64, did_execute_a_exists%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%29#0) // check did_execute_a exists + goto did_execute_a_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 - let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists - goto app_global_get_ex_value%30#0 ? block@32 : block@33 + let (did_execute_b_value%30#0: uint64, did_execute_b_exists%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%31#0) // check did_execute_b exists + goto did_execute_b_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u goto block@34 @@ -98,13 +98,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: test_cases.conditional_execution.contract.ConditionalExecutionContract.assert_and_reset(and_result%32#2) let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists - goto app_global_get_ex_value%35#0 ? block@35 : block@37 + let (did_execute_a_value%35#0: uint64, did_execute_a_exists%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%36#0) // check did_execute_a exists + goto did_execute_a_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 - let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists - goto app_global_get_ex_value%37#0 ? block@36 : block@37 + let (did_execute_b_value%37#0: uint64, did_execute_b_exists%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%38#0) // check did_execute_b exists + goto did_execute_b_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u goto block@38 @@ -123,13 +123,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%41#1: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@41 block@41: // ternary_merge_L40 - let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists - goto app_global_get_ex_value%42#0 ? block@42 : block@44 + let (did_execute_a_value%42#0: uint64, did_execute_a_exists%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%43#0) // check did_execute_a exists + goto did_execute_a_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 - let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists - goto app_global_get_ex_value%44#0 ? block@44 : block@43 + let (did_execute_b_value%44#0: uint64, did_execute_b_exists%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%45#0) // check did_execute_b exists + goto did_execute_b_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u goto block@45 @@ -148,13 +148,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%48#1: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@48 block@48: // ternary_merge_L46 - let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists - goto app_global_get_ex_value%49#0 ? block@51 : block@49 + let (did_execute_a_value%49#0: uint64, did_execute_a_exists%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%50#0) // check did_execute_a exists + goto did_execute_a_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 - let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists - goto app_global_get_ex_value%51#0 ? block@50 : block@51 + let (did_execute_b_value%51#0: uint64, did_execute_b_exists%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%52#0) // check did_execute_b exists + goto did_execute_b_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u goto block@52 diff --git a/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir b/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir index b568cfd4c9..801c79afcb 100644 --- a/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir +++ b/test_cases/conditional_execution/out_O2/ConditionalExecutionContract.destructured.ir @@ -14,13 +14,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%2#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@6 block@6: // bool_merge_L10 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists - goto app_global_get_ex_value%4#0 ? block@7 : block@9 + let (did_execute_a_value%4#0: uint64, did_execute_a_exists%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%5#0) // check did_execute_a exists + goto did_execute_a_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists - goto app_global_get_ex_value%6#0 ? block@9 : block@8 + let (did_execute_b_value%6#0: uint64, did_execute_b_exists%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%7#0) // check did_execute_b exists + goto did_execute_b_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u goto block@10 @@ -35,13 +35,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%10#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@14 block@14: // bool_merge_L16 - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists - goto app_global_get_ex_value%12#0 ? block@15 : block@17 + let (did_execute_a_value%12#0: uint64, did_execute_a_exists%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%13#0) // check did_execute_a exists + goto did_execute_a_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists - goto app_global_get_ex_value%14#0 ? block@16 : block@17 + let (did_execute_b_value%14#0: uint64, did_execute_b_exists%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%15#0) // check did_execute_b exists + goto did_execute_b_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u goto block@18 @@ -56,13 +56,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%18#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@22 block@22: // bool_merge_L22 - let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists - goto app_global_get_ex_value%20#0 ? block@23 : block@25 + let (did_execute_a_value%20#0: uint64, did_execute_a_exists%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%21#0) // check did_execute_a exists + goto did_execute_a_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 - let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists - goto app_global_get_ex_value%22#0 ? block@25 : block@24 + let (did_execute_b_value%22#0: uint64, did_execute_b_exists%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%23#0) // check did_execute_b exists + goto did_execute_b_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u goto block@26 @@ -77,13 +77,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let tmp%26#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@30 block@30: // bool_merge_L28 - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists - goto app_global_get_ex_value%28#0 ? block@31 : block@33 + let (did_execute_a_value%28#0: uint64, did_execute_a_exists%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%29#0) // check did_execute_a exists + goto did_execute_a_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 - let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists - goto app_global_get_ex_value%30#0 ? block@32 : block@33 + let (did_execute_b_value%30#0: uint64, did_execute_b_exists%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%31#0) // check did_execute_b exists + goto did_execute_b_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u goto block@34 @@ -94,13 +94,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: test_cases.conditional_execution.contract.ConditionalExecutionContract.assert_and_reset(and_result%32#0) let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists - goto app_global_get_ex_value%35#0 ? block@35 : block@37 + let (did_execute_a_value%35#0: uint64, did_execute_a_exists%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%36#0) // check did_execute_a exists + goto did_execute_a_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 - let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists - goto app_global_get_ex_value%37#0 ? block@36 : block@37 + let (did_execute_b_value%37#0: uint64, did_execute_b_exists%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%38#0) // check did_execute_b exists + goto did_execute_b_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u goto block@38 @@ -118,13 +118,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%41#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@41 block@41: // ternary_merge_L40 - let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists - goto app_global_get_ex_value%42#0 ? block@42 : block@44 + let (did_execute_a_value%42#0: uint64, did_execute_a_exists%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%43#0) // check did_execute_a exists + goto did_execute_a_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 - let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists - goto app_global_get_ex_value%44#0 ? block@44 : block@43 + let (did_execute_b_value%44#0: uint64, did_execute_b_exists%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%45#0) // check did_execute_b exists + goto did_execute_b_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u goto block@45 @@ -142,13 +142,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%48#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@48 block@48: // ternary_merge_L46 - let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists - goto app_global_get_ex_value%49#0 ? block@51 : block@49 + let (did_execute_a_value%49#0: uint64, did_execute_a_exists%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%50#0) // check did_execute_a exists + goto did_execute_a_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 - let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists - goto app_global_get_ex_value%51#0 ? block@50 : block@51 + let (did_execute_b_value%51#0: uint64, did_execute_b_exists%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%52#0) // check did_execute_b exists + goto did_execute_b_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u goto block@52 diff --git a/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir b/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir index c5520d533b..bbef497119 100644 --- a/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir +++ b/test_cases/conditional_execution/out_unoptimized/ConditionalExecutionContract.destructured.ir @@ -18,13 +18,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@5: // bool_false_L10 goto block@6 block@6: // bool_merge_L10 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%5#0) // check did_execute_a exists - goto app_global_get_ex_value%4#0 ? block@7 : block@9 + let (did_execute_a_value%4#0: uint64, did_execute_a_exists%5#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%5#0) // check did_execute_a exists + goto did_execute_a_value%4#0 ? block@7 : block@9 block@7: // and_contd_L13 - let (app_global_get_ex_value%6#0: uint64, app_global_get_ex_did_exist%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%7#0) // check did_execute_b exists - goto app_global_get_ex_value%6#0 ? block@9 : block@8 + let (did_execute_b_value%6#0: uint64, did_execute_b_exists%7#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%7#0) // check did_execute_b exists + goto did_execute_b_value%6#0 ? block@9 : block@8 block@8: // bool_true_L13 let and_result%8#0: uint64 = 1u goto block@10 @@ -43,13 +43,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@13: // bool_false_L16 goto block@14 block@14: // bool_merge_L16 - let (app_global_get_ex_value%12#0: uint64, app_global_get_ex_did_exist%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%13#0) // check did_execute_a exists - goto app_global_get_ex_value%12#0 ? block@15 : block@17 + let (did_execute_a_value%12#0: uint64, did_execute_a_exists%13#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%13#0) // check did_execute_a exists + goto did_execute_a_value%12#0 ? block@15 : block@17 block@15: // and_contd_L19 - let (app_global_get_ex_value%14#0: uint64, app_global_get_ex_did_exist%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%15#0) // check did_execute_b exists - goto app_global_get_ex_value%14#0 ? block@16 : block@17 + let (did_execute_b_value%14#0: uint64, did_execute_b_exists%15#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%15#0) // check did_execute_b exists + goto did_execute_b_value%14#0 ? block@16 : block@17 block@16: // bool_true_L19 let and_result%16#0: uint64 = 1u goto block@18 @@ -68,13 +68,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@21: // bool_false_L22 goto block@22 block@22: // bool_merge_L22 - let (app_global_get_ex_value%20#0: uint64, app_global_get_ex_did_exist%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%21#0) // check did_execute_a exists - goto app_global_get_ex_value%20#0 ? block@23 : block@25 + let (did_execute_a_value%20#0: uint64, did_execute_a_exists%21#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%21#0) // check did_execute_a exists + goto did_execute_a_value%20#0 ? block@23 : block@25 block@23: // and_contd_L25 - let (app_global_get_ex_value%22#0: uint64, app_global_get_ex_did_exist%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%23#0) // check did_execute_b exists - goto app_global_get_ex_value%22#0 ? block@25 : block@24 + let (did_execute_b_value%22#0: uint64, did_execute_b_exists%23#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%23#0) // check did_execute_b exists + goto did_execute_b_value%22#0 ? block@25 : block@24 block@24: // bool_true_L25 let and_result%24#0: uint64 = 1u goto block@26 @@ -93,13 +93,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: block@29: // bool_false_L28 goto block@30 block@30: // bool_merge_L28 - let (app_global_get_ex_value%28#0: uint64, app_global_get_ex_did_exist%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%29#0) // check did_execute_a exists - goto app_global_get_ex_value%28#0 ? block@31 : block@33 + let (did_execute_a_value%28#0: uint64, did_execute_a_exists%29#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%29#0) // check did_execute_a exists + goto did_execute_a_value%28#0 ? block@31 : block@33 block@31: // and_contd_L31 - let (app_global_get_ex_value%30#0: uint64, app_global_get_ex_did_exist%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%31#0) // check did_execute_b exists - goto app_global_get_ex_value%30#0 ? block@32 : block@33 + let (did_execute_b_value%30#0: uint64, did_execute_b_exists%31#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%31#0) // check did_execute_b exists + goto did_execute_b_value%30#0 ? block@32 : block@33 block@32: // bool_true_L31 let and_result%32#0: uint64 = 1u goto block@34 @@ -110,13 +110,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: test_cases.conditional_execution.contract.ConditionalExecutionContract.assert_and_reset(and_result%32#0) let tmp%33#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_a(1u) let tmp%34#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) - let (app_global_get_ex_value%35#0: uint64, app_global_get_ex_did_exist%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%36#0) // check did_execute_a exists - goto app_global_get_ex_value%35#0 ? block@35 : block@37 + let (did_execute_a_value%35#0: uint64, did_execute_a_exists%36#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%36#0) // check did_execute_a exists + goto did_execute_a_value%35#0 ? block@35 : block@37 block@35: // and_contd_L37 - let (app_global_get_ex_value%37#0: uint64, app_global_get_ex_did_exist%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%38#0) // check did_execute_b exists - goto app_global_get_ex_value%37#0 ? block@36 : block@37 + let (did_execute_b_value%37#0: uint64, did_execute_b_exists%38#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%38#0) // check did_execute_b exists + goto did_execute_b_value%37#0 ? block@36 : block@37 block@36: // bool_true_L37 let and_result%39#0: uint64 = 1u goto block@38 @@ -134,13 +134,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%41#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@41 block@41: // ternary_merge_L40 - let (app_global_get_ex_value%42#0: uint64, app_global_get_ex_did_exist%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%43#0) // check did_execute_a exists - goto app_global_get_ex_value%42#0 ? block@42 : block@44 + let (did_execute_a_value%42#0: uint64, did_execute_a_exists%43#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%43#0) // check did_execute_a exists + goto did_execute_a_value%42#0 ? block@42 : block@44 block@42: // and_contd_L43 - let (app_global_get_ex_value%44#0: uint64, app_global_get_ex_did_exist%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%45#0) // check did_execute_b exists - goto app_global_get_ex_value%44#0 ? block@44 : block@43 + let (did_execute_b_value%44#0: uint64, did_execute_b_exists%45#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%45#0) // check did_execute_b exists + goto did_execute_b_value%44#0 ? block@44 : block@43 block@43: // bool_true_L43 let and_result%46#0: uint64 = 1u goto block@45 @@ -158,13 +158,13 @@ contract test_cases.conditional_execution.contract.ConditionalExecutionContract: let ternary_result%48#0: uint64 = test_cases.conditional_execution.contract.ConditionalExecutionContract.func_b(1u) goto block@48 block@48: // ternary_merge_L46 - let (app_global_get_ex_value%49#0: uint64, app_global_get_ex_did_exist%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") - (assert app_global_get_ex_did_exist%50#0) // check did_execute_a exists - goto app_global_get_ex_value%49#0 ? block@51 : block@49 + let (did_execute_a_value%49#0: uint64, did_execute_a_exists%50#0: uint64) = (app_global_get_ex 0u "did_execute_a") + (assert did_execute_a_exists%50#0) // check did_execute_a exists + goto did_execute_a_value%49#0 ? block@51 : block@49 block@49: // and_contd_L49 - let (app_global_get_ex_value%51#0: uint64, app_global_get_ex_did_exist%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") - (assert app_global_get_ex_did_exist%52#0) // check did_execute_b exists - goto app_global_get_ex_value%51#0 ? block@50 : block@51 + let (did_execute_b_value%51#0: uint64, did_execute_b_exists%52#0: uint64) = (app_global_get_ex 0u "did_execute_b") + (assert did_execute_b_exists%52#0) // check did_execute_b exists + goto did_execute_b_value%51#0 ? block@50 : block@51 block@50: // bool_true_L49 let and_result%53#0: uint64 = 1u goto block@52 diff --git a/test_cases/conditional_execution/puya.log b/test_cases/conditional_execution/puya.log index f7788991d6..0149c7ab38 100644 --- a/test_cases/conditional_execution/puya.log +++ b/test_cases/conditional_execution/puya.log @@ -782,72 +782,72 @@ debug: Inserted main_block@0.ops[1]: 'store app_id%0#0 to l-stack (copy)' debug: Replaced main_block@0.ops[3]: 'load app_id%0#0' with 'load app_id%0#0 from l-stack (no copy)' debug: Inserted main_entrypoint@2.ops[2]: 'store tmp%1#0 to l-stack (copy)' debug: Replaced main_entrypoint@2.ops[4]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@6.ops[3]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' -debug: Replaced main_bool_merge@6.ops[6]: 'load app_global_get_ex_did_exist%5#0' with 'load app_global_get_ex_did_exist%5#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@6.ops[5]: 'store app_global_get_ex_value%4#0 to l-stack (copy)' -debug: Replaced main_bool_merge@6.ops[9]: 'load app_global_get_ex_value%4#0' with 'load app_global_get_ex_value%4#0 from l-stack (no copy)' -debug: Inserted main_and_contd@7.ops[3]: 'store app_global_get_ex_did_exist%7#0 to l-stack (copy)' -debug: Replaced main_and_contd@7.ops[6]: 'load app_global_get_ex_did_exist%7#0' with 'load app_global_get_ex_did_exist%7#0 from l-stack (no copy)' -debug: Inserted main_and_contd@7.ops[5]: 'store app_global_get_ex_value%6#0 to l-stack (copy)' -debug: Replaced main_and_contd@7.ops[9]: 'load app_global_get_ex_value%6#0' with 'load app_global_get_ex_value%6#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@6.ops[3]: 'store did_execute_a_exists%5#0 to l-stack (copy)' +debug: Replaced main_bool_merge@6.ops[6]: 'load did_execute_a_exists%5#0' with 'load did_execute_a_exists%5#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@6.ops[5]: 'store did_execute_a_value%4#0 to l-stack (copy)' +debug: Replaced main_bool_merge@6.ops[9]: 'load did_execute_a_value%4#0' with 'load did_execute_a_value%4#0 from l-stack (no copy)' +debug: Inserted main_and_contd@7.ops[3]: 'store did_execute_b_exists%7#0 to l-stack (copy)' +debug: Replaced main_and_contd@7.ops[6]: 'load did_execute_b_exists%7#0' with 'load did_execute_b_exists%7#0 from l-stack (no copy)' +debug: Inserted main_and_contd@7.ops[5]: 'store did_execute_b_value%6#0 to l-stack (copy)' +debug: Replaced main_and_contd@7.ops[9]: 'load did_execute_b_value%6#0' with 'load did_execute_b_value%6#0 from l-stack (no copy)' debug: Inserted main_bool_merge@10.ops[4]: 'store tmp%9#0 to l-stack (copy)' debug: Replaced main_bool_merge@10.ops[6]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@14.ops[3]: 'store app_global_get_ex_did_exist%13#0 to l-stack (copy)' -debug: Replaced main_bool_merge@14.ops[6]: 'load app_global_get_ex_did_exist%13#0' with 'load app_global_get_ex_did_exist%13#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@14.ops[5]: 'store app_global_get_ex_value%12#0 to l-stack (copy)' -debug: Replaced main_bool_merge@14.ops[9]: 'load app_global_get_ex_value%12#0' with 'load app_global_get_ex_value%12#0 from l-stack (no copy)' -debug: Inserted main_and_contd@15.ops[3]: 'store app_global_get_ex_did_exist%15#0 to l-stack (copy)' -debug: Replaced main_and_contd@15.ops[6]: 'load app_global_get_ex_did_exist%15#0' with 'load app_global_get_ex_did_exist%15#0 from l-stack (no copy)' -debug: Inserted main_and_contd@15.ops[5]: 'store app_global_get_ex_value%14#0 to l-stack (copy)' -debug: Replaced main_and_contd@15.ops[9]: 'load app_global_get_ex_value%14#0' with 'load app_global_get_ex_value%14#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@14.ops[3]: 'store did_execute_a_exists%13#0 to l-stack (copy)' +debug: Replaced main_bool_merge@14.ops[6]: 'load did_execute_a_exists%13#0' with 'load did_execute_a_exists%13#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@14.ops[5]: 'store did_execute_a_value%12#0 to l-stack (copy)' +debug: Replaced main_bool_merge@14.ops[9]: 'load did_execute_a_value%12#0' with 'load did_execute_a_value%12#0 from l-stack (no copy)' +debug: Inserted main_and_contd@15.ops[3]: 'store did_execute_b_exists%15#0 to l-stack (copy)' +debug: Replaced main_and_contd@15.ops[6]: 'load did_execute_b_exists%15#0' with 'load did_execute_b_exists%15#0 from l-stack (no copy)' +debug: Inserted main_and_contd@15.ops[5]: 'store did_execute_b_value%14#0 to l-stack (copy)' +debug: Replaced main_and_contd@15.ops[9]: 'load did_execute_b_value%14#0' with 'load did_execute_b_value%14#0 from l-stack (no copy)' debug: Inserted main_bool_merge@18.ops[4]: 'store tmp%17#0 to l-stack (copy)' debug: Replaced main_bool_merge@18.ops[6]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@22.ops[3]: 'store app_global_get_ex_did_exist%21#0 to l-stack (copy)' -debug: Replaced main_bool_merge@22.ops[6]: 'load app_global_get_ex_did_exist%21#0' with 'load app_global_get_ex_did_exist%21#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@22.ops[5]: 'store app_global_get_ex_value%20#0 to l-stack (copy)' -debug: Replaced main_bool_merge@22.ops[9]: 'load app_global_get_ex_value%20#0' with 'load app_global_get_ex_value%20#0 from l-stack (no copy)' -debug: Inserted main_and_contd@23.ops[3]: 'store app_global_get_ex_did_exist%23#0 to l-stack (copy)' -debug: Replaced main_and_contd@23.ops[6]: 'load app_global_get_ex_did_exist%23#0' with 'load app_global_get_ex_did_exist%23#0 from l-stack (no copy)' -debug: Inserted main_and_contd@23.ops[5]: 'store app_global_get_ex_value%22#0 to l-stack (copy)' -debug: Replaced main_and_contd@23.ops[9]: 'load app_global_get_ex_value%22#0' with 'load app_global_get_ex_value%22#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@22.ops[3]: 'store did_execute_a_exists%21#0 to l-stack (copy)' +debug: Replaced main_bool_merge@22.ops[6]: 'load did_execute_a_exists%21#0' with 'load did_execute_a_exists%21#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@22.ops[5]: 'store did_execute_a_value%20#0 to l-stack (copy)' +debug: Replaced main_bool_merge@22.ops[9]: 'load did_execute_a_value%20#0' with 'load did_execute_a_value%20#0 from l-stack (no copy)' +debug: Inserted main_and_contd@23.ops[3]: 'store did_execute_b_exists%23#0 to l-stack (copy)' +debug: Replaced main_and_contd@23.ops[6]: 'load did_execute_b_exists%23#0' with 'load did_execute_b_exists%23#0 from l-stack (no copy)' +debug: Inserted main_and_contd@23.ops[5]: 'store did_execute_b_value%22#0 to l-stack (copy)' +debug: Replaced main_and_contd@23.ops[9]: 'load did_execute_b_value%22#0' with 'load did_execute_b_value%22#0 from l-stack (no copy)' debug: Inserted main_bool_merge@26.ops[4]: 'store tmp%25#0 to l-stack (copy)' debug: Replaced main_bool_merge@26.ops[6]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@30.ops[3]: 'store app_global_get_ex_did_exist%29#0 to l-stack (copy)' -debug: Replaced main_bool_merge@30.ops[6]: 'load app_global_get_ex_did_exist%29#0' with 'load app_global_get_ex_did_exist%29#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@30.ops[5]: 'store app_global_get_ex_value%28#0 to l-stack (copy)' -debug: Replaced main_bool_merge@30.ops[9]: 'load app_global_get_ex_value%28#0' with 'load app_global_get_ex_value%28#0 from l-stack (no copy)' -debug: Inserted main_and_contd@31.ops[3]: 'store app_global_get_ex_did_exist%31#0 to l-stack (copy)' -debug: Replaced main_and_contd@31.ops[6]: 'load app_global_get_ex_did_exist%31#0' with 'load app_global_get_ex_did_exist%31#0 from l-stack (no copy)' -debug: Inserted main_and_contd@31.ops[5]: 'store app_global_get_ex_value%30#0 to l-stack (copy)' -debug: Replaced main_and_contd@31.ops[9]: 'load app_global_get_ex_value%30#0' with 'load app_global_get_ex_value%30#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@34.ops[11]: 'store app_global_get_ex_did_exist%36#0 to l-stack (copy)' -debug: Replaced main_bool_merge@34.ops[14]: 'load app_global_get_ex_did_exist%36#0' with 'load app_global_get_ex_did_exist%36#0 from l-stack (no copy)' -debug: Inserted main_bool_merge@34.ops[13]: 'store app_global_get_ex_value%35#0 to l-stack (copy)' -debug: Replaced main_bool_merge@34.ops[17]: 'load app_global_get_ex_value%35#0' with 'load app_global_get_ex_value%35#0 from l-stack (no copy)' -debug: Inserted main_and_contd@35.ops[3]: 'store app_global_get_ex_did_exist%38#0 to l-stack (copy)' -debug: Replaced main_and_contd@35.ops[6]: 'load app_global_get_ex_did_exist%38#0' with 'load app_global_get_ex_did_exist%38#0 from l-stack (no copy)' -debug: Inserted main_and_contd@35.ops[5]: 'store app_global_get_ex_value%37#0 to l-stack (copy)' -debug: Replaced main_and_contd@35.ops[9]: 'load app_global_get_ex_value%37#0' with 'load app_global_get_ex_value%37#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@30.ops[3]: 'store did_execute_a_exists%29#0 to l-stack (copy)' +debug: Replaced main_bool_merge@30.ops[6]: 'load did_execute_a_exists%29#0' with 'load did_execute_a_exists%29#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@30.ops[5]: 'store did_execute_a_value%28#0 to l-stack (copy)' +debug: Replaced main_bool_merge@30.ops[9]: 'load did_execute_a_value%28#0' with 'load did_execute_a_value%28#0 from l-stack (no copy)' +debug: Inserted main_and_contd@31.ops[3]: 'store did_execute_b_exists%31#0 to l-stack (copy)' +debug: Replaced main_and_contd@31.ops[6]: 'load did_execute_b_exists%31#0' with 'load did_execute_b_exists%31#0 from l-stack (no copy)' +debug: Inserted main_and_contd@31.ops[5]: 'store did_execute_b_value%30#0 to l-stack (copy)' +debug: Replaced main_and_contd@31.ops[9]: 'load did_execute_b_value%30#0' with 'load did_execute_b_value%30#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@34.ops[11]: 'store did_execute_a_exists%36#0 to l-stack (copy)' +debug: Replaced main_bool_merge@34.ops[14]: 'load did_execute_a_exists%36#0' with 'load did_execute_a_exists%36#0 from l-stack (no copy)' +debug: Inserted main_bool_merge@34.ops[13]: 'store did_execute_a_value%35#0 to l-stack (copy)' +debug: Replaced main_bool_merge@34.ops[17]: 'load did_execute_a_value%35#0' with 'load did_execute_a_value%35#0 from l-stack (no copy)' +debug: Inserted main_and_contd@35.ops[3]: 'store did_execute_b_exists%38#0 to l-stack (copy)' +debug: Replaced main_and_contd@35.ops[6]: 'load did_execute_b_exists%38#0' with 'load did_execute_b_exists%38#0 from l-stack (no copy)' +debug: Inserted main_and_contd@35.ops[5]: 'store did_execute_b_value%37#0 to l-stack (copy)' +debug: Replaced main_and_contd@35.ops[9]: 'load did_execute_b_value%37#0' with 'load did_execute_b_value%37#0 from l-stack (no copy)' debug: Inserted main_bool_merge@38.ops[4]: 'store tmp%40#0 to l-stack (copy)' debug: Replaced main_bool_merge@38.ops[6]: 'load tmp%40#0' with 'load tmp%40#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@41.ops[3]: 'store app_global_get_ex_did_exist%43#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@41.ops[6]: 'load app_global_get_ex_did_exist%43#0' with 'load app_global_get_ex_did_exist%43#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@41.ops[5]: 'store app_global_get_ex_value%42#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@41.ops[9]: 'load app_global_get_ex_value%42#0' with 'load app_global_get_ex_value%42#0 from l-stack (no copy)' -debug: Inserted main_and_contd@42.ops[3]: 'store app_global_get_ex_did_exist%45#0 to l-stack (copy)' -debug: Replaced main_and_contd@42.ops[6]: 'load app_global_get_ex_did_exist%45#0' with 'load app_global_get_ex_did_exist%45#0 from l-stack (no copy)' -debug: Inserted main_and_contd@42.ops[5]: 'store app_global_get_ex_value%44#0 to l-stack (copy)' -debug: Replaced main_and_contd@42.ops[9]: 'load app_global_get_ex_value%44#0' with 'load app_global_get_ex_value%44#0 from l-stack (no copy)' +debug: Inserted main_ternary_merge@41.ops[3]: 'store did_execute_a_exists%43#0 to l-stack (copy)' +debug: Replaced main_ternary_merge@41.ops[6]: 'load did_execute_a_exists%43#0' with 'load did_execute_a_exists%43#0 from l-stack (no copy)' +debug: Inserted main_ternary_merge@41.ops[5]: 'store did_execute_a_value%42#0 to l-stack (copy)' +debug: Replaced main_ternary_merge@41.ops[9]: 'load did_execute_a_value%42#0' with 'load did_execute_a_value%42#0 from l-stack (no copy)' +debug: Inserted main_and_contd@42.ops[3]: 'store did_execute_b_exists%45#0 to l-stack (copy)' +debug: Replaced main_and_contd@42.ops[6]: 'load did_execute_b_exists%45#0' with 'load did_execute_b_exists%45#0 from l-stack (no copy)' +debug: Inserted main_and_contd@42.ops[5]: 'store did_execute_b_value%44#0 to l-stack (copy)' +debug: Replaced main_and_contd@42.ops[9]: 'load did_execute_b_value%44#0' with 'load did_execute_b_value%44#0 from l-stack (no copy)' debug: Inserted main_bool_merge@45.ops[4]: 'store tmp%47#0 to l-stack (copy)' debug: Replaced main_bool_merge@45.ops[6]: 'load tmp%47#0' with 'load tmp%47#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@48.ops[3]: 'store app_global_get_ex_did_exist%50#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@48.ops[6]: 'load app_global_get_ex_did_exist%50#0' with 'load app_global_get_ex_did_exist%50#0 from l-stack (no copy)' -debug: Inserted main_ternary_merge@48.ops[5]: 'store app_global_get_ex_value%49#0 to l-stack (copy)' -debug: Replaced main_ternary_merge@48.ops[9]: 'load app_global_get_ex_value%49#0' with 'load app_global_get_ex_value%49#0 from l-stack (no copy)' -debug: Inserted main_and_contd@49.ops[3]: 'store app_global_get_ex_did_exist%52#0 to l-stack (copy)' -debug: Replaced main_and_contd@49.ops[6]: 'load app_global_get_ex_did_exist%52#0' with 'load app_global_get_ex_did_exist%52#0 from l-stack (no copy)' -debug: Inserted main_and_contd@49.ops[5]: 'store app_global_get_ex_value%51#0 to l-stack (copy)' -debug: Replaced main_and_contd@49.ops[9]: 'load app_global_get_ex_value%51#0' with 'load app_global_get_ex_value%51#0 from l-stack (no copy)' +debug: Inserted main_ternary_merge@48.ops[3]: 'store did_execute_a_exists%50#0 to l-stack (copy)' +debug: Replaced main_ternary_merge@48.ops[6]: 'load did_execute_a_exists%50#0' with 'load did_execute_a_exists%50#0 from l-stack (no copy)' +debug: Inserted main_ternary_merge@48.ops[5]: 'store did_execute_a_value%49#0 to l-stack (copy)' +debug: Replaced main_ternary_merge@48.ops[9]: 'load did_execute_a_value%49#0' with 'load did_execute_a_value%49#0 from l-stack (no copy)' +debug: Inserted main_and_contd@49.ops[3]: 'store did_execute_b_exists%52#0 to l-stack (copy)' +debug: Replaced main_and_contd@49.ops[6]: 'load did_execute_b_exists%52#0' with 'load did_execute_b_exists%52#0 from l-stack (no copy)' +debug: Inserted main_and_contd@49.ops[5]: 'store did_execute_b_value%51#0 to l-stack (copy)' +debug: Replaced main_and_contd@49.ops[9]: 'load did_execute_b_value%51#0' with 'load did_execute_b_value%51#0 from l-stack (no copy)' debug: Found 23 edge set/s for test_cases.conditional_execution.contract.ConditionalExecutionContract.approval_program debug: Allocated 7 variable/s to x-stack: and_result%16#0, and_result%24#0, and_result%32#0, and_result%39#0, and_result%46#0, and_result%53#0, and_result%8#0 debug: shared x-stack for main_bool_true@8 -> main_bool_merge@10: and_result%8#0 diff --git a/test_cases/everything/out/MyContract.approval.mir b/test_cases/everything/out/MyContract.approval.mir index 9b6c07cf72..6e6107e136 100644 --- a/test_cases/everything/out/MyContract.approval.mir +++ b/test_cases/everything/out/MyContract.approval.mir @@ -1,402 +1,402 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.everything.contract.Everything.approval_program() -> uint64: main_block@0: - txna ApplicationArgs 0 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "create()void" // tmp%0#0,method<"create()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "register(string)void" // tmp%0#0,method<"create()void">,method<"register(string)void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "say_hello()string" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "calculate(uint64,uint64)uint64" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - method "close_out()void" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - uncover 5 // load tmp%0#0 from l-stack (no copy) method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void">,tmp%0#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - match main_create_route@1 main_register_route@2 main_say_hello_route@3 main_calculate_route@4 main_close_out_route@5 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - err // reject transaction // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + txna ApplicationArgs 0 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "create()void" // tmp%0#0,method<"create()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "register(string)void" // tmp%0#0,method<"create()void">,method<"register(string)void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "say_hello()string" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "calculate(uint64,uint64)uint64" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + method "close_out()void" // tmp%0#0,method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void"> class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + uncover 5 // load tmp%0#0 from l-stack (no copy) method<"create()void">,method<"register(string)void">,method<"say_hello()string">,method<"calculate(uint64,uint64)uint64">,method<"close_out()void">,tmp%0#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + match main_create_route@1 main_register_route@2 main_say_hello_route@3 main_calculate_route@4 main_close_out_route@5 // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + err // reject transaction // class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 main_create_route@1: - txn OnCompletion // {txn} abimethod(create=True) everything/contract.py:41 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 abimethod(create=True) everything/contract.py:41 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 abimethod(create=True) everything/contract.py:41 - ! // {!} abimethod(create=True) everything/contract.py:41 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 abimethod(create=True) everything/contract.py:41 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 abimethod(create=True) everything/contract.py:41 - assert // OnCompletion is NoOp // abimethod(create=True) everything/contract.py:41 - txn ApplicationID // {txn} abimethod(create=True) everything/contract.py:41 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 - ! // {!} abimethod(create=True) everything/contract.py:41 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 abimethod(create=True) everything/contract.py:41 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 abimethod(create=True) everything/contract.py:41 - assert // is creating // abimethod(create=True) everything/contract.py:41 - callsub create // abimethod(create=True) everything/contract.py:41 - int 1 // 1 abimethod(create=True) everything/contract.py:41 - return // abimethod(create=True) everything/contract.py:41 + txn OnCompletion // {txn} abimethod(create=True) everything/contract.py:41 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 abimethod(create=True) everything/contract.py:41 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 abimethod(create=True) everything/contract.py:41 + ! // {!} abimethod(create=True) everything/contract.py:41 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 abimethod(create=True) everything/contract.py:41 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 abimethod(create=True) everything/contract.py:41 + assert // OnCompletion is NoOp // abimethod(create=True) everything/contract.py:41 + txn ApplicationID // {txn} abimethod(create=True) everything/contract.py:41 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 abimethod(create=True) everything/contract.py:41 + ! // {!} abimethod(create=True) everything/contract.py:41 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 abimethod(create=True) everything/contract.py:41 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 abimethod(create=True) everything/contract.py:41 + assert // is creating // abimethod(create=True) everything/contract.py:41 + callsub create // abimethod(create=True) everything/contract.py:41 + int 1 // 1 abimethod(create=True) everything/contract.py:41 + return // abimethod(create=True) everything/contract.py:41 main_register_route@2: - txn OnCompletion // {txn} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - int 1 // tmp%5#0,1 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - swap // load tmp%5#0 from l-stack (no copy) 1,tmp%5#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - shl // {shl} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - int 3 // tmp%6#0,3 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - & // {&} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - assert // OnCompletion is one of NoOp, OptIn // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - txn ApplicationID // {txn} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - assert // is not creating // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - txna ApplicationArgs 1 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - callsub register // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - int 1 // 1 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 - return // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + txn OnCompletion // {txn} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + int 1 // tmp%5#0,1 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + swap // load tmp%5#0 from l-stack (no copy) 1,tmp%5#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + shl // {shl} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + int 3 // tmp%6#0,3 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + & // {&} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%7#0 to l-stack (no copy) tmp%7#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + assert // OnCompletion is one of NoOp, OptIn // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + txn ApplicationID // {txn} abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + assert // is not creating // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + txna ApplicationArgs 1 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + callsub register // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + int 1 // 1 abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 + return // abimethod(allow_actions=["NoOp", "OptIn"]) everything/contract.py:47 main_say_hello_route@3: - txn OnCompletion // {txn} abimethod everything/contract.py:56 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 abimethod everything/contract.py:56 - // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 abimethod everything/contract.py:56 - ! // {!} abimethod everything/contract.py:56 - // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 abimethod everything/contract.py:56 - // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 abimethod everything/contract.py:56 - assert // OnCompletion is NoOp // abimethod everything/contract.py:56 - txn ApplicationID // {txn} abimethod everything/contract.py:56 - // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 - // virtual: load tmp%12#0 from l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 - assert // is not creating // abimethod everything/contract.py:56 - callsub say_hello // {say_hello} abimethod everything/contract.py:56 - // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 abimethod everything/contract.py:56 - byte 0x151f7c75 // tmp%13#0,0x151f7c75 abimethod everything/contract.py:56 - swap // load tmp%13#0 from l-stack (no copy) 0x151f7c75,tmp%13#0 abimethod everything/contract.py:56 - concat // {concat} abimethod everything/contract.py:56 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 abimethod everything/contract.py:56 - // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 abimethod everything/contract.py:56 - log // abimethod everything/contract.py:56 - int 1 // 1 abimethod everything/contract.py:56 - return // abimethod everything/contract.py:56 + txn OnCompletion // {txn} abimethod everything/contract.py:56 + // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 abimethod everything/contract.py:56 + // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 abimethod everything/contract.py:56 + ! // {!} abimethod everything/contract.py:56 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 abimethod everything/contract.py:56 + // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 abimethod everything/contract.py:56 + assert // OnCompletion is NoOp // abimethod everything/contract.py:56 + txn ApplicationID // {txn} abimethod everything/contract.py:56 + // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 + // virtual: load tmp%12#0 from l-stack (no copy) tmp%12#0 abimethod everything/contract.py:56 + assert // is not creating // abimethod everything/contract.py:56 + callsub say_hello // {say_hello} abimethod everything/contract.py:56 + // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 abimethod everything/contract.py:56 + byte 0x151f7c75 // tmp%13#0,0x151f7c75 abimethod everything/contract.py:56 + swap // load tmp%13#0 from l-stack (no copy) 0x151f7c75,tmp%13#0 abimethod everything/contract.py:56 + concat // {concat} abimethod everything/contract.py:56 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 abimethod everything/contract.py:56 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 abimethod everything/contract.py:56 + log // abimethod everything/contract.py:56 + int 1 // 1 abimethod everything/contract.py:56 + return // abimethod everything/contract.py:56 main_calculate_route@4: - txn OnCompletion // {txn} abimethod everything/contract.py:64 - // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 abimethod everything/contract.py:64 - // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 abimethod everything/contract.py:64 - ! // {!} abimethod everything/contract.py:64 - // virtual: store tmp%16#0 to l-stack (no copy) tmp%16#0 abimethod everything/contract.py:64 - // virtual: load tmp%16#0 from l-stack (no copy) tmp%16#0 abimethod everything/contract.py:64 - assert // OnCompletion is NoOp // abimethod everything/contract.py:64 - txn ApplicationID // {txn} abimethod everything/contract.py:64 - // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 - // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 - assert // is not creating // abimethod everything/contract.py:64 - txna ApplicationArgs 1 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - txna ApplicationArgs 2 // tmp%18#0,{txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: store tmp%19#0 to l-stack (no copy) tmp%18#0,tmp%19#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 - // virtual: load tmp%18#0 from l-stack (no copy) tmp%19#0,tmp%18#0 abimethod everything/contract.py:64 - // virtual: load tmp%19#0 from l-stack (no copy) tmp%18#0,tmp%19#0 abimethod everything/contract.py:64 - callsub calculate // {calculate} abimethod everything/contract.py:64 - // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 abimethod everything/contract.py:64 - byte 0x151f7c75 // tmp%20#0,0x151f7c75 abimethod everything/contract.py:64 - swap // load tmp%20#0 from l-stack (no copy) 0x151f7c75,tmp%20#0 abimethod everything/contract.py:64 - concat // {concat} abimethod everything/contract.py:64 - // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 abimethod everything/contract.py:64 - // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 abimethod everything/contract.py:64 - log // abimethod everything/contract.py:64 - int 1 // 1 abimethod everything/contract.py:64 - return // abimethod everything/contract.py:64 + txn OnCompletion // {txn} abimethod everything/contract.py:64 + // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 abimethod everything/contract.py:64 + // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 abimethod everything/contract.py:64 + ! // {!} abimethod everything/contract.py:64 + // virtual: store tmp%16#0 to l-stack (no copy) tmp%16#0 abimethod everything/contract.py:64 + // virtual: load tmp%16#0 from l-stack (no copy) tmp%16#0 abimethod everything/contract.py:64 + assert // OnCompletion is NoOp // abimethod everything/contract.py:64 + txn ApplicationID // {txn} abimethod everything/contract.py:64 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 + // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 abimethod everything/contract.py:64 + assert // is not creating // abimethod everything/contract.py:64 + txna ApplicationArgs 1 // {txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: store tmp%18#0 to l-stack (no copy) tmp%18#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + txna ApplicationArgs 2 // tmp%18#0,{txna} class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: store tmp%19#0 to l-stack (no copy) tmp%18#0,tmp%19#0 class Everything(ARC4Contract, MyMiddleBase, name="MyContract"): everything/contract.py:37 + // virtual: load tmp%18#0 from l-stack (no copy) tmp%19#0,tmp%18#0 abimethod everything/contract.py:64 + // virtual: load tmp%19#0 from l-stack (no copy) tmp%18#0,tmp%19#0 abimethod everything/contract.py:64 + callsub calculate // {calculate} abimethod everything/contract.py:64 + // virtual: store tmp%20#0 to l-stack (no copy) tmp%20#0 abimethod everything/contract.py:64 + byte 0x151f7c75 // tmp%20#0,0x151f7c75 abimethod everything/contract.py:64 + swap // load tmp%20#0 from l-stack (no copy) 0x151f7c75,tmp%20#0 abimethod everything/contract.py:64 + concat // {concat} abimethod everything/contract.py:64 + // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 abimethod everything/contract.py:64 + // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 abimethod everything/contract.py:64 + log // abimethod everything/contract.py:64 + int 1 // 1 abimethod everything/contract.py:64 + return // abimethod everything/contract.py:64 main_close_out_route@5: - txn OnCompletion // {txn} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - int CloseOut // tmp%22#0,CloseOut abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - == // {==} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - assert // OnCompletion is CloseOut // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - txn ApplicationID // {txn} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - assert // is not creating // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - callsub close_out // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - int 1 // 1 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 - return // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + txn OnCompletion // {txn} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: store tmp%22#0 to l-stack (no copy) tmp%22#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: load tmp%22#0 from l-stack (no copy) tmp%22#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + int CloseOut // tmp%22#0,CloseOut abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + == // {==} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + assert // OnCompletion is CloseOut // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + txn ApplicationID // {txn} abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + assert // is not creating // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + callsub close_out // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + int 1 // 1 abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 + return // abimethod(allow_actions=["CloseOut"]) everything/contract.py:69 // test_cases.everything.contract.Everything.create() -> void: create: - proto 0 0 // @abimethod(create=True)\ndef create(self) -> None: everything/contract.py:41-42 + proto 0 0 // @abimethod(create=True)\ndef create(self) -> None: everything/contract.py:41-42 create_block@0: - callsub _check_ban_list // self._check_ban_list() everything/contract.py:43 - callsub remember_creator // self.remember_creator() everything/contract.py:44 - byte "counter" // "counter" self.counter everything/contract.py:45 - int 0 // "counter",0 ZERO everything/contract.py:45 - app_global_put // self.counter = UInt64(ZERO) everything/contract.py:45 + callsub _check_ban_list // self._check_ban_list() everything/contract.py:43 + callsub remember_creator // self.remember_creator() everything/contract.py:44 + byte "counter" // "counter" self.counter everything/contract.py:45 + int 0 // "counter",0 ZERO everything/contract.py:45 + app_global_put // self.counter = UInt64(ZERO) everything/contract.py:45 retsub // // test_cases.everything.contract.Everything._check_ban_list() -> void: _check_ban_list: - proto 0 0 // @subroutine\ndef _check_ban_list(self) -> None: everything/contract.py:77-78 + proto 0 0 // @subroutine\ndef _check_ban_list(self) -> None: everything/contract.py:77-78 _check_ban_list_block@0: - txn Sender // {txn} op.Txn.sender everything/contract.py:79 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 op.Txn.sender everything/contract.py:79 - callsub get_banned // tmp%0#0,{get_banned} get_banned() everything/contract.py:79 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%0#0,tmp%1#0 get_banned() everything/contract.py:79 - // virtual: load tmp%0#0 from l-stack (no copy) tmp%1#0,tmp%0#0 op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%0#0,tmp%1#0 op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 - != // {!=} op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 assert op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 - assert // You are banned, goodbye // assert op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 + txn Sender // {txn} op.Txn.sender everything/contract.py:79 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 op.Txn.sender everything/contract.py:79 + callsub get_banned // tmp%0#0,{get_banned} get_banned() everything/contract.py:79 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%0#0,tmp%1#0 get_banned() everything/contract.py:79 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%1#0,tmp%0#0 op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%0#0,tmp%1#0 op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 + != // {!=} op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 assert op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 + assert // You are banned, goodbye // assert op.Txn.sender != get_banned(), "You are banned, goodbye" everything/contract.py:79 retsub // // test_cases.everything.contract.get_banned() -> bytes: get_banned: - proto 0 1 // @subroutine\ndef get_banned() -> Account: everything/contract.py:23-24 + proto 0 1 // @subroutine\ndef get_banned() -> Account: everything/contract.py:23-24 get_banned_block@0: - addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA // VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA BANNED everything/contract.py:25 - retsub // VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA return addr everything/contract.py:26 + addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA // VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA BANNED everything/contract.py:25 + retsub // VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA return addr everything/contract.py:26 // test_cases.everything.my_base.MyBase.remember_creator() -> void: remember_creator: - proto 0 0 // @subroutine\ndef remember_creator(self) -> None: everything/my_base.py:7-8 + proto 0 0 // @subroutine\ndef remember_creator(self) -> None: everything/my_base.py:7-8 remember_creator_block@0: - txn Sender // {txn} op.Txn.sender everything/my_base.py:9 - // virtual: store new_state_value%0#0 to l-stack (no copy) new_state_value%0#0 op.Txn.sender everything/my_base.py:9 - byte "creator" // new_state_value%0#0,"creator" self.creator everything/my_base.py:9 - swap // load new_state_value%0#0 from l-stack (no copy) "creator",new_state_value%0#0 self.creator = op.Txn.sender everything/my_base.py:9 - app_global_put // self.creator = op.Txn.sender everything/my_base.py:9 + txn Sender // {txn} op.Txn.sender everything/my_base.py:9 + // virtual: store new_state_value%0#0 to l-stack (no copy) new_state_value%0#0 op.Txn.sender everything/my_base.py:9 + byte "creator" // new_state_value%0#0,"creator" self.creator everything/my_base.py:9 + swap // load new_state_value%0#0 from l-stack (no copy) "creator",new_state_value%0#0 self.creator = op.Txn.sender everything/my_base.py:9 + app_global_put // self.creator = op.Txn.sender everything/my_base.py:9 retsub // // test_cases.everything.contract.Everything.register(name: bytes) -> void: register: - proto 1 0 // (𝕡) name#0 | @abimethod(allow_actions=["NoOp", "OptIn"])\ndef register(self, name: String) -> None: everything/contract.py:47-48 + proto 1 0 // (𝕡) name#0 | @abimethod(allow_actions=["NoOp", "OptIn"])\ndef register(self, name: String) -> None: everything/contract.py:47-48 register_block@0: - callsub _check_ban_list // (𝕡) name#0 | self._check_ban_list() everything/contract.py:49 - txn OnCompletion // (𝕡) name#0 | {txn} op.Txn.on_completion everything/contract.py:50 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) name#0 | tmp%0#0 op.Txn.on_completion everything/contract.py:50 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) name#0 | tmp%0#0 op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 - int OptIn // (𝕡) name#0 | tmp%0#0,OptIn OnCompleteAction.OptIn everything/contract.py:50 - == // (𝕡) name#0 | {==} op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) name#0 | tmp%1#0 op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) name#0 | tmp%1#0 if op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 - bz register_after_if_else@4 // (𝕡) name#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 - // Implicit fall through to register_if_body@1 // (𝕡) name#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 + callsub _check_ban_list // (𝕡) name#0 | self._check_ban_list() everything/contract.py:49 + txn OnCompletion // (𝕡) name#0 | {txn} op.Txn.on_completion everything/contract.py:50 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) name#0 | tmp%0#0 op.Txn.on_completion everything/contract.py:50 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) name#0 | tmp%0#0 op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 + int OptIn // (𝕡) name#0 | tmp%0#0,OptIn OnCompleteAction.OptIn everything/contract.py:50 + == // (𝕡) name#0 | {==} op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) name#0 | tmp%1#0 op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) name#0 | tmp%1#0 if op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 + bz register_after_if_else@4 // (𝕡) name#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 + // Implicit fall through to register_if_body@1 // (𝕡) name#0 | if op.Txn.on_completion == OnCompleteAction.OptIn: everything/contract.py:50 register_if_body@1: - int 0 // (𝕡) name#0 | 0 0 everything/contract.py:51 - int 0 // (𝕡) name#0 | 0,0 self.name.maybe(account=0) everything/contract.py:51 - byte "name" // (𝕡) name#0 | 0,0,"name" self.name.maybe(account=0) everything/contract.py:51 - app_local_get_ex // (𝕡) name#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.name.maybe(account=0) everything/contract.py:51 - swap // store sender_name_existed#0 to l-stack (no copy) (𝕡) name#0 | sender_name_existed#0,{app_local_get_ex}.0 self.name.maybe(account=0) everything/contract.py:51 - pop // (𝕡) name#0 | sender_name_existed#0 self.name.maybe(account=0) everything/contract.py:51 - // virtual: load sender_name_existed#0 from l-stack (no copy) (𝕡) name#0 | sender_name_existed#0 not sender_name_existed everything/contract.py:52 - bnz register_after_if_else@4 // (𝕡) name#0 | not sender_name_existed everything/contract.py:52 - // Implicit fall through to register_if_body@2 // (𝕡) name#0 | not sender_name_existed everything/contract.py:52 + int 0 // (𝕡) name#0 | 0 0 everything/contract.py:51 + int 0 // (𝕡) name#0 | 0,0 self.name.maybe(account=0) everything/contract.py:51 + byte "name" // (𝕡) name#0 | 0,0,"name" self.name.maybe(account=0) everything/contract.py:51 + app_local_get_ex // (𝕡) name#0 | {app_local_get_ex}.0,{app_local_get_ex}.1 self.name.maybe(account=0) everything/contract.py:51 + swap // store sender_name_existed#0 to l-stack (no copy) (𝕡) name#0 | sender_name_existed#0,{app_local_get_ex}.0 self.name.maybe(account=0) everything/contract.py:51 + pop // (𝕡) name#0 | sender_name_existed#0 self.name.maybe(account=0) everything/contract.py:51 + // virtual: load sender_name_existed#0 from l-stack (no copy) (𝕡) name#0 | sender_name_existed#0 not sender_name_existed everything/contract.py:52 + bnz register_after_if_else@4 // (𝕡) name#0 | not sender_name_existed everything/contract.py:52 + // Implicit fall through to register_if_body@2 // (𝕡) name#0 | not sender_name_existed everything/contract.py:52 register_if_body@2: - int 0 // (𝕡) name#0 | 0 self.counter everything/contract.py:53 - byte "counter" // (𝕡) name#0 | 0,"counter" self.counter everything/contract.py:53 - app_global_get_ex // (𝕡) name#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:53 - // virtual: store app_global_get_ex_did_exist%5#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_did_exist%5#0,{app_global_get_ex}.0 self.counter everything/contract.py:53 - // virtual: store app_global_get_ex_value%4#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.counter everything/contract.py:53 - // virtual: load app_global_get_ex_did_exist%5#0 from l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%4#0,app_global_get_ex_did_exist%5#0 self.counter everything/contract.py:53 - assert // check counter exists // (𝕡) name#0 | app_global_get_ex_value%4#0 self.counter everything/contract.py:53 - callsub multiplicative_identity // (𝕡) name#0 | app_global_get_ex_value%4#0,{multiplicative_identity} multiplicative_identity() everything/contract.py:53 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%4#0,tmp%6#0 multiplicative_identity() everything/contract.py:53 - // virtual: load app_global_get_ex_value%4#0 from l-stack (no copy) (𝕡) name#0 | tmp%6#0,app_global_get_ex_value%4#0 self.counter += multiplicative_identity() everything/contract.py:53 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%4#0,tmp%6#0 self.counter += multiplicative_identity() everything/contract.py:53 - + // (𝕡) name#0 | {+} self.counter += multiplicative_identity() everything/contract.py:53 - // virtual: store new_state_value%7#0 to l-stack (no copy) (𝕡) name#0 | new_state_value%7#0 self.counter += multiplicative_identity() everything/contract.py:53 - byte "counter" // (𝕡) name#0 | new_state_value%7#0,"counter" self.counter everything/contract.py:53 - swap // load new_state_value%7#0 from l-stack (no copy) (𝕡) name#0 | "counter",new_state_value%7#0 self.counter += multiplicative_identity() everything/contract.py:53 - app_global_put // (𝕡) name#0 | self.counter += multiplicative_identity() everything/contract.py:53 - // Implicit fall through to register_after_if_else@4 // (𝕡) name#0 | + int 0 // (𝕡) name#0 | 0 self.counter everything/contract.py:53 + byte "counter" // (𝕡) name#0 | 0,"counter" self.counter everything/contract.py:53 + app_global_get_ex // (𝕡) name#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:53 + // virtual: store counter_exists%5#0 to l-stack (no copy) (𝕡) name#0 | counter_exists%5#0,{app_global_get_ex}.0 self.counter everything/contract.py:53 + // virtual: store counter_value%4#0 to l-stack (no copy) (𝕡) name#0 | counter_value%4#0,counter_exists%5#0 self.counter everything/contract.py:53 + // virtual: load counter_exists%5#0 from l-stack (no copy) (𝕡) name#0 | counter_value%4#0,counter_exists%5#0 self.counter everything/contract.py:53 + assert // check counter exists // (𝕡) name#0 | counter_value%4#0 self.counter everything/contract.py:53 + callsub multiplicative_identity // (𝕡) name#0 | counter_value%4#0,{multiplicative_identity} multiplicative_identity() everything/contract.py:53 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) name#0 | counter_value%4#0,tmp%6#0 multiplicative_identity() everything/contract.py:53 + // virtual: load counter_value%4#0 from l-stack (no copy) (𝕡) name#0 | tmp%6#0,counter_value%4#0 self.counter += multiplicative_identity() everything/contract.py:53 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) name#0 | counter_value%4#0,tmp%6#0 self.counter += multiplicative_identity() everything/contract.py:53 + + // (𝕡) name#0 | {+} self.counter += multiplicative_identity() everything/contract.py:53 + // virtual: store new_state_value%7#0 to l-stack (no copy) (𝕡) name#0 | new_state_value%7#0 self.counter += multiplicative_identity() everything/contract.py:53 + byte "counter" // (𝕡) name#0 | new_state_value%7#0,"counter" self.counter everything/contract.py:53 + swap // load new_state_value%7#0 from l-stack (no copy) (𝕡) name#0 | "counter",new_state_value%7#0 self.counter += multiplicative_identity() everything/contract.py:53 + app_global_put // (𝕡) name#0 | self.counter += multiplicative_identity() everything/contract.py:53 + // Implicit fall through to register_after_if_else@4 // (𝕡) name#0 | register_after_if_else@4: - int 0 // (𝕡) name#0 | 0 0 everything/contract.py:54 - byte "name" // (𝕡) name#0 | 0,"name" self.name[0] everything/contract.py:54 - frame_dig -1 // load name#0 from parameters (𝕡) name#0 | 0,"name",name#0 self.name[0] = name everything/contract.py:54 - app_local_put // (𝕡) name#0 | self.name[0] = name everything/contract.py:54 + int 0 // (𝕡) name#0 | 0 0 everything/contract.py:54 + byte "name" // (𝕡) name#0 | 0,"name" self.name[0] everything/contract.py:54 + frame_dig -1 // load name#0 from parameters (𝕡) name#0 | 0,"name",name#0 self.name[0] = name everything/contract.py:54 + app_local_put // (𝕡) name#0 | self.name[0] = name everything/contract.py:54 retsub // // test_cases.everything.my_base.multiplicative_identity() -> uint64: multiplicative_identity: - proto 0 1 // @subroutine\ndef multiplicative_identity() -> UInt64: everything/my_base.py:18-19 + proto 0 1 // @subroutine\ndef multiplicative_identity() -> UInt64: everything/my_base.py:18-19 multiplicative_identity_block@0: - int 1 // 1 1 everything/my_base.py:20 - retsub // 1 return UInt64(1) everything/my_base.py:20 + int 1 // 1 1 everything/my_base.py:20 + retsub // 1 return UInt64(1) everything/my_base.py:20 // test_cases.everything.contract.Everything.say_hello() -> bytes: say_hello: - proto 0 1 // @abimethod\ndef say_hello(self) -> String: everything/contract.py:56-57 + proto 0 1 // @abimethod\ndef say_hello(self) -> String: everything/contract.py:56-57 say_hello_block@0: - callsub _check_ban_list // self._check_ban_list() everything/contract.py:58 - int 0 // 0 0 everything/contract.py:59 - int 0 // 0,0 self.name.maybe(account=0) everything/contract.py:59 - byte "name" // 0,0,"name" self.name.maybe(account=0) everything/contract.py:59 - app_local_get_ex // {app_local_get_ex}.0,{app_local_get_ex}.1 self.name.maybe(account=0) everything/contract.py:59 - // virtual: store exists#0 to l-stack (no copy) exists#0,{app_local_get_ex}.0 self.name.maybe(account=0) everything/contract.py:59 - // virtual: store name#0 to f-stack (𝕗) name#0 | exists#0 self.name.maybe(account=0) everything/contract.py:59 - // virtual: load exists#0 from l-stack (no copy) (𝕗) name#0 | exists#0 not exists everything/contract.py:60 - bnz say_hello_after_if_else@2 // (𝕗) name#0 | not exists everything/contract.py:60 - // Implicit fall through to say_hello_if_body@1 // (𝕗) name#0 | not exists everything/contract.py:60 + callsub _check_ban_list // self._check_ban_list() everything/contract.py:58 + int 0 // 0 0 everything/contract.py:59 + int 0 // 0,0 self.name.maybe(account=0) everything/contract.py:59 + byte "name" // 0,0,"name" self.name.maybe(account=0) everything/contract.py:59 + app_local_get_ex // {app_local_get_ex}.0,{app_local_get_ex}.1 self.name.maybe(account=0) everything/contract.py:59 + // virtual: store exists#0 to l-stack (no copy) exists#0,{app_local_get_ex}.0 self.name.maybe(account=0) everything/contract.py:59 + // virtual: store name#0 to f-stack (𝕗) name#0 | exists#0 self.name.maybe(account=0) everything/contract.py:59 + // virtual: load exists#0 from l-stack (no copy) (𝕗) name#0 | exists#0 not exists everything/contract.py:60 + bnz say_hello_after_if_else@2 // (𝕗) name#0 | not exists everything/contract.py:60 + // Implicit fall through to say_hello_if_body@1 // (𝕗) name#0 | not exists everything/contract.py:60 say_hello_if_body@1: - byte "\x00\x0fHowdy stranger!" // (𝕗) name#0 | "\x00\x0fHowdy stranger!" String("Howdy stranger!") everything/contract.py:61 + byte "\x00\x0fHowdy stranger!" // (𝕗) name#0 | "\x00\x0fHowdy stranger!" String("Howdy stranger!") everything/contract.py:61 swap - retsub // "\x00\x0fHowdy stranger!" return String("Howdy stranger!") everything/contract.py:61 + retsub // "\x00\x0fHowdy stranger!" return String("Howdy stranger!") everything/contract.py:61 say_hello_after_if_else@2: - frame_dig 0 // load name#0 from f-stack (𝕗) name#0 | name#0 "Hello, " + name everything/contract.py:62 - extract 2 0 // (𝕗) name#0 | {extract} "Hello, " + name everything/contract.py:62 - // virtual: store expr_value_trimmed%3#0 to l-stack (no copy) (𝕗) name#0 | expr_value_trimmed%3#0 "Hello, " + name everything/contract.py:62 - byte "Hello, " // (𝕗) name#0 | expr_value_trimmed%3#0,"Hello, " "Hello, " + name everything/contract.py:62 - swap // load expr_value_trimmed%3#0 from l-stack (no copy) (𝕗) name#0 | "Hello, ",expr_value_trimmed%3#0 "Hello, " + name everything/contract.py:62 - concat // (𝕗) name#0 | {concat} "Hello, " + name everything/contract.py:62 - // virtual: store concatenated%4#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0 "Hello, " + name everything/contract.py:62 - dup // load concatenated%4#0 from l-stack (copy) (𝕗) name#0 | concatenated%4#0,concatenated%4#0 "Hello, " + name everything/contract.py:62 - len // (𝕗) name#0 | concatenated%4#0,{len} "Hello, " + name everything/contract.py:62 - // virtual: store len_%5#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_%5#0 "Hello, " + name everything/contract.py:62 - // virtual: load len_%5#0 from l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_%5#0 "Hello, " + name everything/contract.py:62 - itob // (𝕗) name#0 | concatenated%4#0,{itob} "Hello, " + name everything/contract.py:62 - // virtual: store len_bytes%6#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_bytes%6#0 "Hello, " + name everything/contract.py:62 - // virtual: load len_bytes%6#0 from l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_bytes%6#0 "Hello, " + name everything/contract.py:62 - extract 6 0 // (𝕗) name#0 | concatenated%4#0,{extract} "Hello, " + name everything/contract.py:62 - // virtual: store len_16_bit%7#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_16_bit%7#0 "Hello, " + name everything/contract.py:62 - // virtual: load len_16_bit%7#0 from l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_16_bit%7#0 "Hello, " + name everything/contract.py:62 - swap // load concatenated%4#0 from l-stack (no copy) (𝕗) name#0 | len_16_bit%7#0,concatenated%4#0 "Hello, " + name everything/contract.py:62 - concat // (𝕗) name#0 | {concat} "Hello, " + name everything/contract.py:62 - // virtual: store concat_result%8#0 to l-stack (no copy) (𝕗) name#0 | concat_result%8#0 "Hello, " + name everything/contract.py:62 - // virtual: load concat_result%8#0 from l-stack (no copy) (𝕗) name#0 | concat_result%8#0 "Hello, " + name + "!" everything/contract.py:62 - extract 2 0 // (𝕗) name#0 | {extract} "Hello, " + name + "!" everything/contract.py:62 - // virtual: store expr_value_trimmed%9#0 to l-stack (no copy) (𝕗) name#0 | expr_value_trimmed%9#0 "Hello, " + name + "!" everything/contract.py:62 - // virtual: load expr_value_trimmed%9#0 from l-stack (no copy) (𝕗) name#0 | expr_value_trimmed%9#0 "Hello, " + name + "!" everything/contract.py:62 - byte "!" // (𝕗) name#0 | expr_value_trimmed%9#0,"!" "Hello, " + name + "!" everything/contract.py:62 - concat // (𝕗) name#0 | {concat} "Hello, " + name + "!" everything/contract.py:62 - // virtual: store concatenated%11#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0 "Hello, " + name + "!" everything/contract.py:62 - dup // load concatenated%11#0 from l-stack (copy) (𝕗) name#0 | concatenated%11#0,concatenated%11#0 "Hello, " + name + "!" everything/contract.py:62 - len // (𝕗) name#0 | concatenated%11#0,{len} "Hello, " + name + "!" everything/contract.py:62 - // virtual: store len_%12#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_%12#0 "Hello, " + name + "!" everything/contract.py:62 - // virtual: load len_%12#0 from l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_%12#0 "Hello, " + name + "!" everything/contract.py:62 - itob // (𝕗) name#0 | concatenated%11#0,{itob} "Hello, " + name + "!" everything/contract.py:62 - // virtual: store len_bytes%13#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_bytes%13#0 "Hello, " + name + "!" everything/contract.py:62 - // virtual: load len_bytes%13#0 from l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_bytes%13#0 "Hello, " + name + "!" everything/contract.py:62 - extract 6 0 // (𝕗) name#0 | concatenated%11#0,{extract} "Hello, " + name + "!" everything/contract.py:62 - // virtual: store len_16_bit%14#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_16_bit%14#0 "Hello, " + name + "!" everything/contract.py:62 - // virtual: load len_16_bit%14#0 from l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_16_bit%14#0 "Hello, " + name + "!" everything/contract.py:62 - swap // load concatenated%11#0 from l-stack (no copy) (𝕗) name#0 | len_16_bit%14#0,concatenated%11#0 "Hello, " + name + "!" everything/contract.py:62 - concat // (𝕗) name#0 | {concat} "Hello, " + name + "!" everything/contract.py:62 - // virtual: store concat_result%15#0 to l-stack (no copy) (𝕗) name#0 | concat_result%15#0 "Hello, " + name + "!" everything/contract.py:62 - // virtual: load concat_result%15#0 from l-stack (no copy) (𝕗) name#0 | concat_result%15#0 return "Hello, " + name + "!" everything/contract.py:62 + frame_dig 0 // load name#0 from f-stack (𝕗) name#0 | name#0 "Hello, " + name everything/contract.py:62 + extract 2 0 // (𝕗) name#0 | {extract} "Hello, " + name everything/contract.py:62 + // virtual: store expr_value_trimmed%3#0 to l-stack (no copy) (𝕗) name#0 | expr_value_trimmed%3#0 "Hello, " + name everything/contract.py:62 + byte "Hello, " // (𝕗) name#0 | expr_value_trimmed%3#0,"Hello, " "Hello, " + name everything/contract.py:62 + swap // load expr_value_trimmed%3#0 from l-stack (no copy) (𝕗) name#0 | "Hello, ",expr_value_trimmed%3#0 "Hello, " + name everything/contract.py:62 + concat // (𝕗) name#0 | {concat} "Hello, " + name everything/contract.py:62 + // virtual: store concatenated%4#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0 "Hello, " + name everything/contract.py:62 + dup // load concatenated%4#0 from l-stack (copy) (𝕗) name#0 | concatenated%4#0,concatenated%4#0 "Hello, " + name everything/contract.py:62 + len // (𝕗) name#0 | concatenated%4#0,{len} "Hello, " + name everything/contract.py:62 + // virtual: store len_%5#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_%5#0 "Hello, " + name everything/contract.py:62 + // virtual: load len_%5#0 from l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_%5#0 "Hello, " + name everything/contract.py:62 + itob // (𝕗) name#0 | concatenated%4#0,{itob} "Hello, " + name everything/contract.py:62 + // virtual: store len_bytes%6#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_bytes%6#0 "Hello, " + name everything/contract.py:62 + // virtual: load len_bytes%6#0 from l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_bytes%6#0 "Hello, " + name everything/contract.py:62 + extract 6 0 // (𝕗) name#0 | concatenated%4#0,{extract} "Hello, " + name everything/contract.py:62 + // virtual: store len_16_bit%7#0 to l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_16_bit%7#0 "Hello, " + name everything/contract.py:62 + // virtual: load len_16_bit%7#0 from l-stack (no copy) (𝕗) name#0 | concatenated%4#0,len_16_bit%7#0 "Hello, " + name everything/contract.py:62 + swap // load concatenated%4#0 from l-stack (no copy) (𝕗) name#0 | len_16_bit%7#0,concatenated%4#0 "Hello, " + name everything/contract.py:62 + concat // (𝕗) name#0 | {concat} "Hello, " + name everything/contract.py:62 + // virtual: store concat_result%8#0 to l-stack (no copy) (𝕗) name#0 | concat_result%8#0 "Hello, " + name everything/contract.py:62 + // virtual: load concat_result%8#0 from l-stack (no copy) (𝕗) name#0 | concat_result%8#0 "Hello, " + name + "!" everything/contract.py:62 + extract 2 0 // (𝕗) name#0 | {extract} "Hello, " + name + "!" everything/contract.py:62 + // virtual: store expr_value_trimmed%9#0 to l-stack (no copy) (𝕗) name#0 | expr_value_trimmed%9#0 "Hello, " + name + "!" everything/contract.py:62 + // virtual: load expr_value_trimmed%9#0 from l-stack (no copy) (𝕗) name#0 | expr_value_trimmed%9#0 "Hello, " + name + "!" everything/contract.py:62 + byte "!" // (𝕗) name#0 | expr_value_trimmed%9#0,"!" "Hello, " + name + "!" everything/contract.py:62 + concat // (𝕗) name#0 | {concat} "Hello, " + name + "!" everything/contract.py:62 + // virtual: store concatenated%11#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0 "Hello, " + name + "!" everything/contract.py:62 + dup // load concatenated%11#0 from l-stack (copy) (𝕗) name#0 | concatenated%11#0,concatenated%11#0 "Hello, " + name + "!" everything/contract.py:62 + len // (𝕗) name#0 | concatenated%11#0,{len} "Hello, " + name + "!" everything/contract.py:62 + // virtual: store len_%12#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_%12#0 "Hello, " + name + "!" everything/contract.py:62 + // virtual: load len_%12#0 from l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_%12#0 "Hello, " + name + "!" everything/contract.py:62 + itob // (𝕗) name#0 | concatenated%11#0,{itob} "Hello, " + name + "!" everything/contract.py:62 + // virtual: store len_bytes%13#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_bytes%13#0 "Hello, " + name + "!" everything/contract.py:62 + // virtual: load len_bytes%13#0 from l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_bytes%13#0 "Hello, " + name + "!" everything/contract.py:62 + extract 6 0 // (𝕗) name#0 | concatenated%11#0,{extract} "Hello, " + name + "!" everything/contract.py:62 + // virtual: store len_16_bit%14#0 to l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_16_bit%14#0 "Hello, " + name + "!" everything/contract.py:62 + // virtual: load len_16_bit%14#0 from l-stack (no copy) (𝕗) name#0 | concatenated%11#0,len_16_bit%14#0 "Hello, " + name + "!" everything/contract.py:62 + swap // load concatenated%11#0 from l-stack (no copy) (𝕗) name#0 | len_16_bit%14#0,concatenated%11#0 "Hello, " + name + "!" everything/contract.py:62 + concat // (𝕗) name#0 | {concat} "Hello, " + name + "!" everything/contract.py:62 + // virtual: store concat_result%15#0 to l-stack (no copy) (𝕗) name#0 | concat_result%15#0 "Hello, " + name + "!" everything/contract.py:62 + // virtual: load concat_result%15#0 from l-stack (no copy) (𝕗) name#0 | concat_result%15#0 return "Hello, " + name + "!" everything/contract.py:62 swap - retsub // concat_result%15#0 return "Hello, " + name + "!" everything/contract.py:62 + retsub // concat_result%15#0 return "Hello, " + name + "!" everything/contract.py:62 // test_cases.everything.contract.Everything.calculate(a: bytes, b: bytes) -> bytes: calculate: - proto 2 1 // (𝕡) a#0,b#0 | @abimethod\ndef calculate(self, a: arc4_UInt64, b: arc4_UInt64) -> arc4_UInt64: everything/contract.py:64-65 + proto 2 1 // (𝕡) a#0,b#0 | @abimethod\ndef calculate(self, a: arc4_UInt64, b: arc4_UInt64) -> arc4_UInt64: everything/contract.py:64-65 calculate_block@0: - frame_dig -2 // load a#0 from parameters (𝕡) a#0,b#0 | a#0 c = super().calculate(a, b) everything/contract.py:66 - frame_dig -1 // load b#0 from parameters (𝕡) a#0,b#0 | a#0,b#0 c = super().calculate(a, b) everything/contract.py:66 - callsub MyMiddleBase.calculate // (𝕡) a#0,b#0 | {MyMiddleBase.calculate} super().calculate(a, b) everything/contract.py:66 - // virtual: store c#0 to l-stack (no copy) (𝕡) a#0,b#0 | c#0 c = super().calculate(a, b) everything/contract.py:66 - // virtual: load c#0 from l-stack (no copy) (𝕡) a#0,b#0 | c#0 c.decode() everything/contract.py:67 - btoi // (𝕡) a#0,b#0 | {btoi} c.decode() everything/contract.py:67 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0 c.decode() everything/contract.py:67 - frame_dig -1 // load b#0 from parameters (𝕡) a#0,b#0 | tmp%0#0,b#0 b.decode() everything/contract.py:67 - btoi // (𝕡) a#0,b#0 | tmp%0#0,{btoi} b.decode() everything/contract.py:67 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 b.decode() everything/contract.py:67 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%1#0,tmp%0#0 c.decode() * b.decode() everything/contract.py:67 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 c.decode() * b.decode() everything/contract.py:67 - * // (𝕡) a#0,b#0 | {*} c.decode() * b.decode() everything/contract.py:67 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 c.decode() * b.decode() everything/contract.py:67 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 - itob // (𝕡) a#0,b#0 | {itob} arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 - // virtual: store val_as_bytes%3#0 to l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 - // virtual: load val_as_bytes%3#0 from l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 return arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 - retsub // val_as_bytes%3#0 return arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 + frame_dig -2 // load a#0 from parameters (𝕡) a#0,b#0 | a#0 c = super().calculate(a, b) everything/contract.py:66 + frame_dig -1 // load b#0 from parameters (𝕡) a#0,b#0 | a#0,b#0 c = super().calculate(a, b) everything/contract.py:66 + callsub MyMiddleBase.calculate // (𝕡) a#0,b#0 | {MyMiddleBase.calculate} super().calculate(a, b) everything/contract.py:66 + // virtual: store c#0 to l-stack (no copy) (𝕡) a#0,b#0 | c#0 c = super().calculate(a, b) everything/contract.py:66 + // virtual: load c#0 from l-stack (no copy) (𝕡) a#0,b#0 | c#0 c.decode() everything/contract.py:67 + btoi // (𝕡) a#0,b#0 | {btoi} c.decode() everything/contract.py:67 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0 c.decode() everything/contract.py:67 + frame_dig -1 // load b#0 from parameters (𝕡) a#0,b#0 | tmp%0#0,b#0 b.decode() everything/contract.py:67 + btoi // (𝕡) a#0,b#0 | tmp%0#0,{btoi} b.decode() everything/contract.py:67 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 b.decode() everything/contract.py:67 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%1#0,tmp%0#0 c.decode() * b.decode() everything/contract.py:67 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 c.decode() * b.decode() everything/contract.py:67 + * // (𝕡) a#0,b#0 | {*} c.decode() * b.decode() everything/contract.py:67 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 c.decode() * b.decode() everything/contract.py:67 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 + itob // (𝕡) a#0,b#0 | {itob} arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 + // virtual: store val_as_bytes%3#0 to l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 + // virtual: load val_as_bytes%3#0 from l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 return arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 + retsub // val_as_bytes%3#0 return arc4_UInt64(c.decode() * b.decode()) everything/contract.py:67 // test_cases.everything.my_base.MyMiddleBase.calculate(a: bytes, b: bytes) -> bytes: MyMiddleBase.calculate: - proto 2 1 // (𝕡) a#0,b#0 | @subroutine\ndef calculate(self, a: arc4.UInt64, b: arc4.UInt64) -> arc4.UInt64: everything/my_base.py:13-14 + proto 2 1 // (𝕡) a#0,b#0 | @subroutine\ndef calculate(self, a: arc4.UInt64, b: arc4.UInt64) -> arc4.UInt64: everything/my_base.py:13-14 MyMiddleBase.calculate_block@0: - frame_dig -2 // load a#0 from parameters (𝕡) a#0,b#0 | a#0 a.decode() everything/my_base.py:15 - btoi // (𝕡) a#0,b#0 | {btoi} a.decode() everything/my_base.py:15 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0 a.decode() everything/my_base.py:15 - frame_dig -1 // load b#0 from parameters (𝕡) a#0,b#0 | tmp%0#0,b#0 b.decode() everything/my_base.py:15 - btoi // (𝕡) a#0,b#0 | tmp%0#0,{btoi} b.decode() everything/my_base.py:15 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 b.decode() everything/my_base.py:15 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%1#0,tmp%0#0 a.decode() + b.decode() everything/my_base.py:15 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 a.decode() + b.decode() everything/my_base.py:15 - + // (𝕡) a#0,b#0 | {+} a.decode() + b.decode() everything/my_base.py:15 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 a.decode() + b.decode() everything/my_base.py:15 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 - itob // (𝕡) a#0,b#0 | {itob} arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 - // virtual: store val_as_bytes%3#0 to l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 - // virtual: load val_as_bytes%3#0 from l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 return arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 - retsub // val_as_bytes%3#0 return arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 + frame_dig -2 // load a#0 from parameters (𝕡) a#0,b#0 | a#0 a.decode() everything/my_base.py:15 + btoi // (𝕡) a#0,b#0 | {btoi} a.decode() everything/my_base.py:15 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0 a.decode() everything/my_base.py:15 + frame_dig -1 // load b#0 from parameters (𝕡) a#0,b#0 | tmp%0#0,b#0 b.decode() everything/my_base.py:15 + btoi // (𝕡) a#0,b#0 | tmp%0#0,{btoi} b.decode() everything/my_base.py:15 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 b.decode() everything/my_base.py:15 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%1#0,tmp%0#0 a.decode() + b.decode() everything/my_base.py:15 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%0#0,tmp%1#0 a.decode() + b.decode() everything/my_base.py:15 + + // (𝕡) a#0,b#0 | {+} a.decode() + b.decode() everything/my_base.py:15 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 a.decode() + b.decode() everything/my_base.py:15 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) a#0,b#0 | tmp%2#0 arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 + itob // (𝕡) a#0,b#0 | {itob} arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 + // virtual: store val_as_bytes%3#0 to l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 + // virtual: load val_as_bytes%3#0 from l-stack (no copy) (𝕡) a#0,b#0 | val_as_bytes%3#0 return arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 + retsub // val_as_bytes%3#0 return arc4.UInt64(a.decode() + b.decode()) everything/my_base.py:15 // test_cases.everything.contract.Everything.close_out() -> void: close_out: - proto 0 0 // @abimethod(allow_actions=["CloseOut"])\ndef close_out(self) -> None: everything/contract.py:69-70 + proto 0 0 // @abimethod(allow_actions=["CloseOut"])\ndef close_out(self) -> None: everything/contract.py:69-70 close_out_block@0: - callsub _remove_sender // self._remove_sender() everything/contract.py:71 + callsub _remove_sender // self._remove_sender() everything/contract.py:71 retsub // // test_cases.everything.contract.Everything._remove_sender() -> void: _remove_sender: - proto 0 0 // @subroutine\ndef _remove_sender(self) -> None: everything/contract.py:81-82 + proto 0 0 // @subroutine\ndef _remove_sender(self) -> None: everything/contract.py:81-82 _remove_sender_block@0: - int 0 // 0 self.counter everything/contract.py:83 - byte "counter" // 0,"counter" self.counter everything/contract.py:83 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:83 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.counter everything/contract.py:83 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 - assert // check counter exists // app_global_get_ex_value%0#0 self.counter everything/contract.py:83 - callsub positive_one // app_global_get_ex_value%0#0,{positive_one} positive_one() everything/contract.py:83 - // virtual: store tmp%2#0 to l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 positive_one() everything/contract.py:83 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%0#0 self.counter -= positive_one() everything/contract.py:83 - // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 self.counter -= positive_one() everything/contract.py:83 - - // {-} self.counter -= positive_one() everything/contract.py:83 - // virtual: store new_state_value%3#0 to l-stack (no copy) new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 - byte "counter" // new_state_value%3#0,"counter" self.counter everything/contract.py:83 - swap // load new_state_value%3#0 from l-stack (no copy) "counter",new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 - app_global_put // self.counter -= positive_one() everything/contract.py:83 + int 0 // 0 self.counter everything/contract.py:83 + byte "counter" // 0,"counter" self.counter everything/contract.py:83 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:83 + // virtual: store counter_exists%1#0 to l-stack (no copy) counter_exists%1#0,{app_global_get_ex}.0 self.counter everything/contract.py:83 + // virtual: store counter_value%0#0 to l-stack (no copy) counter_value%0#0,counter_exists%1#0 self.counter everything/contract.py:83 + // virtual: load counter_exists%1#0 from l-stack (no copy) counter_value%0#0,counter_exists%1#0 self.counter everything/contract.py:83 + assert // check counter exists // counter_value%0#0 self.counter everything/contract.py:83 + callsub positive_one // counter_value%0#0,{positive_one} positive_one() everything/contract.py:83 + // virtual: store tmp%2#0 to l-stack (no copy) counter_value%0#0,tmp%2#0 positive_one() everything/contract.py:83 + // virtual: load counter_value%0#0 from l-stack (no copy) tmp%2#0,counter_value%0#0 self.counter -= positive_one() everything/contract.py:83 + // virtual: load tmp%2#0 from l-stack (no copy) counter_value%0#0,tmp%2#0 self.counter -= positive_one() everything/contract.py:83 + - // {-} self.counter -= positive_one() everything/contract.py:83 + // virtual: store new_state_value%3#0 to l-stack (no copy) new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 + byte "counter" // new_state_value%3#0,"counter" self.counter everything/contract.py:83 + swap // load new_state_value%3#0 from l-stack (no copy) "counter",new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 + app_global_put // self.counter -= positive_one() everything/contract.py:83 retsub // // test_cases.everything.contract.positive_one() -> uint64: positive_one: - proto 0 1 // @subroutine\ndef positive_one() -> UInt64: everything/contract.py:86-87 + proto 0 1 // @subroutine\ndef positive_one() -> UInt64: everything/contract.py:86-87 positive_one_block@0: - int 1 // 1 1 everything/contract.py:88 - retsub // 1 return UInt64(1) everything/contract.py:88 + int 1 // 1 1 everything/contract.py:88 + retsub // 1 return UInt64(1) everything/contract.py:88 diff --git a/test_cases/everything/out/MyContract.clear.mir b/test_cases/everything/out/MyContract.clear.mir index 647db2efdf..19099de724 100644 --- a/test_cases/everything/out/MyContract.clear.mir +++ b/test_cases/everything/out/MyContract.clear.mir @@ -1,43 +1,43 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.everything.contract.Everything.clear_state_program() -> uint64: main_block@0: - callsub _remove_sender // self._remove_sender() everything/contract.py:74 - int 1 // 1 True everything/contract.py:75 - return // return True everything/contract.py:75 + callsub _remove_sender // self._remove_sender() everything/contract.py:74 + int 1 // 1 True everything/contract.py:75 + return // return True everything/contract.py:75 // test_cases.everything.contract.Everything._remove_sender() -> void: _remove_sender: - proto 0 0 // @subroutine\ndef _remove_sender(self) -> None: everything/contract.py:81-82 + proto 0 0 // @subroutine\ndef _remove_sender(self) -> None: everything/contract.py:81-82 _remove_sender_block@0: - int 0 // 0 self.counter everything/contract.py:83 - byte "counter" // 0,"counter" self.counter everything/contract.py:83 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:83 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.counter everything/contract.py:83 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter everything/contract.py:83 - assert // check counter exists // app_global_get_ex_value%0#0 self.counter everything/contract.py:83 - callsub positive_one // app_global_get_ex_value%0#0,{positive_one} positive_one() everything/contract.py:83 - // virtual: store tmp%2#0 to l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 positive_one() everything/contract.py:83 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) tmp%2#0,app_global_get_ex_value%0#0 self.counter -= positive_one() everything/contract.py:83 - // virtual: load tmp%2#0 from l-stack (no copy) app_global_get_ex_value%0#0,tmp%2#0 self.counter -= positive_one() everything/contract.py:83 - - // {-} self.counter -= positive_one() everything/contract.py:83 - // virtual: store new_state_value%3#0 to l-stack (no copy) new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 - byte "counter" // new_state_value%3#0,"counter" self.counter everything/contract.py:83 - swap // load new_state_value%3#0 from l-stack (no copy) "counter",new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 - app_global_put // self.counter -= positive_one() everything/contract.py:83 + int 0 // 0 self.counter everything/contract.py:83 + byte "counter" // 0,"counter" self.counter everything/contract.py:83 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter everything/contract.py:83 + // virtual: store counter_exists%1#0 to l-stack (no copy) counter_exists%1#0,{app_global_get_ex}.0 self.counter everything/contract.py:83 + // virtual: store counter_value%0#0 to l-stack (no copy) counter_value%0#0,counter_exists%1#0 self.counter everything/contract.py:83 + // virtual: load counter_exists%1#0 from l-stack (no copy) counter_value%0#0,counter_exists%1#0 self.counter everything/contract.py:83 + assert // check counter exists // counter_value%0#0 self.counter everything/contract.py:83 + callsub positive_one // counter_value%0#0,{positive_one} positive_one() everything/contract.py:83 + // virtual: store tmp%2#0 to l-stack (no copy) counter_value%0#0,tmp%2#0 positive_one() everything/contract.py:83 + // virtual: load counter_value%0#0 from l-stack (no copy) tmp%2#0,counter_value%0#0 self.counter -= positive_one() everything/contract.py:83 + // virtual: load tmp%2#0 from l-stack (no copy) counter_value%0#0,tmp%2#0 self.counter -= positive_one() everything/contract.py:83 + - // {-} self.counter -= positive_one() everything/contract.py:83 + // virtual: store new_state_value%3#0 to l-stack (no copy) new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 + byte "counter" // new_state_value%3#0,"counter" self.counter everything/contract.py:83 + swap // load new_state_value%3#0 from l-stack (no copy) "counter",new_state_value%3#0 self.counter -= positive_one() everything/contract.py:83 + app_global_put // self.counter -= positive_one() everything/contract.py:83 retsub // // test_cases.everything.contract.positive_one() -> uint64: positive_one: - proto 0 1 // @subroutine\ndef positive_one() -> UInt64: everything/contract.py:86-87 + proto 0 1 // @subroutine\ndef positive_one() -> UInt64: everything/contract.py:86-87 positive_one_block@0: - int 1 // 1 1 everything/contract.py:88 - retsub // 1 return UInt64(1) everything/contract.py:88 + int 1 // 1 1 everything/contract.py:88 + retsub // 1 return UInt64(1) everything/contract.py:88 diff --git a/test_cases/everything/out/MyContract.destructured.ir b/test_cases/everything/out/MyContract.destructured.ir index b1fb17f43c..acf77d25a3 100644 --- a/test_cases/everything/out/MyContract.destructured.ir +++ b/test_cases/everything/out/MyContract.destructured.ir @@ -89,10 +89,10 @@ contract test_cases.everything.contract.Everything: let (sender_name#0: any, sender_name_existed#0: uint64) = (app_local_get_ex 0u 0u "name") goto sender_name_existed#0 ? block@4 : block@2 block@2: // if_body_L52 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check counter exists + let (counter_value%4#0: uint64, counter_exists%5#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() - let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) + let new_state_value%7#0: uint64 = (+ counter_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) goto block@4 block@4: // after_if_else_L50 @@ -149,10 +149,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return @@ -168,10 +168,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return diff --git a/test_cases/everything/out/MyContract.ssa.ir b/test_cases/everything/out/MyContract.ssa.ir index 7025976f85..205fdfc641 100644 --- a/test_cases/everything/out/MyContract.ssa.ir +++ b/test_cases/everything/out/MyContract.ssa.ir @@ -96,10 +96,10 @@ contract test_cases.everything.contract.Everything: let sender_name_existed#0: uint64 = tuple_assignment%3#0 goto sender_name_existed#0 ? block@3 : block@2 block@2: // if_body_L52 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check counter exists + let (counter_value%4#0: uint64, counter_exists%5#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() - let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) + let new_state_value%7#0: uint64 = (+ counter_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) goto block@3 block@3: // after_if_else_L52 @@ -162,10 +162,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return @@ -181,10 +181,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir index b1fb17f43c..acf77d25a3 100644 --- a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir @@ -89,10 +89,10 @@ contract test_cases.everything.contract.Everything: let (sender_name#0: any, sender_name_existed#0: uint64) = (app_local_get_ex 0u 0u "name") goto sender_name_existed#0 ? block@4 : block@2 block@2: // if_body_L52 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check counter exists + let (counter_value%4#0: uint64, counter_exists%5#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() - let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) + let new_state_value%7#0: uint64 = (+ counter_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) goto block@4 block@4: // after_if_else_L50 @@ -149,10 +149,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return @@ -168,10 +168,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return diff --git a/test_cases/everything/out_O2/MyContract.destructured.ir b/test_cases/everything/out_O2/MyContract.destructured.ir index b1fb17f43c..acf77d25a3 100644 --- a/test_cases/everything/out_O2/MyContract.destructured.ir +++ b/test_cases/everything/out_O2/MyContract.destructured.ir @@ -89,10 +89,10 @@ contract test_cases.everything.contract.Everything: let (sender_name#0: any, sender_name_existed#0: uint64) = (app_local_get_ex 0u 0u "name") goto sender_name_existed#0 ? block@4 : block@2 block@2: // if_body_L52 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check counter exists + let (counter_value%4#0: uint64, counter_exists%5#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() - let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) + let new_state_value%7#0: uint64 = (+ counter_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) goto block@4 block@4: // after_if_else_L50 @@ -149,10 +149,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return @@ -168,10 +168,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return diff --git a/test_cases/everything/out_unoptimized/MyContract.destructured.ir b/test_cases/everything/out_unoptimized/MyContract.destructured.ir index b7245219e3..3759b41528 100644 --- a/test_cases/everything/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/everything/out_unoptimized/MyContract.destructured.ir @@ -95,10 +95,10 @@ contract test_cases.everything.contract.Everything: let sender_name_existed#0: uint64 = tuple_assignment%3#0 goto sender_name_existed#0 ? block@3 : block@2 block@2: // if_body_L52 - let (app_global_get_ex_value%4#0: uint64, app_global_get_ex_did_exist%5#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%5#0) // check counter exists + let (counter_value%4#0: uint64, counter_exists%5#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%5#0) // check counter exists let tmp%6#0: uint64 = test_cases.everything.my_base.multiplicative_identity() - let new_state_value%7#0: uint64 = (+ app_global_get_ex_value%4#0 tmp%6#0) + let new_state_value%7#0: uint64 = (+ counter_value%4#0 tmp%6#0) (app_global_put "counter" new_state_value%7#0) goto block@3 block@3: // after_if_else_L52 @@ -161,10 +161,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return @@ -180,10 +180,10 @@ contract test_cases.everything.contract.Everything: subroutine test_cases.everything.contract.Everything._remove_sender() -> void: block@0: // L81 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists let tmp%2#0: uint64 = test_cases.everything.contract.positive_one() - let new_state_value%3#0: uint64 = (- app_global_get_ex_value%0#0 tmp%2#0) + let new_state_value%3#0: uint64 = (- counter_value%0#0 tmp%2#0) (app_global_put "counter" new_state_value%3#0) return diff --git a/test_cases/everything/puya.log b/test_cases/everything/puya.log index c0257082db..fca174819d 100644 --- a/test_cases/everything/puya.log +++ b/test_cases/everything/puya.log @@ -822,14 +822,14 @@ debug: Inserted register_block@0.ops[7]: 'store tmp%1#0 to l-stack (copy)' debug: Replaced register_block@0.ops[9]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' debug: Inserted register_if_body@1.ops[4]: 'store sender_name_existed#0 to l-stack (copy)' debug: Replaced register_if_body@1.ops[7]: 'load sender_name_existed#0' with 'load sender_name_existed#0 from l-stack (no copy)' -debug: Inserted register_if_body@2.ops[3]: 'store app_global_get_ex_did_exist%5#0 to l-stack (copy)' -debug: Replaced register_if_body@2.ops[6]: 'load app_global_get_ex_did_exist%5#0' with 'load app_global_get_ex_did_exist%5#0 from l-stack (no copy)' +debug: Inserted register_if_body@2.ops[3]: 'store counter_exists%5#0 to l-stack (copy)' +debug: Replaced register_if_body@2.ops[6]: 'load counter_exists%5#0' with 'load counter_exists%5#0 from l-stack (no copy)' debug: Inserted register_if_body@2.ops[9]: 'store tmp%6#0 to l-stack (copy)' debug: Replaced register_if_body@2.ops[12]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted register_if_body@2.ops[14]: 'store new_state_value%7#0 to l-stack (copy)' debug: Replaced register_if_body@2.ops[17]: 'load new_state_value%7#0' with 'load new_state_value%7#0 from l-stack (no copy)' -debug: Inserted register_if_body@2.ops[5]: 'store app_global_get_ex_value%4#0 to l-stack (copy)' -debug: Replaced register_if_body@2.ops[12]: 'load app_global_get_ex_value%4#0' with 'load app_global_get_ex_value%4#0 from l-stack (no copy)' +debug: Inserted register_if_body@2.ops[5]: 'store counter_value%4#0 to l-stack (copy)' +debug: Replaced register_if_body@2.ops[12]: 'load counter_value%4#0' with 'load counter_value%4#0 from l-stack (no copy)' debug: Found 1 edge set/s for test_cases.everything.contract.Everything.register debug: Inserted say_hello_block@0.ops[5]: 'store exists#0 to l-stack (copy)' debug: Replaced say_hello_block@0.ops[8]: 'load exists#0' with 'load exists#0 from l-stack (no copy)' @@ -882,22 +882,22 @@ debug: Inserted MyMiddleBase.calculate_block@0.ops[5]: 'store tmp%1#0 to l-stack debug: Replaced MyMiddleBase.calculate_block@0.ops[8]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' debug: Inserted MyMiddleBase.calculate_block@0.ops[2]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced MyMiddleBase.calculate_block@0.ops[8]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' -debug: Inserted _remove_sender_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced _remove_sender_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted _remove_sender_block@0.ops[3]: 'store counter_exists%1#0 to l-stack (copy)' +debug: Replaced _remove_sender_block@0.ops[6]: 'load counter_exists%1#0' with 'load counter_exists%1#0 from l-stack (no copy)' debug: Inserted _remove_sender_block@0.ops[9]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced _remove_sender_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted _remove_sender_block@0.ops[14]: 'store new_state_value%3#0 to l-stack (copy)' debug: Replaced _remove_sender_block@0.ops[17]: 'load new_state_value%3#0' with 'load new_state_value%3#0 from l-stack (no copy)' -debug: Inserted _remove_sender_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced _remove_sender_block@0.ops[12]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' -debug: Inserted _remove_sender_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced _remove_sender_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted _remove_sender_block@0.ops[5]: 'store counter_value%0#0 to l-stack (copy)' +debug: Replaced _remove_sender_block@0.ops[12]: 'load counter_value%0#0' with 'load counter_value%0#0 from l-stack (no copy)' +debug: Inserted _remove_sender_block@0.ops[3]: 'store counter_exists%1#0 to l-stack (copy)' +debug: Replaced _remove_sender_block@0.ops[6]: 'load counter_exists%1#0' with 'load counter_exists%1#0 from l-stack (no copy)' debug: Inserted _remove_sender_block@0.ops[9]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced _remove_sender_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted _remove_sender_block@0.ops[14]: 'store new_state_value%3#0 to l-stack (copy)' debug: Replaced _remove_sender_block@0.ops[17]: 'load new_state_value%3#0' with 'load new_state_value%3#0 from l-stack (no copy)' -debug: Inserted _remove_sender_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced _remove_sender_block@0.ops[12]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted _remove_sender_block@0.ops[5]: 'store counter_value%0#0 to l-stack (copy)' +debug: Replaced _remove_sender_block@0.ops[12]: 'load counter_value%0#0' with 'load counter_value%0#0 from l-stack (no copy)' info: Writing everything/out/MyContract.approval.teal info: Writing everything/out/MyContract.clear.teal info: Writing everything/out/MyContract.arc32.json \ No newline at end of file diff --git a/test_cases/inner_transactions/out/Greeter.approval.mir b/test_cases/inner_transactions/out/Greeter.approval.mir index a89a54d4f7..13ab6f53ab 100644 --- a/test_cases/inner_transactions/out/Greeter.approval.mir +++ b/test_cases/inner_transactions/out/Greeter.approval.mir @@ -1,10 +1,10 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.inner_transactions.c2c.Greeter.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} + txn ApplicationID // {txn} // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // @@ -15,183 +15,183 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txn NumAppArgs // {txn} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - bz main_bare_routing@8 // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // Implicit fall through to main_abi_routing@3 // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + txn NumAppArgs // {txn} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + bz main_bare_routing@8 // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // Implicit fall through to main_abi_routing@3 // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 main_abi_routing@3: - txna ApplicationArgs 0 // {txna} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - method "bootstrap()uint64" // tmp%2#0,method<"bootstrap()uint64"> class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - method "log_greetings(string)void" // tmp%2#0,method<"bootstrap()uint64">,method<"log_greetings(string)void"> class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - uncover 2 // load tmp%2#0 from l-stack (no copy) method<"bootstrap()uint64">,method<"log_greetings(string)void">,tmp%2#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - match main_bootstrap_route@4 main_log_greetings_route@5 // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - err // reject transaction // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + txna ApplicationArgs 0 // {txna} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + method "bootstrap()uint64" // tmp%2#0,method<"bootstrap()uint64"> class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + method "log_greetings(string)void" // tmp%2#0,method<"bootstrap()uint64">,method<"log_greetings(string)void"> class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + uncover 2 // load tmp%2#0 from l-stack (no copy) method<"bootstrap()uint64">,method<"log_greetings(string)void">,tmp%2#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + match main_bootstrap_route@4 main_log_greetings_route@5 // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + err // reject transaction // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 main_bootstrap_route@4: - txn OnCompletion // {txn} arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod() inner_transactions/c2c.py:10 - ! // {!} arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod() inner_transactions/c2c.py:10 - assert // OnCompletion is NoOp // arc4.abimethod() inner_transactions/c2c.py:10 - txn ApplicationID // {txn} arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod() inner_transactions/c2c.py:10 - assert // is not creating // arc4.abimethod() inner_transactions/c2c.py:10 - callsub bootstrap // {bootstrap} arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 arc4.abimethod() inner_transactions/c2c.py:10 - itob // {itob} arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: store val_as_bytes%7#0 to l-stack (no copy) val_as_bytes%7#0 arc4.abimethod() inner_transactions/c2c.py:10 - byte 0x151f7c75 // val_as_bytes%7#0,0x151f7c75 arc4.abimethod() inner_transactions/c2c.py:10 - swap // load val_as_bytes%7#0 from l-stack (no copy) 0x151f7c75,val_as_bytes%7#0 arc4.abimethod() inner_transactions/c2c.py:10 - concat // {concat} arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 arc4.abimethod() inner_transactions/c2c.py:10 - // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod() inner_transactions/c2c.py:10 - log // arc4.abimethod() inner_transactions/c2c.py:10 - int 1 // 1 arc4.abimethod() inner_transactions/c2c.py:10 - return // arc4.abimethod() inner_transactions/c2c.py:10 + txn OnCompletion // {txn} arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 arc4.abimethod() inner_transactions/c2c.py:10 + ! // {!} arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 arc4.abimethod() inner_transactions/c2c.py:10 + assert // OnCompletion is NoOp // arc4.abimethod() inner_transactions/c2c.py:10 + txn ApplicationID // {txn} arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 arc4.abimethod() inner_transactions/c2c.py:10 + assert // is not creating // arc4.abimethod() inner_transactions/c2c.py:10 + callsub bootstrap // {bootstrap} arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 arc4.abimethod() inner_transactions/c2c.py:10 + itob // {itob} arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: store val_as_bytes%7#0 to l-stack (no copy) val_as_bytes%7#0 arc4.abimethod() inner_transactions/c2c.py:10 + byte 0x151f7c75 // val_as_bytes%7#0,0x151f7c75 arc4.abimethod() inner_transactions/c2c.py:10 + swap // load val_as_bytes%7#0 from l-stack (no copy) 0x151f7c75,val_as_bytes%7#0 arc4.abimethod() inner_transactions/c2c.py:10 + concat // {concat} arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 arc4.abimethod() inner_transactions/c2c.py:10 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 arc4.abimethod() inner_transactions/c2c.py:10 + log // arc4.abimethod() inner_transactions/c2c.py:10 + int 1 // 1 arc4.abimethod() inner_transactions/c2c.py:10 + return // arc4.abimethod() inner_transactions/c2c.py:10 main_log_greetings_route@5: - txn OnCompletion // {txn} arc4.abimethod() inner_transactions/c2c.py:24 - // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 arc4.abimethod() inner_transactions/c2c.py:24 - // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod() inner_transactions/c2c.py:24 - ! // {!} arc4.abimethod() inner_transactions/c2c.py:24 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod() inner_transactions/c2c.py:24 - // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 arc4.abimethod() inner_transactions/c2c.py:24 - assert // OnCompletion is NoOp // arc4.abimethod() inner_transactions/c2c.py:24 - txn ApplicationID // {txn} arc4.abimethod() inner_transactions/c2c.py:24 - // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod() inner_transactions/c2c.py:24 - // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod() inner_transactions/c2c.py:24 - assert // is not creating // arc4.abimethod() inner_transactions/c2c.py:24 - txna ApplicationArgs 1 // {txna} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: load tmp%12#0 from l-stack (no copy) tmp%12#0 arc4.abimethod() inner_transactions/c2c.py:24 - callsub log_greetings // arc4.abimethod() inner_transactions/c2c.py:24 - int 1 // 1 arc4.abimethod() inner_transactions/c2c.py:24 - return // arc4.abimethod() inner_transactions/c2c.py:24 + txn OnCompletion // {txn} arc4.abimethod() inner_transactions/c2c.py:24 + // virtual: store tmp%9#0 to l-stack (no copy) tmp%9#0 arc4.abimethod() inner_transactions/c2c.py:24 + // virtual: load tmp%9#0 from l-stack (no copy) tmp%9#0 arc4.abimethod() inner_transactions/c2c.py:24 + ! // {!} arc4.abimethod() inner_transactions/c2c.py:24 + // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 arc4.abimethod() inner_transactions/c2c.py:24 + // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 arc4.abimethod() inner_transactions/c2c.py:24 + assert // OnCompletion is NoOp // arc4.abimethod() inner_transactions/c2c.py:24 + txn ApplicationID // {txn} arc4.abimethod() inner_transactions/c2c.py:24 + // virtual: store tmp%11#0 to l-stack (no copy) tmp%11#0 arc4.abimethod() inner_transactions/c2c.py:24 + // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod() inner_transactions/c2c.py:24 + assert // is not creating // arc4.abimethod() inner_transactions/c2c.py:24 + txna ApplicationArgs 1 // {txna} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: load tmp%12#0 from l-stack (no copy) tmp%12#0 arc4.abimethod() inner_transactions/c2c.py:24 + callsub log_greetings // arc4.abimethod() inner_transactions/c2c.py:24 + int 1 // 1 arc4.abimethod() inner_transactions/c2c.py:24 + return // arc4.abimethod() inner_transactions/c2c.py:24 main_bare_routing@8: - txn OnCompletion // {txn} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: load tmp%13#0 from l-stack (no copy) tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - ! // {!} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: store not%tmp%13#0 to l-stack (no copy) not%tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: load not%tmp%13#0 from l-stack (no copy) not%tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - assert // reject transaction // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - txn ApplicationID // {txn} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - ! // {!} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - assert // is creating // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - int 1 // 1 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 - return // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + txn OnCompletion // {txn} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: store tmp%13#0 to l-stack (no copy) tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: load tmp%13#0 from l-stack (no copy) tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + ! // {!} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: store not%tmp%13#0 to l-stack (no copy) not%tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: load not%tmp%13#0 from l-stack (no copy) not%tmp%13#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + assert // reject transaction // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + txn ApplicationID // {txn} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + ! // {!} class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: store tmp%15#0 to l-stack (no copy) tmp%15#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + // virtual: load tmp%15#0 from l-stack (no copy) tmp%15#0 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + assert // is creating // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + int 1 // 1 class Greeter(ARC4Contract): inner_transactions/c2c.py:6 + return // class Greeter(ARC4Contract): inner_transactions/c2c.py:6 // test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: bootstrap: - proto 0 1 // @arc4.abimethod()\ndef bootstrap(self) -> UInt64: inner_transactions/c2c.py:10-11 + proto 0 1 // @arc4.abimethod()\ndef bootstrap(self) -> UInt64: inner_transactions/c2c.py:10-11 bootstrap_block@0: - int 0 // 0 self.hello_app inner_transactions/c2c.py:12 - byte "hello_app" // 0,"hello_app" self.hello_app inner_transactions/c2c.py:12 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.hello_app inner_transactions/c2c.py:12 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:12 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.hello_app inner_transactions/c2c.py:12 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.hello_app inner_transactions/c2c.py:12 - assert // check hello_app exists // app_global_get_ex_value%0#0 self.hello_app inner_transactions/c2c.py:12 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) app_global_get_ex_value%0#0 not self.hello_app inner_transactions/c2c.py:12 - ! // {!} not self.hello_app inner_transactions/c2c.py:12 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 not self.hello_app inner_transactions/c2c.py:12 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 assert not self.hello_app, "already bootstrapped" inner_transactions/c2c.py:12 - assert // already bootstrapped // assert not self.hello_app, "already bootstrapped" inner_transactions/c2c.py:12 - itxn_begin // itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 - int appl // appl itxn.ApplicationCall inner_transactions/c2c.py:14 + int 0 // 0 self.hello_app inner_transactions/c2c.py:12 + byte "hello_app" // 0,"hello_app" self.hello_app inner_transactions/c2c.py:12 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.hello_app inner_transactions/c2c.py:12 + // virtual: store hello_app_exists%1#0 to l-stack (no copy) hello_app_exists%1#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:12 + // virtual: store hello_app_value%0#0 to l-stack (no copy) hello_app_value%0#0,hello_app_exists%1#0 self.hello_app inner_transactions/c2c.py:12 + // virtual: load hello_app_exists%1#0 from l-stack (no copy) hello_app_value%0#0,hello_app_exists%1#0 self.hello_app inner_transactions/c2c.py:12 + assert // check hello_app exists // hello_app_value%0#0 self.hello_app inner_transactions/c2c.py:12 + // virtual: load hello_app_value%0#0 from l-stack (no copy) hello_app_value%0#0 not self.hello_app inner_transactions/c2c.py:12 + ! // {!} not self.hello_app inner_transactions/c2c.py:12 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 not self.hello_app inner_transactions/c2c.py:12 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 assert not self.hello_app, "already bootstrapped" inner_transactions/c2c.py:12 + assert // already bootstrapped // assert not self.hello_app, "already bootstrapped" inner_transactions/c2c.py:12 + itxn_begin // itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 + int appl // appl itxn.ApplicationCall inner_transactions/c2c.py:14 itxn_field TypeEnum // - int 0 // 0 0 inner_transactions/c2c.py:17 + int 0 // 0 0 inner_transactions/c2c.py:17 itxn_field Fee // - byte 0x0a8101 // 0x0a8101 HELLO_WORLD_CLEAR inner_transactions/c2c.py:16 + byte 0x0a8101 // 0x0a8101 HELLO_WORLD_CLEAR inner_transactions/c2c.py:16 itxn_field ClearStateProgramPages // - byte 0x0a200101311b410026800402bece11361a008e0100010031191444311844361a018800158004151f7c754c50b02243311914443118144422438a01018bff570200800748656c6c6f2c204c504915165706004c5089 // 0x0a200101311b410026800402bece11361a008e0100010031191444311844361a018800158004151f7c754c50b02243311914443118144422438a01018bff570200800748656c6c6f2c204c504915165706004c5089 Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX) inner_transactions/c2c.py:15 + byte 0x0a200101311b410026800402bece11361a008e0100010031191444311844361a018800158004151f7c754c50b02243311914443118144422438a01018bff570200800748656c6c6f2c204c504915165706004c5089 // 0x0a200101311b410026800402bece11361a008e0100010031191444311844361a018800158004151f7c754c50b02243311914443118144422438a01018bff570200800748656c6c6f2c204c504915165706004c5089 Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX) inner_transactions/c2c.py:15 itxn_field ApprovalProgramPages // - itxn_submit // itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 - itxn CreatedApplicationID // {itxn} itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 - // virtual: store submit_result_0%3%%CreatedApplicationID#0 to l-stack (no copy) submit_result_0%3%%CreatedApplicationID#0 itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 - byte "hello_app" // submit_result_0%3%%CreatedApplicationID#0,"hello_app" self.hello_app inner_transactions/c2c.py:13 - swap // load submit_result_0%3%%CreatedApplicationID#0 from l-stack (no copy) "hello_app",submit_result_0%3%%CreatedApplicationID#0 self.hello_app = (\nitxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_H... inner_transactions/c2c.py:13-21 - app_global_put // self.hello_app = (\nitxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_H... inner_transactions/c2c.py:13-21 - int 0 // 0 self.hello_app inner_transactions/c2c.py:22 - byte "hello_app" // 0,"hello_app" self.hello_app inner_transactions/c2c.py:22 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.hello_app inner_transactions/c2c.py:22 - // virtual: store app_global_get_ex_did_exist%6#0 to l-stack (no copy) app_global_get_ex_did_exist%6#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:22 - // virtual: store app_global_get_ex_value%5#0 to l-stack (no copy) app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 self.hello_app inner_transactions/c2c.py:22 - // virtual: load app_global_get_ex_did_exist%6#0 from l-stack (no copy) app_global_get_ex_value%5#0,app_global_get_ex_did_exist%6#0 self.hello_app inner_transactions/c2c.py:22 - assert // check hello_app exists // app_global_get_ex_value%5#0 self.hello_app inner_transactions/c2c.py:22 - // virtual: load app_global_get_ex_value%5#0 from l-stack (no copy) app_global_get_ex_value%5#0 return self.hello_app.application_id inner_transactions/c2c.py:22 - retsub // app_global_get_ex_value%5#0 return self.hello_app.application_id inner_transactions/c2c.py:22 + itxn_submit // itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 + itxn CreatedApplicationID // {itxn} itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 + // virtual: store submit_result_0%3%%CreatedApplicationID#0 to l-stack (no copy) submit_result_0%3%%CreatedApplicationID#0 itxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_HEX),\nclear_state_pr... inner_transactions/c2c.py:14-19 + byte "hello_app" // submit_result_0%3%%CreatedApplicationID#0,"hello_app" self.hello_app inner_transactions/c2c.py:13 + swap // load submit_result_0%3%%CreatedApplicationID#0 from l-stack (no copy) "hello_app",submit_result_0%3%%CreatedApplicationID#0 self.hello_app = (\nitxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_H... inner_transactions/c2c.py:13-21 + app_global_put // self.hello_app = (\nitxn.ApplicationCall(\napproval_program=Bytes.from_hex(HELLO_WORLD_APPROVAL_H... inner_transactions/c2c.py:13-21 + int 0 // 0 self.hello_app inner_transactions/c2c.py:22 + byte "hello_app" // 0,"hello_app" self.hello_app inner_transactions/c2c.py:22 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.hello_app inner_transactions/c2c.py:22 + // virtual: store hello_app_exists%6#0 to l-stack (no copy) hello_app_exists%6#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:22 + // virtual: store hello_app_value%5#0 to l-stack (no copy) hello_app_value%5#0,hello_app_exists%6#0 self.hello_app inner_transactions/c2c.py:22 + // virtual: load hello_app_exists%6#0 from l-stack (no copy) hello_app_value%5#0,hello_app_exists%6#0 self.hello_app inner_transactions/c2c.py:22 + assert // check hello_app exists // hello_app_value%5#0 self.hello_app inner_transactions/c2c.py:22 + // virtual: load hello_app_value%5#0 from l-stack (no copy) hello_app_value%5#0 return self.hello_app.application_id inner_transactions/c2c.py:22 + retsub // hello_app_value%5#0 return self.hello_app.application_id inner_transactions/c2c.py:22 // test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: log_greetings: - proto 1 0 // (𝕡) name#0 | @arc4.abimethod()\ndef log_greetings(self, name: arc4.String) -> None: inner_transactions/c2c.py:24-25 + proto 1 0 // (𝕡) name#0 | @arc4.abimethod()\ndef log_greetings(self, name: arc4.String) -> None: inner_transactions/c2c.py:24-25 log_greetings_block@0: - itxn_begin // (𝕡) name#0 | itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 - int 0 // (𝕡) name#0 | 0 self.hello_app inner_transactions/c2c.py:27 - byte "hello_app" // (𝕡) name#0 | 0,"hello_app" self.hello_app inner_transactions/c2c.py:27 - app_global_get_ex // (𝕡) name#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.hello_app inner_transactions/c2c.py:27 - // virtual: store app_global_get_ex_did_exist%2#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_did_exist%2#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:27 - // virtual: store app_global_get_ex_value%1#0 to l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.hello_app inner_transactions/c2c.py:27 - // virtual: load app_global_get_ex_did_exist%2#0 from l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%1#0,app_global_get_ex_did_exist%2#0 self.hello_app inner_transactions/c2c.py:27 - assert // check hello_app exists // (𝕡) name#0 | app_global_get_ex_value%1#0 self.hello_app inner_transactions/c2c.py:27 - int appl // (𝕡) name#0 | app_global_get_ex_value%1#0,appl itxn.ApplicationCall inner_transactions/c2c.py:26 - itxn_field TypeEnum // (𝕡) name#0 | app_global_get_ex_value%1#0 - // virtual: load app_global_get_ex_value%1#0 from l-stack (no copy) (𝕡) name#0 | app_global_get_ex_value%1#0 - itxn_field ApplicationID // (𝕡) name#0 | - method "hello(string)string" // (𝕡) name#0 | method<"hello(string)string"> arc4.arc4_signature("hello(string)string") inner_transactions/c2c.py:28 - itxn_field ApplicationArgs // (𝕡) name#0 | - frame_dig -1 // load name#0 from parameters (𝕡) name#0 | name#0 - itxn_field ApplicationArgs // (𝕡) name#0 | - itxn_submit // (𝕡) name#0 | itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 - itxn LastLog // (𝕡) name#0 | {itxn} itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 - // virtual: store hello_call%%LastLog#0 to l-stack (no copy) (𝕡) name#0 | hello_call%%LastLog#0 itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 - dup // load hello_call%%LastLog#0 from l-stack (copy) (𝕡) name#0 | hello_call%%LastLog#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - extract 4 0 // (𝕡) name#0 | hello_call%%LastLog#0,{extract} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - swap // store greeting#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: load hello_call%%LastLog#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - extract 0 4 // (𝕡) name#0 | greeting#0,{extract} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%6#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%6#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - byte 0x151f7c75 // (𝕡) name#0 | greeting#0,tmp%6#0,0x151f7c75 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - == // (𝕡) name#0 | greeting#0,{==} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%7#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%7#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - assert // ARC4 prefix is valid // (𝕡) name#0 | greeting#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: load greeting#0 from l-stack (no copy) (𝕡) name#0 | greeting#0 greeting.decode() inner_transactions/c2c.py:31 - extract 2 0 // (𝕡) name#0 | {extract} greeting.decode() inner_transactions/c2c.py:31 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) name#0 | tmp%9#0 greeting.decode() inner_transactions/c2c.py:31 - byte "HelloWorld returned: " // (𝕡) name#0 | tmp%9#0,"HelloWorld returned: " b"HelloWorld returned: " inner_transactions/c2c.py:31 - swap // load tmp%9#0 from l-stack (no copy) (𝕡) name#0 | "HelloWorld returned: ",tmp%9#0 greeting.decode() inner_transactions/c2c.py:31 - concat // (𝕡) name#0 | {concat} greeting.decode() inner_transactions/c2c.py:31 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) name#0 | tmp%10#0 greeting.decode() inner_transactions/c2c.py:31 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) name#0 | tmp%10#0 log(b"HelloWorld returned: ", greeting.decode()) inner_transactions/c2c.py:31 - log // (𝕡) name#0 | log(b"HelloWorld returned: ", greeting.decode()) inner_transactions/c2c.py:31 + itxn_begin // (𝕡) name#0 | itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 + int 0 // (𝕡) name#0 | 0 self.hello_app inner_transactions/c2c.py:27 + byte "hello_app" // (𝕡) name#0 | 0,"hello_app" self.hello_app inner_transactions/c2c.py:27 + app_global_get_ex // (𝕡) name#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.hello_app inner_transactions/c2c.py:27 + // virtual: store hello_app_exists%2#0 to l-stack (no copy) (𝕡) name#0 | hello_app_exists%2#0,{app_global_get_ex}.0 self.hello_app inner_transactions/c2c.py:27 + // virtual: store hello_app_value%1#0 to l-stack (no copy) (𝕡) name#0 | hello_app_value%1#0,hello_app_exists%2#0 self.hello_app inner_transactions/c2c.py:27 + // virtual: load hello_app_exists%2#0 from l-stack (no copy) (𝕡) name#0 | hello_app_value%1#0,hello_app_exists%2#0 self.hello_app inner_transactions/c2c.py:27 + assert // check hello_app exists // (𝕡) name#0 | hello_app_value%1#0 self.hello_app inner_transactions/c2c.py:27 + int appl // (𝕡) name#0 | hello_app_value%1#0,appl itxn.ApplicationCall inner_transactions/c2c.py:26 + itxn_field TypeEnum // (𝕡) name#0 | hello_app_value%1#0 + // virtual: load hello_app_value%1#0 from l-stack (no copy) (𝕡) name#0 | hello_app_value%1#0 + itxn_field ApplicationID // (𝕡) name#0 | + method "hello(string)string" // (𝕡) name#0 | method<"hello(string)string"> arc4.arc4_signature("hello(string)string") inner_transactions/c2c.py:28 + itxn_field ApplicationArgs // (𝕡) name#0 | + frame_dig -1 // load name#0 from parameters (𝕡) name#0 | name#0 + itxn_field ApplicationArgs // (𝕡) name#0 | + itxn_submit // (𝕡) name#0 | itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 + itxn LastLog // (𝕡) name#0 | {itxn} itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 + // virtual: store hello_call%%LastLog#0 to l-stack (no copy) (𝕡) name#0 | hello_call%%LastLog#0 itxn.ApplicationCall(\napp_id=self.hello_app,\napp_args=(arc4.arc4_signature("hello(string)string... inner_transactions/c2c.py:26-29 + dup // load hello_call%%LastLog#0 from l-stack (copy) (𝕡) name#0 | hello_call%%LastLog#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + extract 4 0 // (𝕡) name#0 | hello_call%%LastLog#0,{extract} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + swap // store greeting#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: load hello_call%%LastLog#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + extract 0 4 // (𝕡) name#0 | greeting#0,{extract} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%6#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%6#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + byte 0x151f7c75 // (𝕡) name#0 | greeting#0,tmp%6#0,0x151f7c75 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + == // (𝕡) name#0 | greeting#0,{==} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%7#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%7#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + assert // ARC4 prefix is valid // (𝕡) name#0 | greeting#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: load greeting#0 from l-stack (no copy) (𝕡) name#0 | greeting#0 greeting.decode() inner_transactions/c2c.py:31 + extract 2 0 // (𝕡) name#0 | {extract} greeting.decode() inner_transactions/c2c.py:31 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) name#0 | tmp%9#0 greeting.decode() inner_transactions/c2c.py:31 + byte "HelloWorld returned: " // (𝕡) name#0 | tmp%9#0,"HelloWorld returned: " b"HelloWorld returned: " inner_transactions/c2c.py:31 + swap // load tmp%9#0 from l-stack (no copy) (𝕡) name#0 | "HelloWorld returned: ",tmp%9#0 greeting.decode() inner_transactions/c2c.py:31 + concat // (𝕡) name#0 | {concat} greeting.decode() inner_transactions/c2c.py:31 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) name#0 | tmp%10#0 greeting.decode() inner_transactions/c2c.py:31 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) name#0 | tmp%10#0 log(b"HelloWorld returned: ", greeting.decode()) inner_transactions/c2c.py:31 + log // (𝕡) name#0 | log(b"HelloWorld returned: ", greeting.decode()) inner_transactions/c2c.py:31 retsub // // test_cases.inner_transactions.c2c.Greeter.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: inner_transactions/c2c.py:7 + proto 0 0 // def __init__(self) -> None: inner_transactions/c2c.py:7 __init___block@0: - byte "hello_app" // "hello_app" self.hello_app inner_transactions/c2c.py:8 - int 0 // "hello_app",0 0 inner_transactions/c2c.py:8 - app_global_put // self.hello_app = Application(0) inner_transactions/c2c.py:8 + byte "hello_app" // "hello_app" self.hello_app inner_transactions/c2c.py:8 + int 0 // "hello_app",0 0 inner_transactions/c2c.py:8 + app_global_put // self.hello_app = Application(0) inner_transactions/c2c.py:8 retsub // diff --git a/test_cases/inner_transactions/out/Greeter.destructured.ir b/test_cases/inner_transactions/out/Greeter.destructured.ir index d37471e26e..9d9d68d467 100644 --- a/test_cases/inner_transactions/out/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out/Greeter.destructured.ir @@ -44,9 +44,9 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check hello_app exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (hello_app_value%0#0: uint64, hello_app_exists%1#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%1#0) // check hello_app exists + let tmp%2#0: uint64 = (! hello_app_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin ((itxn_field TypeEnum) appl) @@ -56,17 +56,17 @@ contract test_cases.inner_transactions.c2c.Greeter: itxn_submit let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) - let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check hello_app exists - return app_global_get_ex_value%5#0 + let (hello_app_value%5#0: uint64, hello_app_exists%6#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%6#0) // check hello_app exists + return hello_app_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 itxn_begin - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check hello_app exists + let (hello_app_value%1#0: uint64, hello_app_exists%2#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%2#0) // check hello_app exists ((itxn_field TypeEnum) appl) - ((itxn_field ApplicationID) app_global_get_ex_value%1#0) + ((itxn_field ApplicationID) hello_app_value%1#0) ((itxn_field ApplicationArgs) method "hello(string)string") ((itxn_field ApplicationArgs) name#0) itxn_submit diff --git a/test_cases/inner_transactions/out/Greeter.ssa.ir b/test_cases/inner_transactions/out/Greeter.ssa.ir index 98b3f4b219..a168599ff7 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.ir @@ -52,9 +52,9 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check hello_app exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (hello_app_value%0#0: uint64, hello_app_exists%1#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%1#0) // check hello_app exists + let tmp%2#0: uint64 = (! hello_app_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin let inner_txn_params%4%%Accounts_length#0: uint64 = 0u @@ -182,9 +182,9 @@ contract test_cases.inner_transactions.c2c.Greeter: let submit_result_0%3%%VoteLast#0: uint64 = (itxn VoteLast) let submit_result_0%3%%XferAsset#0: uint64 = (itxn XferAsset) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) - let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check hello_app exists - return app_global_get_ex_value%5#0 + let (hello_app_value%5#0: uint64, hello_app_exists%6#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%6#0) // check hello_app exists + return hello_app_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 @@ -194,9 +194,9 @@ contract test_cases.inner_transactions.c2c.Greeter: let inner_txn_params%0%%param_ApplicationArgs_idx_0#0: bytes = method "hello(string)string" let inner_txn_params%0%%param_ApplicationArgs_idx_1#0: bytes = name#0 let inner_txn_params%0%%ApplicationArgs_length#0: uint64 = 2u - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check hello_app exists - let inner_txn_params%0%%param_ApplicationID_idx_0#0: uint64 = app_global_get_ex_value%1#0 + let (hello_app_value%1#0: uint64, hello_app_exists%2#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%2#0) // check hello_app exists + let inner_txn_params%0%%param_ApplicationID_idx_0#0: uint64 = hello_app_value%1#0 let inner_txn_params%0%%ApplicationID_length#0: uint64 = 1u let inner_txn_params%0%%ApprovalProgram_length#0: uint64 = 0u let inner_txn_params%0%%ApprovalProgramPages_length#0: uint64 = 0u diff --git a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir index d37471e26e..9d9d68d467 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir @@ -44,9 +44,9 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check hello_app exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (hello_app_value%0#0: uint64, hello_app_exists%1#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%1#0) // check hello_app exists + let tmp%2#0: uint64 = (! hello_app_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin ((itxn_field TypeEnum) appl) @@ -56,17 +56,17 @@ contract test_cases.inner_transactions.c2c.Greeter: itxn_submit let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) - let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check hello_app exists - return app_global_get_ex_value%5#0 + let (hello_app_value%5#0: uint64, hello_app_exists%6#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%6#0) // check hello_app exists + return hello_app_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 itxn_begin - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check hello_app exists + let (hello_app_value%1#0: uint64, hello_app_exists%2#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%2#0) // check hello_app exists ((itxn_field TypeEnum) appl) - ((itxn_field ApplicationID) app_global_get_ex_value%1#0) + ((itxn_field ApplicationID) hello_app_value%1#0) ((itxn_field ApplicationArgs) method "hello(string)string") ((itxn_field ApplicationArgs) name#0) itxn_submit diff --git a/test_cases/inner_transactions/out/MyContract.approval.mir b/test_cases/inner_transactions/out/MyContract.approval.mir index 5b8491d55e..e3c4ab0bbd 100644 --- a/test_cases/inner_transactions/out/MyContract.approval.mir +++ b/test_cases/inner_transactions/out/MyContract.approval.mir @@ -65,33 +65,33 @@ test1_block@0: int 0 // 0 self.name inner_transactions/contract.py:47 byte "name" // 0,"name" self.name inner_transactions/contract.py:47 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.name inner_transactions/contract.py:47 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.name inner_transactions/contract.py:47 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.name inner_transactions/contract.py:47 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.name inner_transactions/contract.py:47 - assert // check name exists // app_global_get_ex_value%0#0 self.name inner_transactions/contract.py:47 - global CurrentApplicationAddress // app_global_get_ex_value%0#0,{global} op.Global.current_application_address inner_transactions/contract.py:50 - // virtual: store asset_params%%param_ConfigAssetManager_idx_0#0 to l-stack (no copy) app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0 op.Global.current_application_address inner_transactions/contract.py:50 - global CurrentApplicationAddress // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,{global} op.Global.current_application_address inner_transactions/contract.py:51 - // virtual: store asset_params%%param_ConfigAssetReserve_idx_0#0 to l-stack (no copy) app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 op.Global.current_application_address inner_transactions/contract.py:51 - byte "name" // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,"name" self.name inner_transactions/contract.py:54 - byte "AST2" // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,"name","AST2" b"AST2" inner_transactions/contract.py:54 - app_global_put // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 self.name = Bytes(b"AST2") inner_transactions/contract.py:54 - itxn_begin // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 asset_params.submit() inner_transactions/contract.py:55 - byte "unit" // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,"unit" b"unit" inner_transactions/contract.py:48 - itxn_field ConfigAssetUnitName // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - int acfg // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,acfg itxn.AssetConfig inner_transactions/contract.py:45 - itxn_field TypeEnum // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - int 1000 // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,1000 1000 inner_transactions/contract.py:46 - itxn_field ConfigAssetTotal // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - dup // load asset_params%%param_ConfigAssetReserve_idx_0#0 from l-stack (copy) app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - itxn_field ConfigAssetReserve // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - dig 1 // load asset_params%%param_ConfigAssetManager_idx_0#0 from l-stack (copy) app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset_params%%param_ConfigAssetManager_idx_0#0 - itxn_field ConfigAssetManager // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - int 0 // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,0 0 inner_transactions/contract.py:52 - itxn_field Fee // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - int 3 // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,3 3 inner_transactions/contract.py:49 - itxn_field ConfigAssetDecimals // app_global_get_ex_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - uncover 2 // load app_global_get_ex_value%0#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%0#0 + // virtual: store name_exists%1#0 to l-stack (no copy) name_exists%1#0,{app_global_get_ex}.0 self.name inner_transactions/contract.py:47 + // virtual: store name_value%0#0 to l-stack (no copy) name_value%0#0,name_exists%1#0 self.name inner_transactions/contract.py:47 + // virtual: load name_exists%1#0 from l-stack (no copy) name_value%0#0,name_exists%1#0 self.name inner_transactions/contract.py:47 + assert // check name exists // name_value%0#0 self.name inner_transactions/contract.py:47 + global CurrentApplicationAddress // name_value%0#0,{global} op.Global.current_application_address inner_transactions/contract.py:50 + // virtual: store asset_params%%param_ConfigAssetManager_idx_0#0 to l-stack (no copy) name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0 op.Global.current_application_address inner_transactions/contract.py:50 + global CurrentApplicationAddress // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,{global} op.Global.current_application_address inner_transactions/contract.py:51 + // virtual: store asset_params%%param_ConfigAssetReserve_idx_0#0 to l-stack (no copy) name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 op.Global.current_application_address inner_transactions/contract.py:51 + byte "name" // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,"name" self.name inner_transactions/contract.py:54 + byte "AST2" // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,"name","AST2" b"AST2" inner_transactions/contract.py:54 + app_global_put // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 self.name = Bytes(b"AST2") inner_transactions/contract.py:54 + itxn_begin // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 asset_params.submit() inner_transactions/contract.py:55 + byte "unit" // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,"unit" b"unit" inner_transactions/contract.py:48 + itxn_field ConfigAssetUnitName // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + int acfg // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,acfg itxn.AssetConfig inner_transactions/contract.py:45 + itxn_field TypeEnum // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + int 1000 // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,1000 1000 inner_transactions/contract.py:46 + itxn_field ConfigAssetTotal // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + dup // load asset_params%%param_ConfigAssetReserve_idx_0#0 from l-stack (copy) name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + itxn_field ConfigAssetReserve // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + dig 1 // load asset_params%%param_ConfigAssetManager_idx_0#0 from l-stack (copy) name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset_params%%param_ConfigAssetManager_idx_0#0 + itxn_field ConfigAssetManager // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + int 0 // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,0 0 inner_transactions/contract.py:52 + itxn_field Fee // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + int 3 // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,3 3 inner_transactions/contract.py:49 + itxn_field ConfigAssetDecimals // name_value%0#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + uncover 2 // load name_value%0#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%0#0 itxn_field ConfigAssetName // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 itxn_submit // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 asset_params.submit() inner_transactions/contract.py:55 itxn ConfigAssetName // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,{itxn} asset_params.submit() inner_transactions/contract.py:55 @@ -101,26 +101,26 @@ test1_block@0: int 0 // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,0 self.name inner_transactions/contract.py:58 byte "name" // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,0,"name" self.name inner_transactions/contract.py:58 app_global_get_ex // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.name inner_transactions/contract.py:58 - // virtual: store app_global_get_ex_did_exist%3#0 to l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_did_exist%3#0,{app_global_get_ex}.0 self.name inner_transactions/contract.py:58 - // virtual: store app_global_get_ex_value%2#0 to l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.name inner_transactions/contract.py:58 - // virtual: load app_global_get_ex_did_exist%3#0 from l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.name inner_transactions/contract.py:58 - assert // check name exists // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 self.name inner_transactions/contract.py:58 - itxn_begin // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 asset_params.submit() inner_transactions/contract.py:61 - byte "unit" // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,"unit" b"unit" inner_transactions/contract.py:48 - itxn_field ConfigAssetUnitName // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 - int acfg // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,acfg itxn.AssetConfig inner_transactions/contract.py:45 - itxn_field TypeEnum // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 - int 1000 // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,1000 1000 inner_transactions/contract.py:46 - itxn_field ConfigAssetTotal // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 - dig 1 // load asset_params%%param_ConfigAssetReserve_idx_0#0 from l-stack (copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,asset_params%%param_ConfigAssetReserve_idx_0#0 - itxn_field ConfigAssetReserve // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 - dig 2 // load asset_params%%param_ConfigAssetManager_idx_0#0 from l-stack (copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,asset_params%%param_ConfigAssetManager_idx_0#0 - itxn_field ConfigAssetManager // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 - int 0 // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,0 0 inner_transactions/contract.py:52 - itxn_field Fee // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 - int 3 // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0,3 3 inner_transactions/contract.py:49 - itxn_field ConfigAssetDecimals // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 - // virtual: load app_global_get_ex_value%2#0 from l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,app_global_get_ex_value%2#0 + // virtual: store name_exists%3#0 to l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_exists%3#0,{app_global_get_ex}.0 self.name inner_transactions/contract.py:58 + // virtual: store name_value%2#0 to l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,name_exists%3#0 self.name inner_transactions/contract.py:58 + // virtual: load name_exists%3#0 from l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,name_exists%3#0 self.name inner_transactions/contract.py:58 + assert // check name exists // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 self.name inner_transactions/contract.py:58 + itxn_begin // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 asset_params.submit() inner_transactions/contract.py:61 + byte "unit" // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,"unit" b"unit" inner_transactions/contract.py:48 + itxn_field ConfigAssetUnitName // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 + int acfg // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,acfg itxn.AssetConfig inner_transactions/contract.py:45 + itxn_field TypeEnum // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 + int 1000 // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,1000 1000 inner_transactions/contract.py:46 + itxn_field ConfigAssetTotal // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 + dig 1 // load asset_params%%param_ConfigAssetReserve_idx_0#0 from l-stack (copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,asset_params%%param_ConfigAssetReserve_idx_0#0 + itxn_field ConfigAssetReserve // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 + dig 2 // load asset_params%%param_ConfigAssetManager_idx_0#0 from l-stack (copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,asset_params%%param_ConfigAssetManager_idx_0#0 + itxn_field ConfigAssetManager // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 + int 0 // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,0 0 inner_transactions/contract.py:52 + itxn_field Fee // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 + int 3 // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0,3 3 inner_transactions/contract.py:49 + itxn_field ConfigAssetDecimals // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 + // virtual: load name_value%2#0 from l-stack (no copy) asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,name_value%2#0 itxn_field ConfigAssetName // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 itxn_submit // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0 asset_params.submit() inner_transactions/contract.py:61 itxn ConfigAssetName // asset1_txn%%CreatedAssetID#0,asset1_txn%%ConfigAssetName#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,{itxn} asset_params.submit() inner_transactions/contract.py:61 diff --git a/test_cases/inner_transactions/out/MyContract.destructured.ir b/test_cases/inner_transactions/out/MyContract.destructured.ir index d48baa8d63..930f80af5e 100644 --- a/test_cases/inner_transactions/out/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out/MyContract.destructured.ir @@ -31,8 +31,8 @@ contract test_cases.inner_transactions.contract.MyContract: subroutine test_cases.inner_transactions.contract.MyContract.test1() -> void: block@0: // L42 (app_global_put "name" "AST1") - let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check name exists + let (name_value%0#0: bytes, name_exists%1#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -44,12 +44,12 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%0#0) + ((itxn_field ConfigAssetName) name_value%0#0) itxn_submit let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) - let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check name exists + let (name_value%2#0: bytes, name_exists%3#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) @@ -58,7 +58,7 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%2#0) + ((itxn_field ConfigAssetName) name_value%2#0) itxn_submit let asset2_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset2_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) diff --git a/test_cases/inner_transactions/out/MyContract.ssa.ir b/test_cases/inner_transactions/out/MyContract.ssa.ir index 776c66f557..dd0dd3c249 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.ir @@ -44,9 +44,9 @@ contract test_cases.inner_transactions.contract.MyContract: let asset_params%%Applications_length#0: uint64 = 0u let asset_params%%AssetAmount_length#0: uint64 = 0u let asset_params%%AssetCloseTo_length#0: uint64 = 0u - let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check name exists - let asset_params%%param_ConfigAssetName_idx_0#0: bytes = app_global_get_ex_value%0#0 + let (name_value%0#0: bytes, name_exists%1#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%1#0) // check name exists + let asset_params%%param_ConfigAssetName_idx_0#0: bytes = name_value%0#0 let asset_params%%ConfigAssetName_length#0: uint64 = 1u let asset_params%%AssetReceiver_length#0: uint64 = 0u let asset_params%%AssetSender_length#0: uint64 = 0u @@ -171,9 +171,9 @@ contract test_cases.inner_transactions.contract.MyContract: let asset1_txn%%VoteKeyDilution#0: uint64 = (itxn VoteKeyDilution) let asset1_txn%%VoteLast#0: uint64 = (itxn VoteLast) let asset1_txn%%XferAsset#0: uint64 = (itxn XferAsset) - let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check name exists - let asset_params%%param_ConfigAssetName_idx_0#1: bytes = app_global_get_ex_value%2#0 + let (name_value%2#0: bytes, name_exists%3#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%3#0) // check name exists + let asset_params%%param_ConfigAssetName_idx_0#1: bytes = name_value%2#0 let asset_params%%ConfigAssetName_length#1: uint64 = 1u itxn_begin ((itxn_field ConfigAssetUnitName) asset_params%%param_ConfigAssetUnitName_idx_0#0) diff --git a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir index 1d1beb5fb2..fd5c0d1496 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir @@ -31,8 +31,8 @@ contract test_cases.inner_transactions.contract.MyContract: subroutine test_cases.inner_transactions.contract.MyContract.test1() -> void: block@0: // L42 (app_global_put "name" "AST1") - let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check name exists + let (name_value%0#0: bytes, name_exists%1#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -44,12 +44,12 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%0#0) + ((itxn_field ConfigAssetName) name_value%0#0) itxn_submit let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) - let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check name exists + let (name_value%2#0: bytes, name_exists%3#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) @@ -58,7 +58,7 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%2#0) + ((itxn_field ConfigAssetName) name_value%2#0) itxn_submit let asset2_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset2_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) diff --git a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir index 44aca6d788..77ac4df66a 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir @@ -31,8 +31,8 @@ contract test_cases.inner_transactions.contract.MyContract: subroutine test_cases.inner_transactions.contract.MyContract.test1() -> void: block@0: // L42 (app_global_put "name" "AST1") - let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check name exists + let (name_value%0#0: bytes, name_exists%1#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -44,12 +44,12 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%0#0) + ((itxn_field ConfigAssetName) name_value%0#0) itxn_submit let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) - let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check name exists + let (name_value%2#0: bytes, name_exists%3#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) @@ -58,7 +58,7 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%2#0) + ((itxn_field ConfigAssetName) name_value%2#0) itxn_submit let asset2_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset2_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) diff --git a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir index d37471e26e..9d9d68d467 100644 --- a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir @@ -44,9 +44,9 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check hello_app exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (hello_app_value%0#0: uint64, hello_app_exists%1#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%1#0) // check hello_app exists + let tmp%2#0: uint64 = (! hello_app_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin ((itxn_field TypeEnum) appl) @@ -56,17 +56,17 @@ contract test_cases.inner_transactions.c2c.Greeter: itxn_submit let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) - let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check hello_app exists - return app_global_get_ex_value%5#0 + let (hello_app_value%5#0: uint64, hello_app_exists%6#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%6#0) // check hello_app exists + return hello_app_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 itxn_begin - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check hello_app exists + let (hello_app_value%1#0: uint64, hello_app_exists%2#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%2#0) // check hello_app exists ((itxn_field TypeEnum) appl) - ((itxn_field ApplicationID) app_global_get_ex_value%1#0) + ((itxn_field ApplicationID) hello_app_value%1#0) ((itxn_field ApplicationArgs) method "hello(string)string") ((itxn_field ApplicationArgs) name#0) itxn_submit diff --git a/test_cases/inner_transactions/out_O2/MyContract.destructured.ir b/test_cases/inner_transactions/out_O2/MyContract.destructured.ir index d48baa8d63..930f80af5e 100644 --- a/test_cases/inner_transactions/out_O2/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out_O2/MyContract.destructured.ir @@ -31,8 +31,8 @@ contract test_cases.inner_transactions.contract.MyContract: subroutine test_cases.inner_transactions.contract.MyContract.test1() -> void: block@0: // L42 (app_global_put "name" "AST1") - let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check name exists + let (name_value%0#0: bytes, name_exists%1#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%1#0) // check name exists let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let asset_params%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) (app_global_put "name" "AST2") @@ -44,12 +44,12 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%0#0) + ((itxn_field ConfigAssetName) name_value%0#0) itxn_submit let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) - let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check name exists + let (name_value%2#0: bytes, name_exists%3#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%3#0) // check name exists itxn_begin ((itxn_field ConfigAssetUnitName) "unit") ((itxn_field TypeEnum) acfg) @@ -58,7 +58,7 @@ contract test_cases.inner_transactions.contract.MyContract: ((itxn_field ConfigAssetManager) asset_params%%param_ConfigAssetManager_idx_0#0) ((itxn_field Fee) 0u) ((itxn_field ConfigAssetDecimals) 3u) - ((itxn_field ConfigAssetName) app_global_get_ex_value%2#0) + ((itxn_field ConfigAssetName) name_value%2#0) itxn_submit let asset2_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset2_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) diff --git a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir index 6ac6676daf..5e190cdc1f 100644 --- a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir @@ -52,9 +52,9 @@ contract test_cases.inner_transactions.c2c.Greeter: subroutine test_cases.inner_transactions.c2c.Greeter.bootstrap() -> uint64: block@0: // L10 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%1#0) // check hello_app exists - let tmp%2#0: uint64 = (! app_global_get_ex_value%0#0) + let (hello_app_value%0#0: uint64, hello_app_exists%1#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%1#0) // check hello_app exists + let tmp%2#0: uint64 = (! hello_app_value%0#0) (assert tmp%2#0) // already bootstrapped itxn_begin let inner_txn_params%4%%param_ApprovalProgramPages_idx_0#0: bytes = 0x0a200101311b410026800402bece11361a008e0100010031191444311844361a018800158004151f7c754c50b02243311914443118144422438a01018bff570200800748656c6c6f2c204c504915165706004c5089 @@ -70,18 +70,18 @@ contract test_cases.inner_transactions.c2c.Greeter: itxn_submit let submit_result_0%3%%CreatedApplicationID#0: uint64 = (itxn CreatedApplicationID) (app_global_put "hello_app" submit_result_0%3%%CreatedApplicationID#0) - let (app_global_get_ex_value%5#0: uint64, app_global_get_ex_did_exist%6#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%6#0) // check hello_app exists - return app_global_get_ex_value%5#0 + let (hello_app_value%5#0: uint64, hello_app_exists%6#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%6#0) // check hello_app exists + return hello_app_value%5#0 subroutine test_cases.inner_transactions.c2c.Greeter.log_greetings(name: bytes) -> void: block@0: // L24 itxn_begin let inner_txn_params%0%%param_ApplicationArgs_idx_0#0: bytes = method "hello(string)string" let inner_txn_params%0%%param_ApplicationArgs_idx_1#0: bytes = name#0 - let (app_global_get_ex_value%1#0: uint64, app_global_get_ex_did_exist%2#0: uint64) = (app_global_get_ex 0u "hello_app") - (assert app_global_get_ex_did_exist%2#0) // check hello_app exists - let inner_txn_params%0%%param_ApplicationID_idx_0#0: uint64 = app_global_get_ex_value%1#0 + let (hello_app_value%1#0: uint64, hello_app_exists%2#0: uint64) = (app_global_get_ex 0u "hello_app") + (assert hello_app_exists%2#0) // check hello_app exists + let inner_txn_params%0%%param_ApplicationID_idx_0#0: uint64 = hello_app_value%1#0 let inner_txn_params%0%%param_TypeEnum_idx_0#0: uint64 = appl ((itxn_field TypeEnum) inner_txn_params%0%%param_TypeEnum_idx_0#0) ((itxn_field ApplicationID) inner_txn_params%0%%param_ApplicationID_idx_0#0) diff --git a/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir b/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir index e5b5fa7a44..151c66b9f9 100644 --- a/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir @@ -35,9 +35,9 @@ contract test_cases.inner_transactions.contract.MyContract: subroutine test_cases.inner_transactions.contract.MyContract.test1() -> void: block@0: // L42 (app_global_put "name" "AST1") - let (app_global_get_ex_value%0#0: bytes, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%1#0) // check name exists - let asset_params%%param_ConfigAssetName_idx_0#0: bytes = app_global_get_ex_value%0#0 + let (name_value%0#0: bytes, name_exists%1#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%1#0) // check name exists + let asset_params%%param_ConfigAssetName_idx_0#0: bytes = name_value%0#0 let asset_params%%param_ConfigAssetDecimals_idx_0#0: uint64 = 3u let asset_params%%param_Fee_idx_0#0: uint64 = 0u let asset_params%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) @@ -60,9 +60,9 @@ contract test_cases.inner_transactions.contract.MyContract: itxn_submit let asset1_txn%%ConfigAssetName#0: bytes = (itxn ConfigAssetName) let asset1_txn%%CreatedAssetID#0: uint64 = (itxn CreatedAssetID) - let (app_global_get_ex_value%2#0: bytes, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "name") - (assert app_global_get_ex_did_exist%3#0) // check name exists - let asset_params%%param_ConfigAssetName_idx_0#0: bytes = app_global_get_ex_value%2#0 + let (name_value%2#0: bytes, name_exists%3#0: uint64) = (app_global_get_ex 0u "name") + (assert name_exists%3#0) // check name exists + let asset_params%%param_ConfigAssetName_idx_0#0: bytes = name_value%2#0 itxn_begin ((itxn_field ConfigAssetUnitName) asset_params%%param_ConfigAssetUnitName_idx_0#0) ((itxn_field TypeEnum) asset_params%%param_TypeEnum_idx_0#0) diff --git a/test_cases/inner_transactions/puya.log b/test_cases/inner_transactions/puya.log index 8a37af67d9..c7b4106a2e 100644 --- a/test_cases/inner_transactions/puya.log +++ b/test_cases/inner_transactions/puya.log @@ -1178,8 +1178,8 @@ debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation debug: Found equivalence set: name#0, inner_txn_params%0%%param_ApplicationArgs_idx_1#0 debug: Replacing {inner_txn_params%0%%param_ApplicationArgs_idx_1#0} with name#0 made 1 modifications -debug: Found equivalence set: app_global_get_ex_value%1#0, inner_txn_params%0%%param_ApplicationID_idx_0#0 -debug: Replacing {inner_txn_params%0%%param_ApplicationID_idx_0#0} with app_global_get_ex_value%1#0 made 1 modifications +debug: Found equivalence set: hello_app_value%1#0, inner_txn_params%0%%param_ApplicationID_idx_0#0 +debug: Replacing {inner_txn_params%0%%param_ApplicationID_idx_0#0} with hello_app_value%1#0 made 1 modifications debug: Found equivalence set: tmp%5#0, maybe_value%3#0, greeting#0 debug: Replacing {tmp%5#0, maybe_value%3#0} with greeting#0 made 1 modifications debug: Found equivalence set: tmp%7#0, maybe_value_did_exist%4#0 @@ -1448,16 +1448,16 @@ debug: Replaced main_bare_routing@8.ops[16]: 'load tmp%15#0' with 'load tmp%15#0 debug: Found 3 edge set/s for test_cases.inner_transactions.c2c.Greeter.approval_program debug: Inserted bootstrap_block@0.ops[9]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[11]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[3]: 'store hello_app_exists%1#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[6]: 'load hello_app_exists%1#0' with 'load hello_app_exists%1#0 from l-stack (no copy)' debug: Inserted bootstrap_block@0.ops[25]: 'store submit_result_0%3%%CreatedApplicationID#0 to l-stack (copy)' debug: Replaced bootstrap_block@0.ops[28]: 'load submit_result_0%3%%CreatedApplicationID#0' with 'load submit_result_0%3%%CreatedApplicationID#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[33]: 'store app_global_get_ex_did_exist%6#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[36]: 'load app_global_get_ex_did_exist%6#0' with 'load app_global_get_ex_did_exist%6#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' -debug: Inserted bootstrap_block@0.ops[36]: 'store app_global_get_ex_value%5#0 to l-stack (copy)' -debug: Replaced bootstrap_block@0.ops[40]: 'load app_global_get_ex_value%5#0' with 'load app_global_get_ex_value%5#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[33]: 'store hello_app_exists%6#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[36]: 'load hello_app_exists%6#0' with 'load hello_app_exists%6#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[5]: 'store hello_app_value%0#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[9]: 'load hello_app_value%0#0' with 'load hello_app_value%0#0 from l-stack (no copy)' +debug: Inserted bootstrap_block@0.ops[36]: 'store hello_app_value%5#0 to l-stack (copy)' +debug: Replaced bootstrap_block@0.ops[40]: 'load hello_app_value%5#0' with 'load hello_app_value%5#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[18]: 'store hello_call%%LastLog#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[20]: 'load hello_call%%LastLog#0' with 'load hello_call%%LastLog#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[25]: 'store tmp%6#0 to l-stack (copy)' @@ -1466,14 +1466,14 @@ debug: Inserted log_greetings_block@0.ops[30]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[32]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[40]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[42]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted log_greetings_block@0.ops[4]: 'store app_global_get_ex_did_exist%2#0 to l-stack (copy)' -debug: Replaced log_greetings_block@0.ops[7]: 'load app_global_get_ex_did_exist%2#0' with 'load app_global_get_ex_did_exist%2#0 from l-stack (no copy)' +debug: Inserted log_greetings_block@0.ops[4]: 'store hello_app_exists%2#0 to l-stack (copy)' +debug: Replaced log_greetings_block@0.ops[7]: 'load hello_app_exists%2#0' with 'load hello_app_exists%2#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[37]: 'store tmp%9#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[40]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[22]: 'store hello_call%%LastLog#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[25]: 'load hello_call%%LastLog#0' with 'load hello_call%%LastLog#0 from l-stack (no copy)' -debug: Inserted log_greetings_block@0.ops[6]: 'store app_global_get_ex_value%1#0 to l-stack (copy)' -debug: Replaced log_greetings_block@0.ops[12]: 'load app_global_get_ex_value%1#0' with 'load app_global_get_ex_value%1#0 from l-stack (no copy)' +debug: Inserted log_greetings_block@0.ops[6]: 'store hello_app_value%1#0 to l-stack (copy)' +debug: Replaced log_greetings_block@0.ops[12]: 'load hello_app_value%1#0' with 'load hello_app_value%1#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[25]: 'store greeting#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[38]: 'load greeting#0' with 'load greeting#0 from l-stack (no copy)' debug: Output IR to inner_transactions/out/MyContract.ssa.ir @@ -1503,10 +1503,10 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: app_global_get_ex_value%0#0, asset_params%%param_ConfigAssetName_idx_0#0 -debug: Replacing {asset_params%%param_ConfigAssetName_idx_0#0} with app_global_get_ex_value%0#0 made 1 modifications -debug: Found equivalence set: app_global_get_ex_value%2#0, asset_params%%param_ConfigAssetName_idx_0#1 -debug: Replacing {asset_params%%param_ConfigAssetName_idx_0#1} with app_global_get_ex_value%2#0 made 1 modifications +debug: Found equivalence set: name_value%0#0, asset_params%%param_ConfigAssetName_idx_0#0 +debug: Replacing {asset_params%%param_ConfigAssetName_idx_0#0} with name_value%0#0 made 1 modifications +debug: Found equivalence set: name_value%2#0, asset_params%%param_ConfigAssetName_idx_0#1 +debug: Replacing {asset_params%%param_ConfigAssetName_idx_0#1} with name_value%2#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Removing unused variable asset_params%%Accounts_length#0 @@ -4761,10 +4761,10 @@ debug: Inserted test1_block@0.ops[104]: 'store tmp%11#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[106]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[144]: 'store tmp%12#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[146]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[6]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[9]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[43]: 'store app_global_get_ex_did_exist%3#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[46]: 'load app_global_get_ex_did_exist%3#0' with 'load app_global_get_ex_did_exist%3#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[6]: 'store name_exists%1#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[9]: 'load name_exists%1#0' with 'load name_exists%1#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[43]: 'store name_exists%3#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[46]: 'load name_exists%3#0' with 'load name_exists%3#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[86]: 'store maybe_value_did_exist%7#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[89]: 'load maybe_value_did_exist%7#0' with 'load maybe_value_did_exist%7#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[100]: 'store maybe_value_did_exist%10#0 to l-stack (copy)' @@ -4783,10 +4783,10 @@ debug: Inserted test1_block@0.ops[14]: 'store asset_params%%param_ConfigAssetRes debug: Replaced test1_block@0.ops[26]: 'load asset_params%%param_ConfigAssetReserve_idx_0#0' with 'load asset_params%%param_ConfigAssetReserve_idx_0#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[12]: 'store asset_params%%param_ConfigAssetManager_idx_0#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[29]: 'load asset_params%%param_ConfigAssetManager_idx_0#0' with 'load asset_params%%param_ConfigAssetManager_idx_0#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[47]: 'store app_global_get_ex_value%2#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[66]: 'load app_global_get_ex_value%2#0' with 'load app_global_get_ex_value%2#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[8]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[36]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[47]: 'store name_value%2#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[66]: 'load name_value%2#0' with 'load name_value%2#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[8]: 'store name_value%0#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[36]: 'load name_value%0#0' with 'load name_value%0#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[74]: 'store asset2_txn%%CreatedAssetID#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[105]: 'load asset2_txn%%CreatedAssetID#0' with 'load asset2_txn%%CreatedAssetID#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[29]: 'store asset_params%%param_ConfigAssetReserve_idx_0#0 to l-stack (copy)' diff --git a/test_cases/match/out/MyContract.approval.mir b/test_cases/match/out/MyContract.approval.mir index e2906219b3..5599b5c777 100644 --- a/test_cases/match/out/MyContract.approval.mir +++ b/test_cases/match/out/MyContract.approval.mir @@ -1,46 +1,46 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.match.contract.MyContract.approval_program() -> uint64: main_block@0: - byte "case_one" // "case_one" self.case_one match/contract.py:6 - int 1 // "case_one",1 1 match/contract.py:6 - app_global_put // self.case_one = puyapy.UInt64(1) match/contract.py:6 - byte "case_two" // "case_two" self.case_two match/contract.py:7 - int 2 // "case_two",2 2 match/contract.py:7 - app_global_put // self.case_two = puyapy.UInt64(2) match/contract.py:7 - callsub match_uint64 // self.match_uint64() match/contract.py:8 - callsub match_biguint // self.match_biguint() match/contract.py:9 - callsub match_bytes // self.match_bytes() match/contract.py:10 - callsub match_address // self.match_address() match/contract.py:11 - callsub match_attributes // self.match_attributes() match/contract.py:12 - callsub match_bools // self.match_bools() match/contract.py:13 - int 1 // 1 True match/contract.py:14 - return // return True match/contract.py:14 + byte "case_one" // "case_one" self.case_one match/contract.py:6 + int 1 // "case_one",1 1 match/contract.py:6 + app_global_put // self.case_one = puyapy.UInt64(1) match/contract.py:6 + byte "case_two" // "case_two" self.case_two match/contract.py:7 + int 2 // "case_two",2 2 match/contract.py:7 + app_global_put // self.case_two = puyapy.UInt64(2) match/contract.py:7 + callsub match_uint64 // self.match_uint64() match/contract.py:8 + callsub match_biguint // self.match_biguint() match/contract.py:9 + callsub match_bytes // self.match_bytes() match/contract.py:10 + callsub match_address // self.match_address() match/contract.py:11 + callsub match_attributes // self.match_attributes() match/contract.py:12 + callsub match_bools // self.match_bools() match/contract.py:13 + int 1 // 1 True match/contract.py:14 + return // return True match/contract.py:14 // test_cases.match.contract.MyContract.match_uint64() -> void: match_uint64: - proto 0 0 // @puyapy.subroutine\ndef match_uint64(self) -> None: match/contract.py:16-17 + proto 0 0 // @puyapy.subroutine\ndef match_uint64(self) -> None: match/contract.py:16-17 match_uint64_block@0: - txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:18 - // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args match/contract.py:18 - int 0 // n#0,0 0 match/contract.py:20 - int 10 // n#0,0,10 10 match/contract.py:23 - uncover 2 // load n#0 from l-stack (no copy) 0,10,n#0 match n:\ncase puyapy.UInt64(0):\nhello = puyapy.Bytes(b"Hello")\npuyapy.log(hello)\ncase puyapy.... match/contract.py:19-25 - match match_uint64_switch_case_0@1 match_uint64_switch_case_1@2 // match n:\ncase puyapy.UInt64(0):\nhello = puyapy.Bytes(b"Hello")\npuyapy.log(hello)\ncase puyapy.... match/contract.py:19-25 + txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:18 + // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args match/contract.py:18 + int 0 // n#0,0 0 match/contract.py:20 + int 10 // n#0,0,10 10 match/contract.py:23 + uncover 2 // load n#0 from l-stack (no copy) 0,10,n#0 match n:\ncase puyapy.UInt64(0):\nhello = puyapy.Bytes(b"Hello")\npuyapy.log(hello)\ncase puyapy.... match/contract.py:19-25 + match match_uint64_switch_case_0@1 match_uint64_switch_case_1@2 // match n:\ncase puyapy.UInt64(0):\nhello = puyapy.Bytes(b"Hello")\npuyapy.log(hello)\ncase puyapy.... match/contract.py:19-25 retsub // match_uint64_switch_case_0@1: - byte "Hello" // "Hello" b"Hello" match/contract.py:21 - log // puyapy.log(hello) match/contract.py:22 + byte "Hello" // "Hello" b"Hello" match/contract.py:21 + log // puyapy.log(hello) match/contract.py:22 b match_uint64_switch_case_next@4 // match_uint64_switch_case_1@2: - byte "Hello There" // "Hello There" b"Hello There" match/contract.py:24 - log // puyapy.log(hello) match/contract.py:25 + byte "Hello There" // "Hello There" b"Hello There" match/contract.py:24 + log // puyapy.log(hello) match/contract.py:25 // Implicit fall through to match_uint64_switch_case_next@4 // match_uint64_switch_case_next@4: @@ -49,32 +49,32 @@ match_uint64_switch_case_next@4: // test_cases.match.contract.MyContract.match_biguint() -> void: match_biguint: - proto 0 0 // @puyapy.subroutine\ndef match_biguint(self) -> None: match/contract.py:38-39 + proto 0 0 // @puyapy.subroutine\ndef match_biguint(self) -> None: match/contract.py:38-39 match_biguint_block@0: - txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:40 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 puyapy.op.Txn.num_app_args match/contract.py:40 - // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 - itob // {itob} puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 n = puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 - byte 0x0a // tmp%1#0,0x0a 10 match/contract.py:40 - b* // {b*} puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 - // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 - byte 0x // n#0,0x 0 match/contract.py:42 - byte 0x0a // n#0,0x,0x0a 10 match/contract.py:45 - uncover 2 // load n#0 from l-stack (no copy) 0x,0x0a,n#0 match n:\ncase puyapy.BigUInt(0):\nhello = puyapy.Bytes(b"Hello biguint")\npuyapy.log(hello)\ncas... match/contract.py:41-47 - match match_biguint_switch_case_0@1 match_biguint_switch_case_1@2 // match n:\ncase puyapy.BigUInt(0):\nhello = puyapy.Bytes(b"Hello biguint")\npuyapy.log(hello)\ncas... match/contract.py:41-47 + txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:40 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 puyapy.op.Txn.num_app_args match/contract.py:40 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 + itob // {itob} puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 n = puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 + byte 0x0a // tmp%1#0,0x0a 10 match/contract.py:40 + b* // {b*} puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 + // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args * puyapy.BigUInt(10) match/contract.py:40 + byte 0x // n#0,0x 0 match/contract.py:42 + byte 0x0a // n#0,0x,0x0a 10 match/contract.py:45 + uncover 2 // load n#0 from l-stack (no copy) 0x,0x0a,n#0 match n:\ncase puyapy.BigUInt(0):\nhello = puyapy.Bytes(b"Hello biguint")\npuyapy.log(hello)\ncas... match/contract.py:41-47 + match match_biguint_switch_case_0@1 match_biguint_switch_case_1@2 // match n:\ncase puyapy.BigUInt(0):\nhello = puyapy.Bytes(b"Hello biguint")\npuyapy.log(hello)\ncas... match/contract.py:41-47 retsub // match_biguint_switch_case_0@1: - byte "Hello biguint" // "Hello biguint" b"Hello biguint" match/contract.py:43 - log // puyapy.log(hello) match/contract.py:44 + byte "Hello biguint" // "Hello biguint" b"Hello biguint" match/contract.py:43 + log // puyapy.log(hello) match/contract.py:44 b match_biguint_switch_case_next@4 // match_biguint_switch_case_1@2: - byte "Hello There biguint" // "Hello There biguint" b"Hello There biguint" match/contract.py:46 - log // puyapy.log(hello) match/contract.py:47 + byte "Hello There biguint" // "Hello There biguint" b"Hello There biguint" match/contract.py:46 + log // puyapy.log(hello) match/contract.py:47 // Implicit fall through to match_biguint_switch_case_next@4 // match_biguint_switch_case_next@4: @@ -83,25 +83,25 @@ match_biguint_switch_case_next@4: // test_cases.match.contract.MyContract.match_bytes() -> void: match_bytes: - proto 0 0 // @puyapy.subroutine\ndef match_bytes(self) -> None: match/contract.py:27-28 + proto 0 0 // @puyapy.subroutine\ndef match_bytes(self) -> None: match/contract.py:27-28 match_bytes_block@0: - txna ApplicationArgs 0 // {txna} puyapy.op.Txn.application_args(0) match/contract.py:29 - // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.application_args(0) match/contract.py:29 - byte "" // n#0,"" b"" match/contract.py:31 - byte "10" // n#0,"","10" b"10" match/contract.py:34 - uncover 2 // load n#0 from l-stack (no copy) "","10",n#0 match n:\ncase puyapy.Bytes(b""):\nhello = puyapy.Bytes(b"Hello bytes")\npuyapy.log(hello)\ncase ... match/contract.py:30-36 - match match_bytes_switch_case_0@1 match_bytes_switch_case_1@2 // match n:\ncase puyapy.Bytes(b""):\nhello = puyapy.Bytes(b"Hello bytes")\npuyapy.log(hello)\ncase ... match/contract.py:30-36 + txna ApplicationArgs 0 // {txna} puyapy.op.Txn.application_args(0) match/contract.py:29 + // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.application_args(0) match/contract.py:29 + byte "" // n#0,"" b"" match/contract.py:31 + byte "10" // n#0,"","10" b"10" match/contract.py:34 + uncover 2 // load n#0 from l-stack (no copy) "","10",n#0 match n:\ncase puyapy.Bytes(b""):\nhello = puyapy.Bytes(b"Hello bytes")\npuyapy.log(hello)\ncase ... match/contract.py:30-36 + match match_bytes_switch_case_0@1 match_bytes_switch_case_1@2 // match n:\ncase puyapy.Bytes(b""):\nhello = puyapy.Bytes(b"Hello bytes")\npuyapy.log(hello)\ncase ... match/contract.py:30-36 retsub // match_bytes_switch_case_0@1: - byte "Hello bytes" // "Hello bytes" b"Hello bytes" match/contract.py:32 - log // puyapy.log(hello) match/contract.py:33 + byte "Hello bytes" // "Hello bytes" b"Hello bytes" match/contract.py:32 + log // puyapy.log(hello) match/contract.py:33 b match_bytes_switch_case_next@4 // match_bytes_switch_case_1@2: - byte "Hello There bytes" // "Hello There bytes" b"Hello There bytes" match/contract.py:35 - log // puyapy.log(hello) match/contract.py:36 + byte "Hello There bytes" // "Hello There bytes" b"Hello There bytes" match/contract.py:35 + log // puyapy.log(hello) match/contract.py:36 // Implicit fall through to match_bytes_switch_case_next@4 // match_bytes_switch_case_next@4: @@ -110,25 +110,25 @@ match_bytes_switch_case_next@4: // test_cases.match.contract.MyContract.match_address() -> void: match_address: - proto 0 0 // @puyapy.subroutine\ndef match_address(self) -> None: match/contract.py:49-50 + proto 0 0 // @puyapy.subroutine\ndef match_address(self) -> None: match/contract.py:49-50 match_address_block@0: - txn Sender // {txn} puyapy.op.Txn.sender match/contract.py:51 - // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.sender match/contract.py:51 - addr AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ // n#0,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ" match/contract.py:53 - addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA // n#0,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ,VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA "VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA" match/contract.py:56 - uncover 2 // load n#0 from l-stack (no copy) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ,VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA,n#0 match n:\ncase puyapy.Account("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ"):\nhel... match/contract.py:52-58 - match match_address_switch_case_0@1 match_address_switch_case_1@2 // match n:\ncase puyapy.Account("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ"):\nhel... match/contract.py:52-58 + txn Sender // {txn} puyapy.op.Txn.sender match/contract.py:51 + // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.sender match/contract.py:51 + addr AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ // n#0,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ" match/contract.py:53 + addr VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA // n#0,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ,VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA "VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA" match/contract.py:56 + uncover 2 // load n#0 from l-stack (no copy) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ,VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA,n#0 match n:\ncase puyapy.Account("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ"):\nhel... match/contract.py:52-58 + match match_address_switch_case_0@1 match_address_switch_case_1@2 // match n:\ncase puyapy.Account("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ"):\nhel... match/contract.py:52-58 retsub // match_address_switch_case_0@1: - byte "Hello address" // "Hello address" b"Hello address" match/contract.py:54 - log // puyapy.log(hello) match/contract.py:55 + byte "Hello address" // "Hello address" b"Hello address" match/contract.py:54 + log // puyapy.log(hello) match/contract.py:55 b match_address_switch_case_next@4 // match_address_switch_case_1@2: - byte "Hello There address" // "Hello There address" b"Hello There address" match/contract.py:57 - log // puyapy.log(hello) match/contract.py:58 + byte "Hello There address" // "Hello There address" b"Hello There address" match/contract.py:57 + log // puyapy.log(hello) match/contract.py:58 // Implicit fall through to match_address_switch_case_next@4 // match_address_switch_case_next@4: @@ -137,44 +137,44 @@ match_address_switch_case_next@4: // test_cases.match.contract.MyContract.match_attributes() -> void: match_attributes: - proto 0 0 // @puyapy.subroutine\ndef match_attributes(self) -> None: match/contract.py:60-61 + proto 0 0 // @puyapy.subroutine\ndef match_attributes(self) -> None: match/contract.py:60-61 match_attributes_block@0: - txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:62 - // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args match/contract.py:62 - int 0 // n#0,0 self.case_one match/contract.py:64 - byte "case_one" // n#0,0,"case_one" self.case_one match/contract.py:64 - app_global_get_ex // n#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.case_one match/contract.py:64 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) n#0,app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.case_one match/contract.py:64 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.case_one match/contract.py:64 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.case_one match/contract.py:64 - assert // check case_one exists // n#0,app_global_get_ex_value%0#0 self.case_one match/contract.py:64 - int 0 // n#0,app_global_get_ex_value%0#0,0 self.case_two match/contract.py:67 - byte "case_two" // n#0,app_global_get_ex_value%0#0,0,"case_two" self.case_two match/contract.py:67 - app_global_get_ex // n#0,app_global_get_ex_value%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.case_two match/contract.py:67 - // virtual: store app_global_get_ex_did_exist%3#0 to l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_did_exist%3#0,{app_global_get_ex}.0 self.case_two match/contract.py:67 - // virtual: store app_global_get_ex_value%2#0 to l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.case_two match/contract.py:67 - // virtual: load app_global_get_ex_did_exist%3#0 from l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0,app_global_get_ex_did_exist%3#0 self.case_two match/contract.py:67 - assert // check case_two exists // n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0 self.case_two match/contract.py:67 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) n#0,app_global_get_ex_value%2#0,app_global_get_ex_value%0#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 - // virtual: load app_global_get_ex_value%2#0 from l-stack (no copy) n#0,app_global_get_ex_value%0#0,app_global_get_ex_value%2#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 - uncover 2 // load n#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_value%2#0,n#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 - match match_attributes_switch_case_0@1 match_attributes_switch_case_1@2 // match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 - b match_attributes_switch_case_default@3 // hello = puyapy.Bytes(b"Hello default")\npuyapy.log(hello) match/contract.py:71-72 + txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:62 + // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args match/contract.py:62 + int 0 // n#0,0 self.case_one match/contract.py:64 + byte "case_one" // n#0,0,"case_one" self.case_one match/contract.py:64 + app_global_get_ex // n#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.case_one match/contract.py:64 + // virtual: store case_one_exists%1#0 to l-stack (no copy) n#0,case_one_exists%1#0,{app_global_get_ex}.0 self.case_one match/contract.py:64 + // virtual: store case_one_value%0#0 to l-stack (no copy) n#0,case_one_value%0#0,case_one_exists%1#0 self.case_one match/contract.py:64 + // virtual: load case_one_exists%1#0 from l-stack (no copy) n#0,case_one_value%0#0,case_one_exists%1#0 self.case_one match/contract.py:64 + assert // check case_one exists // n#0,case_one_value%0#0 self.case_one match/contract.py:64 + int 0 // n#0,case_one_value%0#0,0 self.case_two match/contract.py:67 + byte "case_two" // n#0,case_one_value%0#0,0,"case_two" self.case_two match/contract.py:67 + app_global_get_ex // n#0,case_one_value%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.case_two match/contract.py:67 + // virtual: store case_two_exists%3#0 to l-stack (no copy) n#0,case_one_value%0#0,case_two_exists%3#0,{app_global_get_ex}.0 self.case_two match/contract.py:67 + // virtual: store case_two_value%2#0 to l-stack (no copy) n#0,case_one_value%0#0,case_two_value%2#0,case_two_exists%3#0 self.case_two match/contract.py:67 + // virtual: load case_two_exists%3#0 from l-stack (no copy) n#0,case_one_value%0#0,case_two_value%2#0,case_two_exists%3#0 self.case_two match/contract.py:67 + assert // check case_two exists // n#0,case_one_value%0#0,case_two_value%2#0 self.case_two match/contract.py:67 + // virtual: load case_one_value%0#0 from l-stack (no copy) n#0,case_two_value%2#0,case_one_value%0#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 + // virtual: load case_two_value%2#0 from l-stack (no copy) n#0,case_one_value%0#0,case_two_value%2#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 + uncover 2 // load n#0 from l-stack (no copy) case_one_value%0#0,case_two_value%2#0,n#0 match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 + match match_attributes_switch_case_0@1 match_attributes_switch_case_1@2 // match n:\ncase self.case_one:\nhello = puyapy.Bytes(b"Hello one")\npuyapy.log(hello)\ncase self.c... match/contract.py:63-72 + b match_attributes_switch_case_default@3 // hello = puyapy.Bytes(b"Hello default")\npuyapy.log(hello) match/contract.py:71-72 match_attributes_switch_case_0@1: - byte "Hello one" // "Hello one" b"Hello one" match/contract.py:65 - log // puyapy.log(hello) match/contract.py:66 + byte "Hello one" // "Hello one" b"Hello one" match/contract.py:65 + log // puyapy.log(hello) match/contract.py:66 b match_attributes_switch_case_next@4 // match_attributes_switch_case_1@2: - byte "Hello two" // "Hello two" b"Hello two" match/contract.py:68 - log // puyapy.log(hello) match/contract.py:69 + byte "Hello two" // "Hello two" b"Hello two" match/contract.py:68 + log // puyapy.log(hello) match/contract.py:69 b match_attributes_switch_case_next@4 // match_attributes_switch_case_default@3: - byte "Hello default" // "Hello default" b"Hello default" match/contract.py:71 - log // puyapy.log(hello) match/contract.py:72 + byte "Hello default" // "Hello default" b"Hello default" match/contract.py:71 + log // puyapy.log(hello) match/contract.py:72 // Implicit fall through to match_attributes_switch_case_next@4 // match_attributes_switch_case_next@4: @@ -183,27 +183,27 @@ match_attributes_switch_case_next@4: // test_cases.match.contract.MyContract.match_bools() -> void: match_bools: - proto 0 0 // @puyapy.subroutine\ndef match_bools(self) -> None: match/contract.py:74-75 + proto 0 0 // @puyapy.subroutine\ndef match_bools(self) -> None: match/contract.py:74-75 match_bools_block@0: - txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:76 - // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 puyapy.op.Txn.num_app_args match/contract.py:76 - // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 n = puyapy.op.Txn.num_app_args > 0 match/contract.py:76 - int 0 // tmp%0#0,0 0 match/contract.py:76 - > // {>} puyapy.op.Txn.num_app_args > 0 match/contract.py:76 - // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args > 0 match/contract.py:76 - // virtual: load n#0 from l-stack (no copy) n#0 match n:\ncase True:\nhello = puyapy.Bytes(b"Hello True")\npuyapy.log(hello)\ncase False:\nhello ... match/contract.py:77-83 - switch match_bools_switch_case_1@2 match_bools_switch_case_0@1 // match n:\ncase True:\nhello = puyapy.Bytes(b"Hello True")\npuyapy.log(hello)\ncase False:\nhello ... match/contract.py:77-83 + txn NumAppArgs // {txn} puyapy.op.Txn.num_app_args match/contract.py:76 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 puyapy.op.Txn.num_app_args match/contract.py:76 + // virtual: load tmp%0#0 from l-stack (no copy) tmp%0#0 n = puyapy.op.Txn.num_app_args > 0 match/contract.py:76 + int 0 // tmp%0#0,0 0 match/contract.py:76 + > // {>} puyapy.op.Txn.num_app_args > 0 match/contract.py:76 + // virtual: store n#0 to l-stack (no copy) n#0 n = puyapy.op.Txn.num_app_args > 0 match/contract.py:76 + // virtual: load n#0 from l-stack (no copy) n#0 match n:\ncase True:\nhello = puyapy.Bytes(b"Hello True")\npuyapy.log(hello)\ncase False:\nhello ... match/contract.py:77-83 + switch match_bools_switch_case_1@2 match_bools_switch_case_0@1 // match n:\ncase True:\nhello = puyapy.Bytes(b"Hello True")\npuyapy.log(hello)\ncase False:\nhello ... match/contract.py:77-83 retsub // match_bools_switch_case_0@1: - byte "Hello True" // "Hello True" b"Hello True" match/contract.py:79 - log // puyapy.log(hello) match/contract.py:80 + byte "Hello True" // "Hello True" b"Hello True" match/contract.py:79 + log // puyapy.log(hello) match/contract.py:80 b match_bools_switch_case_next@4 // match_bools_switch_case_1@2: - byte "Hello False" // "Hello False" b"Hello False" match/contract.py:82 - log // puyapy.log(hello) match/contract.py:83 + byte "Hello False" // "Hello False" b"Hello False" match/contract.py:82 + log // puyapy.log(hello) match/contract.py:83 // Implicit fall through to match_bools_switch_case_next@4 // match_bools_switch_case_next@4: diff --git a/test_cases/match/out/MyContract.destructured.ir b/test_cases/match/out/MyContract.destructured.ir index 39d2c488cb..a65309caff 100644 --- a/test_cases/match/out/MyContract.destructured.ir +++ b/test_cases/match/out/MyContract.destructured.ir @@ -69,11 +69,11 @@ contract test_cases.match.contract.MyContract: subroutine test_cases.match.contract.MyContract.match_attributes() -> void: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check case_one exists - let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check case_two exists - switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} + let (case_one_value%0#0: uint64, case_one_exists%1#0: uint64) = (app_global_get_ex 0u "case_one") + (assert case_one_exists%1#0) // check case_one exists + let (case_two_value%2#0: uint64, case_two_exists%3#0: uint64) = (app_global_get_ex 0u "case_two") + (assert case_two_exists%3#0) // check case_two exists + switch n#0 {case_one_value%0#0 => block@1, case_two_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 (log "Hello one") goto block@4 diff --git a/test_cases/match/out/MyContract.ssa.ir b/test_cases/match/out/MyContract.ssa.ir index 018230b911..2b583cb12c 100644 --- a/test_cases/match/out/MyContract.ssa.ir +++ b/test_cases/match/out/MyContract.ssa.ir @@ -85,11 +85,11 @@ contract test_cases.match.contract.MyContract: subroutine test_cases.match.contract.MyContract.match_attributes() -> void: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check case_one exists - let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check case_two exists - switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} + let (case_one_value%0#0: uint64, case_one_exists%1#0: uint64) = (app_global_get_ex 0u "case_one") + (assert case_one_exists%1#0) // check case_one exists + let (case_two_value%2#0: uint64, case_two_exists%3#0: uint64) = (app_global_get_ex 0u "case_two") + (assert case_two_exists%3#0) // check case_two exists + switch n#0 {case_one_value%0#0 => block@1, case_two_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 let hello#0: bytes = "Hello one" (log hello#0) diff --git a/test_cases/match/out/MyContract.ssa.opt_pass_1.ir b/test_cases/match/out/MyContract.ssa.opt_pass_1.ir index 39d2c488cb..a65309caff 100644 --- a/test_cases/match/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/match/out/MyContract.ssa.opt_pass_1.ir @@ -69,11 +69,11 @@ contract test_cases.match.contract.MyContract: subroutine test_cases.match.contract.MyContract.match_attributes() -> void: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check case_one exists - let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check case_two exists - switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} + let (case_one_value%0#0: uint64, case_one_exists%1#0: uint64) = (app_global_get_ex 0u "case_one") + (assert case_one_exists%1#0) // check case_one exists + let (case_two_value%2#0: uint64, case_two_exists%3#0: uint64) = (app_global_get_ex 0u "case_two") + (assert case_two_exists%3#0) // check case_two exists + switch n#0 {case_one_value%0#0 => block@1, case_two_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 (log "Hello one") goto block@4 diff --git a/test_cases/match/out_O2/MyContract.destructured.ir b/test_cases/match/out_O2/MyContract.destructured.ir index 39d2c488cb..a65309caff 100644 --- a/test_cases/match/out_O2/MyContract.destructured.ir +++ b/test_cases/match/out_O2/MyContract.destructured.ir @@ -69,11 +69,11 @@ contract test_cases.match.contract.MyContract: subroutine test_cases.match.contract.MyContract.match_attributes() -> void: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check case_one exists - let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check case_two exists - switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} + let (case_one_value%0#0: uint64, case_one_exists%1#0: uint64) = (app_global_get_ex 0u "case_one") + (assert case_one_exists%1#0) // check case_one exists + let (case_two_value%2#0: uint64, case_two_exists%3#0: uint64) = (app_global_get_ex 0u "case_two") + (assert case_two_exists%3#0) // check case_two exists + switch n#0 {case_one_value%0#0 => block@1, case_two_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 (log "Hello one") goto block@4 diff --git a/test_cases/match/out_unoptimized/MyContract.destructured.ir b/test_cases/match/out_unoptimized/MyContract.destructured.ir index c122ee7847..4303c8c302 100644 --- a/test_cases/match/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/match/out_unoptimized/MyContract.destructured.ir @@ -85,11 +85,11 @@ contract test_cases.match.contract.MyContract: subroutine test_cases.match.contract.MyContract.match_attributes() -> void: block@0: // L60 let n#0: uint64 = (txn NumAppArgs) - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "case_one") - (assert app_global_get_ex_did_exist%1#0) // check case_one exists - let (app_global_get_ex_value%2#0: uint64, app_global_get_ex_did_exist%3#0: uint64) = (app_global_get_ex 0u "case_two") - (assert app_global_get_ex_did_exist%3#0) // check case_two exists - switch n#0 {app_global_get_ex_value%0#0 => block@1, app_global_get_ex_value%2#0 => block@2, * => block@3} + let (case_one_value%0#0: uint64, case_one_exists%1#0: uint64) = (app_global_get_ex 0u "case_one") + (assert case_one_exists%1#0) // check case_one exists + let (case_two_value%2#0: uint64, case_two_exists%3#0: uint64) = (app_global_get_ex 0u "case_two") + (assert case_two_exists%3#0) // check case_two exists + switch n#0 {case_one_value%0#0 => block@1, case_two_value%2#0 => block@2, * => block@3} block@1: // switch_case_0_L65 let hello#0: bytes = "Hello one" (log hello#0) diff --git a/test_cases/match/puya.log b/test_cases/match/puya.log index fc02a59e3d..d295de1c63 100644 --- a/test_cases/match/puya.log +++ b/test_cases/match/puya.log @@ -623,14 +623,14 @@ debug: Found 2 edge set/s for test_cases.match.contract.MyContract.match_bytes debug: Inserted match_address_block@0.ops[1]: 'store n#0 to l-stack (copy)' debug: Replaced match_address_block@0.ops[5]: 'load n#0' with 'load n#0 from l-stack (no copy)' debug: Found 2 edge set/s for test_cases.match.contract.MyContract.match_address -debug: Inserted match_attributes_block@0.ops[5]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced match_attributes_block@0.ops[8]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' -debug: Inserted match_attributes_block@0.ops[13]: 'store app_global_get_ex_did_exist%3#0 to l-stack (copy)' -debug: Replaced match_attributes_block@0.ops[16]: 'load app_global_get_ex_did_exist%3#0' with 'load app_global_get_ex_did_exist%3#0 from l-stack (no copy)' -debug: Inserted match_attributes_block@0.ops[15]: 'store app_global_get_ex_value%2#0 to l-stack (copy)' -debug: Replaced match_attributes_block@0.ops[20]: 'load app_global_get_ex_value%2#0' with 'load app_global_get_ex_value%2#0 from l-stack (no copy)' -debug: Inserted match_attributes_block@0.ops[7]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced match_attributes_block@0.ops[20]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted match_attributes_block@0.ops[5]: 'store case_one_exists%1#0 to l-stack (copy)' +debug: Replaced match_attributes_block@0.ops[8]: 'load case_one_exists%1#0' with 'load case_one_exists%1#0 from l-stack (no copy)' +debug: Inserted match_attributes_block@0.ops[13]: 'store case_two_exists%3#0 to l-stack (copy)' +debug: Replaced match_attributes_block@0.ops[16]: 'load case_two_exists%3#0' with 'load case_two_exists%3#0 from l-stack (no copy)' +debug: Inserted match_attributes_block@0.ops[15]: 'store case_two_value%2#0 to l-stack (copy)' +debug: Replaced match_attributes_block@0.ops[20]: 'load case_two_value%2#0' with 'load case_two_value%2#0 from l-stack (no copy)' +debug: Inserted match_attributes_block@0.ops[7]: 'store case_one_value%0#0 to l-stack (copy)' +debug: Replaced match_attributes_block@0.ops[20]: 'load case_one_value%0#0' with 'load case_one_value%0#0 from l-stack (no copy)' debug: Inserted match_attributes_block@0.ops[1]: 'store n#0 to l-stack (copy)' debug: Replaced match_attributes_block@0.ops[23]: 'load n#0' with 'load n#0 from l-stack (no copy)' debug: Found 2 edge set/s for test_cases.match.contract.MyContract.match_attributes diff --git a/test_cases/simplish/out/Simplish.approval.mir b/test_cases/simplish/out/Simplish.approval.mir index 2c4cfb46d4..5e6c79f12f 100644 --- a/test_cases/simplish/out/Simplish.approval.mir +++ b/test_cases/simplish/out/Simplish.approval.mir @@ -1,4 +1,4 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 @@ -7,478 +7,478 @@ main: int 0 dup byte "" - dupn 3 // allocate 6 to stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + dupn 3 // allocate 6 to stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | main_block@0: - txn ApplicationID // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} - // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_id%0#0 - bnz main_entrypoint@2 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | - // Implicit fall through to main_on_create@1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + txn ApplicationID // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} + // virtual: store app_id%0#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_id%0#0 + bnz main_entrypoint@2 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + // Implicit fall through to main_on_create@1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | main_on_create@1: - callsub __init__ // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | - // Implicit fall through to main_entrypoint@2 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + callsub __init__ // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + // Implicit fall through to main_entrypoint@2 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | main_entrypoint@2: - txn ApplicationID // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.application_id simplish/contract.py:31 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%1#0 Txn.application_id simplish/contract.py:31 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%1#0 if Txn.application_id == 0: simplish/contract.py:31 - bnz main_after_if_else@4 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.application_id == 0: simplish/contract.py:31 - // Implicit fall through to main_if_body@3 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.application_id == 0: simplish/contract.py:31 + txn ApplicationID // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.application_id simplish/contract.py:31 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%1#0 Txn.application_id simplish/contract.py:31 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%1#0 if Txn.application_id == 0: simplish/contract.py:31 + bnz main_after_if_else@4 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.application_id == 0: simplish/contract.py:31 + // Implicit fall through to main_if_body@3 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.application_id == 0: simplish/contract.py:31 main_if_body@3: - int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 1 True simplish/contract.py:32 - return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return True simplish/contract.py:32 + int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 1 True simplish/contract.py:32 + return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return True simplish/contract.py:32 main_after_if_else@4: - txn OnCompletion // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.on_completion simplish/contract.py:33 - dup // store oca#0 to l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,oca#0 oca = Txn.on_completion simplish/contract.py:33 - bury 2 // store oca#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 oca = Txn.on_completion simplish/contract.py:33 - txn Sender // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,{txn} Txn.sender simplish/contract.py:34 - bury 6 // store sender#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 sender = Txn.sender simplish/contract.py:34 - dup // load oca#0 from l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,oca#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - int UpdateApplication // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,oca#0,UpdateApplication OnCompleteAction.UpdateApplication simplish/contract.py:36 - == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,{==} oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - swap // store contains%3#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,oca#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - // virtual: load oca#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,oca#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - int DeleteApplication // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,oca#0,DeleteApplication OnCompleteAction.DeleteApplication simplish/contract.py:37 - == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,{==} oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - dup // store is_equal%4#0 to l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,is_equal%4#0,is_equal%4#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - bury 5 // store is_equal%4#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,is_equal%4#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - // virtual: load contains%3#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | is_equal%4#0,contains%3#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,is_equal%4#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - || // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {||} oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%5#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%5#0 if oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n): simplish/contract.py:35-38 - bz main_after_if_else@8 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n): simplish/contract.py:35-38 - // Implicit fall through to main_if_body@5 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n): simplish/contract.py:35-38 + txn OnCompletion // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.on_completion simplish/contract.py:33 + dup // store oca#0 to l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,oca#0 oca = Txn.on_completion simplish/contract.py:33 + bury 2 // store oca#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 oca = Txn.on_completion simplish/contract.py:33 + txn Sender // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,{txn} Txn.sender simplish/contract.py:34 + bury 6 // store sender#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 sender = Txn.sender simplish/contract.py:34 + dup // load oca#0 from l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,oca#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + int UpdateApplication // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,oca#0,UpdateApplication OnCompleteAction.UpdateApplication simplish/contract.py:36 + == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,{==} oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + swap // store contains%3#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,oca#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + // virtual: load oca#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,oca#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + int DeleteApplication // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,oca#0,DeleteApplication OnCompleteAction.DeleteApplication simplish/contract.py:37 + == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,{==} oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + dup // store is_equal%4#0 to l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,is_equal%4#0,is_equal%4#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + bury 5 // store is_equal%4#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,is_equal%4#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + // virtual: load contains%3#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | is_equal%4#0,contains%3#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + // virtual: load is_equal%4#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | contains%3#0,is_equal%4#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + || // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {||} oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%5#0 oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n) simplish/contract.py:35-38 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%5#0 if oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n): simplish/contract.py:35-38 + bz main_after_if_else@8 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n): simplish/contract.py:35-38 + // Implicit fall through to main_if_body@5 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca in (\nOnCompleteAction.UpdateApplication,\nOnCompleteAction.DeleteApplication,\n): simplish/contract.py:35-38 main_if_body@5: - dig 2 // load is_equal%4#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | is_equal%4#0 if oca == OnCompleteAction.DeleteApplication: simplish/contract.py:39 - bz main_after_if_else@7 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.DeleteApplication: simplish/contract.py:39 - // Implicit fall through to main_if_body@6 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.DeleteApplication: simplish/contract.py:39 + dig 2 // load is_equal%4#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | is_equal%4#0 if oca == OnCompleteAction.DeleteApplication: simplish/contract.py:39 + bz main_after_if_else@7 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.DeleteApplication: simplish/contract.py:39 + // Implicit fall through to main_if_body@6 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.DeleteApplication: simplish/contract.py:39 main_if_body@6: - int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0 self.counter simplish/contract.py:40 - byte "counter" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0,"counter" self.counter simplish/contract.py:40 - app_global_get_ex // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter simplish/contract.py:40 - // virtual: store app_global_get_ex_did_exist%8#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_did_exist%8#0,{app_global_get_ex}.0 self.counter simplish/contract.py:40 - // virtual: store app_global_get_ex_value%7#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0,app_global_get_ex_did_exist%8#0 self.counter simplish/contract.py:40 - // virtual: load app_global_get_ex_did_exist%8#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0,app_global_get_ex_did_exist%8#0 self.counter simplish/contract.py:40 - assert // check counter exists // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0 self.counter simplish/contract.py:40 - // virtual: load app_global_get_ex_value%7#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | app_global_get_ex_value%7#0 itoa(self.counter) simplish/contract.py:40 - callsub itoa // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {itoa} itoa(self.counter) simplish/contract.py:40 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%9#0 itoa(self.counter) simplish/contract.py:40 - byte "I was used " // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%9#0,"I was used " b"I was used " simplish/contract.py:40 - swap // load tmp%9#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "I was used ",tmp%9#0 Bytes(b"I was used ") + itoa(self.counter) simplish/contract.py:40 - concat // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {concat} Bytes(b"I was used ") + itoa(self.counter) simplish/contract.py:40 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%10#0 Bytes(b"I was used ") + itoa(self.counter) simplish/contract.py:40 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%10#0 Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died" simplish/contract.py:40 - byte " time(s) before I died" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%10#0," time(s) before I died" b" time(s) before I died" simplish/contract.py:40 - concat // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {concat} Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died" simplish/contract.py:40 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%11#0 Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died" simplish/contract.py:40 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%11#0 log(Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died") simplish/contract.py:40 - log // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | log(Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died") simplish/contract.py:40 - // Implicit fall through to main_after_if_else@7 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0 self.counter simplish/contract.py:40 + byte "counter" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0,"counter" self.counter simplish/contract.py:40 + app_global_get_ex // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter simplish/contract.py:40 + // virtual: store counter_exists%8#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | counter_exists%8#0,{app_global_get_ex}.0 self.counter simplish/contract.py:40 + // virtual: store counter_value%7#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | counter_value%7#0,counter_exists%8#0 self.counter simplish/contract.py:40 + // virtual: load counter_exists%8#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | counter_value%7#0,counter_exists%8#0 self.counter simplish/contract.py:40 + assert // check counter exists // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | counter_value%7#0 self.counter simplish/contract.py:40 + // virtual: load counter_value%7#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | counter_value%7#0 itoa(self.counter) simplish/contract.py:40 + callsub itoa // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {itoa} itoa(self.counter) simplish/contract.py:40 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%9#0 itoa(self.counter) simplish/contract.py:40 + byte "I was used " // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%9#0,"I was used " b"I was used " simplish/contract.py:40 + swap // load tmp%9#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "I was used ",tmp%9#0 Bytes(b"I was used ") + itoa(self.counter) simplish/contract.py:40 + concat // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {concat} Bytes(b"I was used ") + itoa(self.counter) simplish/contract.py:40 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%10#0 Bytes(b"I was used ") + itoa(self.counter) simplish/contract.py:40 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%10#0 Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died" simplish/contract.py:40 + byte " time(s) before I died" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%10#0," time(s) before I died" b" time(s) before I died" simplish/contract.py:40 + concat // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {concat} Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died" simplish/contract.py:40 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%11#0 Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died" simplish/contract.py:40 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%11#0 log(Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died") simplish/contract.py:40 + log // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | log(Bytes(b"I was used ") + itoa(self.counter) + b" time(s) before I died") simplish/contract.py:40 + // Implicit fall through to main_after_if_else@7 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | main_after_if_else@7: - global CreatorAddress // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {global} Global.creator_address simplish/contract.py:41 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%12#0 Global.creator_address simplish/contract.py:41 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%12#0 Global.creator_address == sender simplish/contract.py:41 - dig 5 // load sender#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%12#0,sender#0 Global.creator_address == sender simplish/contract.py:41 - == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {==} Global.creator_address == sender simplish/contract.py:41 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%13#0 Global.creator_address == sender simplish/contract.py:41 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%13#0 return Global.creator_address == sender simplish/contract.py:41 - return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return Global.creator_address == sender simplish/contract.py:41 + global CreatorAddress // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {global} Global.creator_address simplish/contract.py:41 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%12#0 Global.creator_address simplish/contract.py:41 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%12#0 Global.creator_address == sender simplish/contract.py:41 + dig 5 // load sender#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%12#0,sender#0 Global.creator_address == sender simplish/contract.py:41 + == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {==} Global.creator_address == sender simplish/contract.py:41 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%13#0 Global.creator_address == sender simplish/contract.py:41 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%13#0 return Global.creator_address == sender simplish/contract.py:41 + return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return Global.creator_address == sender simplish/contract.py:41 main_after_if_else@8: - dup // load oca#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 oca == OnCompleteAction.OptIn: simplish/contract.py:43 - int OptIn // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,OptIn OnCompleteAction.OptIn simplish/contract.py:43 - == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {==} oca == OnCompleteAction.OptIn: simplish/contract.py:43 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%14#0 oca == OnCompleteAction.OptIn: simplish/contract.py:43 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%14#0 if oca == OnCompleteAction.OptIn: simplish/contract.py:43 - bz main_after_if_else@12 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.OptIn: simplish/contract.py:43 - // Implicit fall through to main_if_body@9 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.OptIn: simplish/contract.py:43 + dup // load oca#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 oca == OnCompleteAction.OptIn: simplish/contract.py:43 + int OptIn // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,OptIn OnCompleteAction.OptIn simplish/contract.py:43 + == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {==} oca == OnCompleteAction.OptIn: simplish/contract.py:43 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%14#0 oca == OnCompleteAction.OptIn: simplish/contract.py:43 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%14#0 if oca == OnCompleteAction.OptIn: simplish/contract.py:43 + bz main_after_if_else@12 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.OptIn: simplish/contract.py:43 + // Implicit fall through to main_if_body@9 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca == OnCompleteAction.OptIn: simplish/contract.py:43 main_if_body@9: - txn NumAppArgs // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.num_app_args simplish/contract.py:44 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%15#0 Txn.num_app_args simplish/contract.py:44 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%15#0 Txn.num_app_args > 0: simplish/contract.py:44 - int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%15#0,0 0 simplish/contract.py:44 - > // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {>} Txn.num_app_args > 0: simplish/contract.py:44 - // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%16#0 Txn.num_app_args > 0: simplish/contract.py:44 - // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%16#0 if Txn.num_app_args > 0: simplish/contract.py:44 - bz main_after_if_else@11 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.num_app_args > 0: simplish/contract.py:44 - // Implicit fall through to main_if_body@10 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.num_app_args > 0: simplish/contract.py:44 + txn NumAppArgs // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.num_app_args simplish/contract.py:44 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%15#0 Txn.num_app_args simplish/contract.py:44 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%15#0 Txn.num_app_args > 0: simplish/contract.py:44 + int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%15#0,0 0 simplish/contract.py:44 + > // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {>} Txn.num_app_args > 0: simplish/contract.py:44 + // virtual: store tmp%16#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%16#0 Txn.num_app_args > 0: simplish/contract.py:44 + // virtual: load tmp%16#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%16#0 if Txn.num_app_args > 0: simplish/contract.py:44 + bz main_after_if_else@11 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.num_app_args > 0: simplish/contract.py:44 + // Implicit fall through to main_if_body@10 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if Txn.num_app_args > 0: simplish/contract.py:44 main_if_body@10: - txna ApplicationArgs 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txna} Txn.application_args(0) simplish/contract.py:45 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%17#0 Txn.application_args(0) simplish/contract.py:45 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%17#0 self.set_sender_nickname(Txn.application_args(0)) simplish/contract.py:45 - callsub set_sender_nickname // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | self.set_sender_nickname(Txn.application_args(0)) simplish/contract.py:45 - // Implicit fall through to main_after_if_else@11 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + txna ApplicationArgs 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txna} Txn.application_args(0) simplish/contract.py:45 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%17#0 Txn.application_args(0) simplish/contract.py:45 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%17#0 self.set_sender_nickname(Txn.application_args(0)) simplish/contract.py:45 + callsub set_sender_nickname // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | self.set_sender_nickname(Txn.application_args(0)) simplish/contract.py:45 + // Implicit fall through to main_after_if_else@11 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | main_after_if_else@11: - int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 1 True simplish/contract.py:46 - return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return True simplish/contract.py:46 + int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 1 True simplish/contract.py:46 + return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return True simplish/contract.py:46 main_after_if_else@12: - dup // load oca#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 oca != OnCompleteAction.NoOp: simplish/contract.py:47 - int NoOp // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,NoOp OnCompleteAction.NoOp simplish/contract.py:47 - != // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {!=} oca != OnCompleteAction.NoOp: simplish/contract.py:47 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%18#0 oca != OnCompleteAction.NoOp: simplish/contract.py:47 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%18#0 if oca != OnCompleteAction.NoOp: simplish/contract.py:47 - bz main_after_if_else@14 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca != OnCompleteAction.NoOp: simplish/contract.py:47 - // Implicit fall through to main_if_body@13 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca != OnCompleteAction.NoOp: simplish/contract.py:47 + dup // load oca#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0 oca != OnCompleteAction.NoOp: simplish/contract.py:47 + int NoOp // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | oca#0,NoOp OnCompleteAction.NoOp simplish/contract.py:47 + != // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {!=} oca != OnCompleteAction.NoOp: simplish/contract.py:47 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%18#0 oca != OnCompleteAction.NoOp: simplish/contract.py:47 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%18#0 if oca != OnCompleteAction.NoOp: simplish/contract.py:47 + bz main_after_if_else@14 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca != OnCompleteAction.NoOp: simplish/contract.py:47 + // Implicit fall through to main_if_body@13 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if oca != OnCompleteAction.NoOp: simplish/contract.py:47 main_if_body@13: - int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0 False simplish/contract.py:48 - return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return False simplish/contract.py:48 + int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0 False simplish/contract.py:48 + return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return False simplish/contract.py:48 main_after_if_else@14: - txn NumAppArgs // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.num_app_args simplish/contract.py:50 - dup // store num_app_args#0 to l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0,num_app_args#0 num_app_args := Txn.num_app_args simplish/contract.py:50 - bury 3 // store num_app_args#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0 num_app_args := Txn.num_app_args simplish/contract.py:50 - // virtual: load num_app_args#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0 num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 - int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0,0 0 simplish/contract.py:50 - > // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {>} num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%19#0 num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%19#0 if (num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 - bz main_else_body@16 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if (num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 - // Implicit fall through to main_if_body@15 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if (num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 + txn NumAppArgs // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.num_app_args simplish/contract.py:50 + dup // store num_app_args#0 to l-stack (copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0,num_app_args#0 num_app_args := Txn.num_app_args simplish/contract.py:50 + bury 3 // store num_app_args#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0 num_app_args := Txn.num_app_args simplish/contract.py:50 + // virtual: load num_app_args#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0 num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 + int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | num_app_args#0,0 0 simplish/contract.py:50 + > // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {>} num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%19#0 num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%19#0 if (num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 + bz main_else_body@16 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if (num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 + // Implicit fall through to main_if_body@15 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | if (num_app_args := Txn.num_app_args) > 0: simplish/contract.py:50 main_if_body@15: - txna ApplicationArgs 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txna} Txn.application_args(0) simplish/contract.py:51 - // virtual: store method_name#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | method_name#0 method_name = Txn.application_args(0) simplish/contract.py:51 - // virtual: load method_name#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | method_name#0 self.call(method_name, num_app_args) simplish/contract.py:52 - dig 2 // load num_app_args#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | method_name#0,num_app_args#0 self.call(method_name, num_app_args) simplish/contract.py:52 - callsub call // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {call}.0,{call}.1 self.call(method_name, num_app_args) simplish/contract.py:52 - swap // store result#0 to x-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | {call}.0 self.call(method_name, num_app_args) simplish/contract.py:52 - bury 7 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | self.call(method_name, num_app_args) simplish/contract.py:52 - b main_after_if_else@23 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result#0 + txna ApplicationArgs 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txna} Txn.application_args(0) simplish/contract.py:51 + // virtual: store method_name#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | method_name#0 method_name = Txn.application_args(0) simplish/contract.py:51 + // virtual: load method_name#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | method_name#0 self.call(method_name, num_app_args) simplish/contract.py:52 + dig 2 // load num_app_args#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | method_name#0,num_app_args#0 self.call(method_name, num_app_args) simplish/contract.py:52 + callsub call // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {call}.0,{call}.1 self.call(method_name, num_app_args) simplish/contract.py:52 + swap // store result#0 to x-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | {call}.0 self.call(method_name, num_app_args) simplish/contract.py:52 + bury 7 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | self.call(method_name, num_app_args) simplish/contract.py:52 + b main_after_if_else@23 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result#0 main_else_body@16: - txn NumAssets // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.num_assets simplish/contract.py:53 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%22#0 Txn.num_assets simplish/contract.py:53 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%22#0 Txn.num_assets == 1: simplish/contract.py:53 - int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%22#0,1 1 simplish/contract.py:53 - == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {==} Txn.num_assets == 1: simplish/contract.py:53 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%23#0 Txn.num_assets == 1: simplish/contract.py:53 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%23#0 elif Txn.num_assets == 1: simplish/contract.py:53 - bz main_else_body@21 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | elif Txn.num_assets == 1: simplish/contract.py:53 - // Implicit fall through to main_if_body@17 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | elif Txn.num_assets == 1: simplish/contract.py:53 + txn NumAssets // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {txn} Txn.num_assets simplish/contract.py:53 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%22#0 Txn.num_assets simplish/contract.py:53 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%22#0 Txn.num_assets == 1: simplish/contract.py:53 + int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%22#0,1 1 simplish/contract.py:53 + == // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {==} Txn.num_assets == 1: simplish/contract.py:53 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%23#0 Txn.num_assets == 1: simplish/contract.py:53 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%23#0 elif Txn.num_assets == 1: simplish/contract.py:53 + bz main_else_body@21 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | elif Txn.num_assets == 1: simplish/contract.py:53 + // Implicit fall through to main_if_body@17 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | elif Txn.num_assets == 1: simplish/contract.py:53 main_if_body@17: - dig 4 // load sender#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | sender#0 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 - int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | sender#0,0 0 simplish/contract.py:54 - asset_holding_get AssetBalance // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {asset_holding_get}.0,{asset_holding_get}.1 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 - swap // store asset_exists#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_exists#0,{asset_holding_get}.0 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 - bury 5 // store asset_balance#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_exists#0 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 - // virtual: load asset_exists#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_exists#0 not asset_exists simplish/contract.py:55 - bnz main_else_body@19 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | not asset_exists simplish/contract.py:55 - // Implicit fall through to main_if_body@18 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | not asset_exists simplish/contract.py:55 + dig 4 // load sender#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | sender#0 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 + int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | sender#0,0 0 simplish/contract.py:54 + asset_holding_get AssetBalance // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {asset_holding_get}.0,{asset_holding_get}.1 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 + swap // store asset_exists#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_exists#0,{asset_holding_get}.0 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 + bury 5 // store asset_balance#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_exists#0 AssetHoldingGet.asset_balance(sender, 0) simplish/contract.py:54 + // virtual: load asset_exists#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_exists#0 not asset_exists simplish/contract.py:55 + bnz main_else_body@19 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | not asset_exists simplish/contract.py:55 + // Implicit fall through to main_if_body@18 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | not asset_exists simplish/contract.py:55 main_if_body@18: - byte "You do not have any of the asset" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "You do not have any of the asset" b"You do not have any of the asset" simplish/contract.py:56 - bury 6 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | msg = Bytes(b"You do not have any of the asset") simplish/contract.py:56 - b main_after_if_else@20 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + byte "You do not have any of the asset" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "You do not have any of the asset" b"You do not have any of the asset" simplish/contract.py:56 + bury 6 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | msg = Bytes(b"You do not have any of the asset") simplish/contract.py:56 + b main_after_if_else@20 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | main_else_body@19: - dig 3 // load asset_balance#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_balance#0 itoa(asset_balance) simplish/contract.py:58 - callsub itoa // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {itoa} itoa(asset_balance) simplish/contract.py:58 - // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%26#0 itoa(asset_balance) simplish/contract.py:58 - byte "You have asset balance: " // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%26#0,"You have asset balance: " b"You have asset balance: " simplish/contract.py:58 - swap // load tmp%26#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "You have asset balance: ",tmp%26#0 msg = Bytes(b"You have asset balance: ") + itoa(asset_balance) simplish/contract.py:58 - concat // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {concat} Bytes(b"You have asset balance: ") + itoa(asset_balance) simplish/contract.py:58 - bury 6 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | msg = Bytes(b"You have asset balance: ") + itoa(asset_balance) simplish/contract.py:58 - // Implicit fall through to main_after_if_else@20 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | + dig 3 // load asset_balance#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | asset_balance#0 itoa(asset_balance) simplish/contract.py:58 + callsub itoa // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {itoa} itoa(asset_balance) simplish/contract.py:58 + // virtual: store tmp%26#0 to l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%26#0 itoa(asset_balance) simplish/contract.py:58 + byte "You have asset balance: " // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | tmp%26#0,"You have asset balance: " b"You have asset balance: " simplish/contract.py:58 + swap // load tmp%26#0 from l-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "You have asset balance: ",tmp%26#0 msg = Bytes(b"You have asset balance: ") + itoa(asset_balance) simplish/contract.py:58 + concat // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | {concat} Bytes(b"You have asset balance: ") + itoa(asset_balance) simplish/contract.py:58 + bury 6 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | msg = Bytes(b"You have asset balance: ") + itoa(asset_balance) simplish/contract.py:58 + // Implicit fall through to main_after_if_else@20 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | main_after_if_else@20: - int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 1 True simplish/contract.py:59 - // virtual: store result#0 to x-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result = True simplish/contract.py:59 - b main_after_if_else@23 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result#0 + int 1 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 1 True simplish/contract.py:59 + // virtual: store result#0 to x-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result = True simplish/contract.py:59 + b main_after_if_else@23 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result#0 main_else_body@21: - byte "not enough app args or foreign assets" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "not enough app args or foreign assets" b"not enough app args or foreign assets" simplish/contract.py:61 - bury 6 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | msg = Bytes(b"not enough app args or foreign assets") simplish/contract.py:61 - int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0 False simplish/contract.py:62 - // virtual: store result#0 to x-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result = False simplish/contract.py:62 - // Implicit fall through to main_after_if_else@23 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result#0 + byte "not enough app args or foreign assets" // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | "not enough app args or foreign assets" b"not enough app args or foreign assets" simplish/contract.py:61 + bury 6 // store msg#0 to f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | msg = Bytes(b"not enough app args or foreign assets") simplish/contract.py:61 + int 0 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | 0 False simplish/contract.py:62 + // virtual: store result#0 to x-stack (no copy) (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result = False simplish/contract.py:62 + // Implicit fall through to main_after_if_else@23 // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | result#0 main_after_if_else@23: - dig 6 // load msg#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | msg#0 result#0 log(msg) simplish/contract.py:63 - log // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | log(msg) simplish/contract.py:63 - callsub increment_counter // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | self.increment_counter() simplish/contract.py:64 - // virtual: load result#0 from x-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | result#0 return result simplish/contract.py:65 - return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return result simplish/contract.py:65 + dig 6 // load msg#0 from f-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | msg#0 result#0 log(msg) simplish/contract.py:63 + log // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | log(msg) simplish/contract.py:63 + callsub increment_counter // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | (𝕏) result#0 | self.increment_counter() simplish/contract.py:64 + // virtual: load result#0 from x-stack (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | result#0 return result simplish/contract.py:65 + return // (𝕗) msg#0,sender#0,asset_balance#0,is_equal%4#0,num_app_args#0,oca#0 | return result simplish/contract.py:65 // test_cases.simplish.contract.itoa(i: uint64) -> bytes: itoa: - proto 1 1 // (𝕡) i#0 | @subroutine\ndef itoa(i: UInt64) -> Bytes: simplish/contract.py:117-118 + proto 1 1 // (𝕡) i#0 | @subroutine\ndef itoa(i: UInt64) -> Bytes: simplish/contract.py:117-118 itoa_block@0: - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i < radix: simplish/contract.py:122 - int 10 // (𝕡) i#0 | i#0,10 digits.length simplish/contract.py:121 - < // (𝕡) i#0 | {<} i < radix: simplish/contract.py:122 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) i#0 | tmp%0#0 i < radix: simplish/contract.py:122 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) i#0 | tmp%0#0 if i < radix: simplish/contract.py:122 - bz itoa_after_if_else@2 // (𝕡) i#0 | if i < radix: simplish/contract.py:122 - // Implicit fall through to itoa_if_body@1 // (𝕡) i#0 | if i < radix: simplish/contract.py:122 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i < radix: simplish/contract.py:122 + int 10 // (𝕡) i#0 | i#0,10 digits.length simplish/contract.py:121 + < // (𝕡) i#0 | {<} i < radix: simplish/contract.py:122 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) i#0 | tmp%0#0 i < radix: simplish/contract.py:122 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) i#0 | tmp%0#0 if i < radix: simplish/contract.py:122 + bz itoa_after_if_else@2 // (𝕡) i#0 | if i < radix: simplish/contract.py:122 + // Implicit fall through to itoa_if_body@1 // (𝕡) i#0 | if i < radix: simplish/contract.py:122 itoa_if_body@1: - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 digits[i] simplish/contract.py:123 - int 1 // (𝕡) i#0 | i#0,1 digits[i] simplish/contract.py:123 - + // (𝕡) i#0 | {+} digits[i] simplish/contract.py:123 - // virtual: store index_plus_1%1#0 to l-stack (no copy) (𝕡) i#0 | index_plus_1%1#0 digits[i] simplish/contract.py:123 - byte "0123456789" // (𝕡) i#0 | index_plus_1%1#0,"0123456789" b"0123456789" simplish/contract.py:120 - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | index_plus_1%1#0,"0123456789",i#0 digits[i] simplish/contract.py:123 - uncover 2 // load index_plus_1%1#0 from l-stack (no copy) (𝕡) i#0 | "0123456789",i#0,index_plus_1%1#0 digits[i] simplish/contract.py:123 - substring3 // (𝕡) i#0 | {substring3} digits[i] simplish/contract.py:123 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) i#0 | tmp%2#0 digits[i] simplish/contract.py:123 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) i#0 | tmp%2#0 return digits[i] simplish/contract.py:123 - retsub // tmp%2#0 return digits[i] simplish/contract.py:123 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 digits[i] simplish/contract.py:123 + int 1 // (𝕡) i#0 | i#0,1 digits[i] simplish/contract.py:123 + + // (𝕡) i#0 | {+} digits[i] simplish/contract.py:123 + // virtual: store index_plus_1%1#0 to l-stack (no copy) (𝕡) i#0 | index_plus_1%1#0 digits[i] simplish/contract.py:123 + byte "0123456789" // (𝕡) i#0 | index_plus_1%1#0,"0123456789" b"0123456789" simplish/contract.py:120 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | index_plus_1%1#0,"0123456789",i#0 digits[i] simplish/contract.py:123 + uncover 2 // load index_plus_1%1#0 from l-stack (no copy) (𝕡) i#0 | "0123456789",i#0,index_plus_1%1#0 digits[i] simplish/contract.py:123 + substring3 // (𝕡) i#0 | {substring3} digits[i] simplish/contract.py:123 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) i#0 | tmp%2#0 digits[i] simplish/contract.py:123 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) i#0 | tmp%2#0 return digits[i] simplish/contract.py:123 + retsub // tmp%2#0 return digits[i] simplish/contract.py:123 itoa_after_if_else@2: - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i // radix simplish/contract.py:124 - int 10 // (𝕡) i#0 | i#0,10 digits.length simplish/contract.py:121 - / // (𝕡) i#0 | {/} i // radix simplish/contract.py:124 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) i#0 | tmp%3#0 i // radix simplish/contract.py:124 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) i#0 | tmp%3#0 itoa(i // radix) simplish/contract.py:124 - callsub itoa // (𝕡) i#0 | {itoa} itoa(i // radix) simplish/contract.py:124 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0 itoa(i // radix) simplish/contract.py:124 - frame_dig -1 // load i#0 from parameters (𝕡) i#0 | tmp%4#0,i#0 i % radix simplish/contract.py:124 - int 10 // (𝕡) i#0 | tmp%4#0,i#0,10 digits.length simplish/contract.py:121 - % // (𝕡) i#0 | tmp%4#0,{%} i % radix simplish/contract.py:124 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0 i % radix simplish/contract.py:124 - dup // load tmp%5#0 from l-stack (copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0 digits[i % radix] simplish/contract.py:124 - int 1 // (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0,1 digits[i % radix] simplish/contract.py:124 - + // (𝕡) i#0 | tmp%4#0,tmp%5#0,{+} digits[i % radix] simplish/contract.py:124 - // virtual: store index_plus_1%6#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0 digits[i % radix] simplish/contract.py:124 - byte "0123456789" // (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0,"0123456789" b"0123456789" simplish/contract.py:120 - uncover 2 // load tmp%5#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,index_plus_1%6#0,"0123456789",tmp%5#0 digits[i % radix] simplish/contract.py:124 - uncover 2 // load index_plus_1%6#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,"0123456789",tmp%5#0,index_plus_1%6#0 digits[i % radix] simplish/contract.py:124 - substring3 // (𝕡) i#0 | tmp%4#0,{substring3} digits[i % radix] simplish/contract.py:124 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 digits[i % radix] simplish/contract.py:124 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) i#0 | tmp%7#0,tmp%4#0 itoa(i // radix) + digits[i % radix] simplish/contract.py:124 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 itoa(i // radix) + digits[i % radix] simplish/contract.py:124 - concat // (𝕡) i#0 | {concat} itoa(i // radix) + digits[i % radix] simplish/contract.py:124 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) i#0 | tmp%8#0 itoa(i // radix) + digits[i % radix] simplish/contract.py:124 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) i#0 | tmp%8#0 return itoa(i // radix) + digits[i % radix] simplish/contract.py:124 - retsub // tmp%8#0 return itoa(i // radix) + digits[i % radix] simplish/contract.py:124 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | i#0 i // radix simplish/contract.py:124 + int 10 // (𝕡) i#0 | i#0,10 digits.length simplish/contract.py:121 + / // (𝕡) i#0 | {/} i // radix simplish/contract.py:124 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) i#0 | tmp%3#0 i // radix simplish/contract.py:124 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) i#0 | tmp%3#0 itoa(i // radix) simplish/contract.py:124 + callsub itoa // (𝕡) i#0 | {itoa} itoa(i // radix) simplish/contract.py:124 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0 itoa(i // radix) simplish/contract.py:124 + frame_dig -1 // load i#0 from parameters (𝕡) i#0 | tmp%4#0,i#0 i % radix simplish/contract.py:124 + int 10 // (𝕡) i#0 | tmp%4#0,i#0,10 digits.length simplish/contract.py:121 + % // (𝕡) i#0 | tmp%4#0,{%} i % radix simplish/contract.py:124 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0 i % radix simplish/contract.py:124 + dup // load tmp%5#0 from l-stack (copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0 digits[i % radix] simplish/contract.py:124 + int 1 // (𝕡) i#0 | tmp%4#0,tmp%5#0,tmp%5#0,1 digits[i % radix] simplish/contract.py:124 + + // (𝕡) i#0 | tmp%4#0,tmp%5#0,{+} digits[i % radix] simplish/contract.py:124 + // virtual: store index_plus_1%6#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0 digits[i % radix] simplish/contract.py:124 + byte "0123456789" // (𝕡) i#0 | tmp%4#0,tmp%5#0,index_plus_1%6#0,"0123456789" b"0123456789" simplish/contract.py:120 + uncover 2 // load tmp%5#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,index_plus_1%6#0,"0123456789",tmp%5#0 digits[i % radix] simplish/contract.py:124 + uncover 2 // load index_plus_1%6#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,"0123456789",tmp%5#0,index_plus_1%6#0 digits[i % radix] simplish/contract.py:124 + substring3 // (𝕡) i#0 | tmp%4#0,{substring3} digits[i % radix] simplish/contract.py:124 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 digits[i % radix] simplish/contract.py:124 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) i#0 | tmp%7#0,tmp%4#0 itoa(i // radix) + digits[i % radix] simplish/contract.py:124 + // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) i#0 | tmp%4#0,tmp%7#0 itoa(i // radix) + digits[i % radix] simplish/contract.py:124 + concat // (𝕡) i#0 | {concat} itoa(i // radix) + digits[i % radix] simplish/contract.py:124 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) i#0 | tmp%8#0 itoa(i // radix) + digits[i % radix] simplish/contract.py:124 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) i#0 | tmp%8#0 return itoa(i // radix) + digits[i % radix] simplish/contract.py:124 + retsub // tmp%8#0 return itoa(i // radix) + digits[i % radix] simplish/contract.py:124 // test_cases.simplish.base_class.CallCounter.set_sender_nickname(nickname: bytes) -> void: set_sender_nickname: - proto 1 0 // (𝕡) nickname#0 | @subroutine\ndef set_sender_nickname(self, nickname: Bytes) -> None: simplish/base_class.py:15-16 + proto 1 0 // (𝕡) nickname#0 | @subroutine\ndef set_sender_nickname(self, nickname: Bytes) -> None: simplish/base_class.py:15-16 set_sender_nickname_block@0: - int 0 // (𝕡) nickname#0 | 0 0 simplish/base_class.py:17 - byte "name" // (𝕡) nickname#0 | 0,"name" self.name[0] simplish/base_class.py:17 - frame_dig -1 // load nickname#0 from parameters (𝕡) nickname#0 | 0,"name",nickname#0 self.name[0] = nickname simplish/base_class.py:17 - app_local_put // (𝕡) nickname#0 | self.name[0] = nickname simplish/base_class.py:17 + int 0 // (𝕡) nickname#0 | 0 0 simplish/base_class.py:17 + byte "name" // (𝕡) nickname#0 | 0,"name" self.name[0] simplish/base_class.py:17 + frame_dig -1 // load nickname#0 from parameters (𝕡) nickname#0 | 0,"name",nickname#0 self.name[0] = nickname simplish/base_class.py:17 + app_local_put // (𝕡) nickname#0 | self.name[0] = nickname simplish/base_class.py:17 retsub // // test_cases.simplish.contract.Simplish.call(method_name: bytes, num_app_args: uint64) -> bytes, uint64: call: - proto 2 2 // (𝕡) method_name#0,num_app_args#0 | @subroutine\ndef call(self, method_name: Bytes, num_app_args: UInt64) -> tuple[Bytes, bool]: simplish/contract.py:70-71 - int 0 // allocate 1 to stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | + proto 2 2 // (𝕡) method_name#0,num_app_args#0 | @subroutine\ndef call(self, method_name: Bytes, num_app_args: UInt64) -> tuple[Bytes, bool]: simplish/contract.py:70-71 + int 0 // allocate 1 to stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | call_block@0: - frame_dig -1 // load num_app_args#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | num_app_args#0 num_app_args == 2, "insufficient arguments" simplish/contract.py:72 - int 2 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | num_app_args#0,2 2 simplish/contract.py:72 - == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | {==} num_app_args == 2, "insufficient arguments" simplish/contract.py:72 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%0#0 num_app_args == 2, "insufficient arguments" simplish/contract.py:72 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%0#0 assert num_app_args == 2, "insufficient arguments" simplish/contract.py:72 - assert // insufficient arguments // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | assert num_app_args == 2, "insufficient arguments" simplish/contract.py:72 - txna ApplicationArgs 1 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | {txna} Txn.application_args(1) simplish/contract.py:73 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%1#0 Txn.application_args(1) simplish/contract.py:73 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%1#0 radius = btoi(Txn.application_args(1)) simplish/contract.py:73 - btoi // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | {btoi} btoi(Txn.application_args(1)) simplish/contract.py:73 - // virtual: store radius#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0 | radius = btoi(Txn.application_args(1)) simplish/contract.py:73 - int 1 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0 | 1 True simplish/contract.py:75 - // virtual: store status#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | status = True simplish/contract.py:75 - frame_dig -2 // load method_name#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0 method_name == b"circle_area": simplish/contract.py:76 - byte "circle_area" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0,"circle_area" b"circle_area" simplish/contract.py:76 - == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {==} method_name == b"circle_area": simplish/contract.py:76 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%2#0 method_name == b"circle_area": simplish/contract.py:76 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%2#0 if method_name == b"circle_area": simplish/contract.py:76 - bz call_else_body@2 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | if method_name == b"circle_area": simplish/contract.py:76 - // Implicit fall through to call_if_body@1 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | if method_name == b"circle_area": simplish/contract.py:76 + frame_dig -1 // load num_app_args#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | num_app_args#0 num_app_args == 2, "insufficient arguments" simplish/contract.py:72 + int 2 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | num_app_args#0,2 2 simplish/contract.py:72 + == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | {==} num_app_args == 2, "insufficient arguments" simplish/contract.py:72 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%0#0 num_app_args == 2, "insufficient arguments" simplish/contract.py:72 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%0#0 assert num_app_args == 2, "insufficient arguments" simplish/contract.py:72 + assert // insufficient arguments // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | assert num_app_args == 2, "insufficient arguments" simplish/contract.py:72 + txna ApplicationArgs 1 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | {txna} Txn.application_args(1) simplish/contract.py:73 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%1#0 Txn.application_args(1) simplish/contract.py:73 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | tmp%1#0 radius = btoi(Txn.application_args(1)) simplish/contract.py:73 + btoi // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0 | {btoi} btoi(Txn.application_args(1)) simplish/contract.py:73 + // virtual: store radius#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0 | radius = btoi(Txn.application_args(1)) simplish/contract.py:73 + int 1 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0 | 1 True simplish/contract.py:75 + // virtual: store status#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | status = True simplish/contract.py:75 + frame_dig -2 // load method_name#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0 method_name == b"circle_area": simplish/contract.py:76 + byte "circle_area" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0,"circle_area" b"circle_area" simplish/contract.py:76 + == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {==} method_name == b"circle_area": simplish/contract.py:76 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%2#0 method_name == b"circle_area": simplish/contract.py:76 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%2#0 if method_name == b"circle_area": simplish/contract.py:76 + bz call_else_body@2 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | if method_name == b"circle_area": simplish/contract.py:76 + // Implicit fall through to call_if_body@1 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | if method_name == b"circle_area": simplish/contract.py:76 call_if_body@1: - frame_dig 1 // load radius#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0 area = circle_area(radius) simplish/contract.py:77 - callsub circle_area // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {circle_area} circle_area(radius) simplish/contract.py:77 - // virtual: store area#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0 area = circle_area(radius) simplish/contract.py:77 - // virtual: load area#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0 result = itoa(area) simplish/contract.py:78 - callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {itoa} itoa(area) simplish/contract.py:78 - frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = itoa(area) simplish/contract.py:78 - b call_after_if_else@9 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | + frame_dig 1 // load radius#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0 area = circle_area(radius) simplish/contract.py:77 + callsub circle_area // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {circle_area} circle_area(radius) simplish/contract.py:77 + // virtual: store area#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0 area = circle_area(radius) simplish/contract.py:77 + // virtual: load area#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0 result = itoa(area) simplish/contract.py:78 + callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {itoa} itoa(area) simplish/contract.py:78 + frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = itoa(area) simplish/contract.py:78 + b call_after_if_else@9 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | call_else_body@2: - frame_dig -2 // load method_name#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0 method_name == b"circle_circumference": simplish/contract.py:79 - byte "circle_circumference" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0,"circle_circumference" b"circle_circumference" simplish/contract.py:79 - == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {==} method_name == b"circle_circumference": simplish/contract.py:79 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%3#0 method_name == b"circle_circumference": simplish/contract.py:79 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%3#0 elif method_name == b"circle_circumference": simplish/contract.py:79 - bz call_else_body@4 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_circumference": simplish/contract.py:79 - // Implicit fall through to call_if_body@3 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_circumference": simplish/contract.py:79 + frame_dig -2 // load method_name#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0 method_name == b"circle_circumference": simplish/contract.py:79 + byte "circle_circumference" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0,"circle_circumference" b"circle_circumference" simplish/contract.py:79 + == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {==} method_name == b"circle_circumference": simplish/contract.py:79 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%3#0 method_name == b"circle_circumference": simplish/contract.py:79 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%3#0 elif method_name == b"circle_circumference": simplish/contract.py:79 + bz call_else_body@4 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_circumference": simplish/contract.py:79 + // Implicit fall through to call_if_body@3 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_circumference": simplish/contract.py:79 call_if_body@3: - frame_dig 1 // load radius#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0 circumference = circle_circumference(radius) simplish/contract.py:80 - callsub circle_circumference // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {circle_circumference} circle_circumference(radius) simplish/contract.py:80 - // virtual: store circumference#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0 circumference = circle_circumference(radius) simplish/contract.py:80 - // virtual: load circumference#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0 result = itoa(circumference) simplish/contract.py:81 - callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {itoa} itoa(circumference) simplish/contract.py:81 - frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = itoa(circumference) simplish/contract.py:81 - b call_after_if_else@8 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | + frame_dig 1 // load radius#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0 circumference = circle_circumference(radius) simplish/contract.py:80 + callsub circle_circumference // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {circle_circumference} circle_circumference(radius) simplish/contract.py:80 + // virtual: store circumference#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0 circumference = circle_circumference(radius) simplish/contract.py:80 + // virtual: load circumference#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0 result = itoa(circumference) simplish/contract.py:81 + callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {itoa} itoa(circumference) simplish/contract.py:81 + frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = itoa(circumference) simplish/contract.py:81 + b call_after_if_else@8 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | call_else_body@4: - frame_dig -2 // load method_name#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0 method_name == b"circle_report": simplish/contract.py:82 - byte "circle_report" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0,"circle_report" b"circle_report" simplish/contract.py:82 - == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {==} method_name == b"circle_report": simplish/contract.py:82 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%4#0 method_name == b"circle_report": simplish/contract.py:82 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%4#0 elif method_name == b"circle_report": simplish/contract.py:82 - bz call_else_body@6 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_report": simplish/contract.py:82 - // Implicit fall through to call_if_body@5 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_report": simplish/contract.py:82 + frame_dig -2 // load method_name#0 from parameters (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0 method_name == b"circle_report": simplish/contract.py:82 + byte "circle_report" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | method_name#0,"circle_report" b"circle_report" simplish/contract.py:82 + == // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {==} method_name == b"circle_report": simplish/contract.py:82 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%4#0 method_name == b"circle_report": simplish/contract.py:82 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%4#0 elif method_name == b"circle_report": simplish/contract.py:82 + bz call_else_body@6 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_report": simplish/contract.py:82 + // Implicit fall through to call_if_body@5 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | elif method_name == b"circle_report": simplish/contract.py:82 call_if_body@5: - frame_dig 1 // load radius#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0 circle_area(radius) simplish/contract.py:83 - dup // store radius#0 to l-stack (copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0,radius#0 circle_area(radius) simplish/contract.py:83 - callsub circle_area // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0,{circle_area} circle_area(radius) simplish/contract.py:83 - swap // store area#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0,radius#0 circle_area(radius) simplish/contract.py:83 - dup // load radius#0 from l-stack (copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0,radius#0,radius#0 circle_circumference(radius) simplish/contract.py:83 - callsub circle_circumference // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0,radius#0,{circle_circumference} circle_circumference(radius) simplish/contract.py:83 - cover 2 // store circumference#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,radius#0 circle_circumference(radius) simplish/contract.py:83 - // virtual: load radius#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,radius#0 itoa(radius) simplish/contract.py:86 - callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,{itoa} itoa(radius) simplish/contract.py:86 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%7#0 itoa(radius) simplish/contract.py:86 - byte "Approximate area and circumference of circle with radius " // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%7#0,"Approximate area and circumference of circle with radius " b"Approximate area and circumference of circle with radius " simplish/contract.py:85 - swap // load tmp%7#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,"Approximate area and circumference of circle with radius ",tmp%7#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius) simplish/contract.py:85-86 - concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius) simplish/contract.py:85-86 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%8#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius) simplish/contract.py:85-86 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%8#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = " simplish/contract.py:85-87 - byte " = " // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%8#0," = " b" = " simplish/contract.py:87 - concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = " simplish/contract.py:85-87 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%9#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = " simplish/contract.py:85-87 - swap // load area#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,area#0 itoa(area) simplish/contract.py:88 - callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,{itoa} itoa(area) simplish/contract.py:88 - // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,tmp%10#0 itoa(area) simplish/contract.py:88 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%10#0,tmp%9#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,tmp%10#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 - concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%11#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%11#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-89 - byte ", " // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%11#0,", " b", " simplish/contract.py:89 - concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-89 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%12#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-89 - swap // load circumference#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,circumference#0 itoa(circumference) simplish/contract.py:90 - callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,{itoa} itoa(circumference) simplish/contract.py:90 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,tmp%13#0 itoa(circumference) simplish/contract.py:90 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%13#0,tmp%12#0 result = (\nBytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n... simplish/contract.py:84-91 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,tmp%13#0 result = (\nBytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n... simplish/contract.py:84-91 - concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-90 - frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = (\nBytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n... simplish/contract.py:84-91 - b call_after_if_else@8 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | + frame_dig 1 // load radius#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0 circle_area(radius) simplish/contract.py:83 + dup // store radius#0 to l-stack (copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0,radius#0 circle_area(radius) simplish/contract.py:83 + callsub circle_area // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | radius#0,{circle_area} circle_area(radius) simplish/contract.py:83 + swap // store area#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0,radius#0 circle_area(radius) simplish/contract.py:83 + dup // load radius#0 from l-stack (copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0,radius#0,radius#0 circle_circumference(radius) simplish/contract.py:83 + callsub circle_circumference // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | area#0,radius#0,{circle_circumference} circle_circumference(radius) simplish/contract.py:83 + cover 2 // store circumference#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,radius#0 circle_circumference(radius) simplish/contract.py:83 + // virtual: load radius#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,radius#0 itoa(radius) simplish/contract.py:86 + callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,{itoa} itoa(radius) simplish/contract.py:86 + // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%7#0 itoa(radius) simplish/contract.py:86 + byte "Approximate area and circumference of circle with radius " // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%7#0,"Approximate area and circumference of circle with radius " b"Approximate area and circumference of circle with radius " simplish/contract.py:85 + swap // load tmp%7#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,"Approximate area and circumference of circle with radius ",tmp%7#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius) simplish/contract.py:85-86 + concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius) simplish/contract.py:85-86 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%8#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius) simplish/contract.py:85-86 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%8#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = " simplish/contract.py:85-87 + byte " = " // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%8#0," = " b" = " simplish/contract.py:87 + concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = " simplish/contract.py:85-87 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,area#0,tmp%9#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = " simplish/contract.py:85-87 + swap // load area#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,area#0 itoa(area) simplish/contract.py:88 + callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,{itoa} itoa(area) simplish/contract.py:88 + // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,tmp%10#0 itoa(area) simplish/contract.py:88 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%10#0,tmp%9#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%9#0,tmp%10#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 + concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%11#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-88 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%11#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-89 + byte ", " // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%11#0,", " b", " simplish/contract.py:89 + concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,{concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-89 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | circumference#0,tmp%12#0 Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-89 + swap // load circumference#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,circumference#0 itoa(circumference) simplish/contract.py:90 + callsub itoa // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,{itoa} itoa(circumference) simplish/contract.py:90 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,tmp%13#0 itoa(circumference) simplish/contract.py:90 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%13#0,tmp%12#0 result = (\nBytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n... simplish/contract.py:84-91 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | tmp%12#0,tmp%13#0 result = (\nBytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n... simplish/contract.py:84-91 + concat // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | {concat} Bytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n+ b" = "\n+ ... simplish/contract.py:85-90 + frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = (\nBytes(b"Approximate area and circumference of circle with radius ")\n+ itoa(radius)\n... simplish/contract.py:84-91 + b call_after_if_else@8 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | call_else_body@6: - int 0 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | 0 False simplish/contract.py:93 - frame_bury 2 // store status#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | status = False simplish/contract.py:93 - byte "unknown method name" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | "unknown method name" b"unknown method name" simplish/contract.py:94 - frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = Bytes(b"unknown method name") simplish/contract.py:94 - // Implicit fall through to call_after_if_else@8 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | + int 0 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | 0 False simplish/contract.py:93 + frame_bury 2 // store status#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | status = False simplish/contract.py:93 + byte "unknown method name" // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | "unknown method name" b"unknown method name" simplish/contract.py:94 + frame_bury 0 // store result#0 to f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result = Bytes(b"unknown method name") simplish/contract.py:94 + // Implicit fall through to call_after_if_else@8 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | call_after_if_else@8: - // Implicit fall through to call_after_if_else@9 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | + // Implicit fall through to call_after_if_else@9 // (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | call_after_if_else@9: - frame_dig 0 // load result#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result#0 return result, status simplish/contract.py:95 - frame_dig 2 // load status#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result#0,status#0 return result, status simplish/contract.py:95 + frame_dig 0 // load result#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result#0 return result, status simplish/contract.py:95 + frame_dig 2 // load status#0 from f-stack (𝕡) method_name#0,num_app_args#0 | (𝕗) result#0,radius#0,status#0 | result#0,status#0 return result, status simplish/contract.py:95 frame_bury 1 frame_bury 0 - retsub // result#0,status#0 return result, status simplish/contract.py:95 + retsub // result#0,status#0 return result, status simplish/contract.py:95 // test_cases.simplish.contract.circle_area(radius: uint64) -> uint64: circle_area: - proto 1 1 // (𝕡) radius#0 | @subroutine\ndef circle_area(radius: UInt64) -> UInt64: simplish/contract.py:110-111 + proto 1 1 // (𝕡) radius#0 | @subroutine\ndef circle_area(radius: UInt64) -> UInt64: simplish/contract.py:110-111 circle_area_block@0: - frame_dig -1 // load radius#0 from parameters (𝕡) radius#0 | radius#0 ^ 2\nresult = radius**2 simplish/contract.py:112-113 - int 2 // (𝕡) radius#0 | radius#0,2 \nresult = radius**2 simplish/contract.py:112-113 - exp // (𝕡) radius#0 | {exp} ^ 2\nresult = radius**2 simplish/contract.py:112-113 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) radius#0 | tmp%0#0 ^ 2\nresult = radius**2 simplish/contract.py:112-113 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) radius#0 | tmp%0#0 ^ 2\nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 - int 314159 // (𝕡) radius#0 | tmp%0#0,314159 \nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 - * // (𝕡) radius#0 | {*} ^ 2\nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) radius#0 | tmp%1#0 ^ 2\nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) radius#0 | tmp%1#0 # PI * r ^ 2\nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 - int 100000 // (𝕡) radius#0 | tmp%1#0,100000 \nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 - / // (𝕡) radius#0 | {/} ^ 2\nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 - // virtual: store result#0 to l-stack (no copy) (𝕡) radius#0 | result#0 # PI * r ^ 2\nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 - // virtual: load result#0 from l-stack (no copy) (𝕡) radius#0 | result#0 return result simplish/contract.py:114 - retsub // result#0 return result simplish/contract.py:114 + frame_dig -1 // load radius#0 from parameters (𝕡) radius#0 | radius#0 ^ 2\nresult = radius**2 simplish/contract.py:112-113 + int 2 // (𝕡) radius#0 | radius#0,2 \nresult = radius**2 simplish/contract.py:112-113 + exp // (𝕡) radius#0 | {exp} ^ 2\nresult = radius**2 simplish/contract.py:112-113 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) radius#0 | tmp%0#0 ^ 2\nresult = radius**2 simplish/contract.py:112-113 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) radius#0 | tmp%0#0 ^ 2\nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 + int 314159 // (𝕡) radius#0 | tmp%0#0,314159 \nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 + * // (𝕡) radius#0 | {*} ^ 2\nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) radius#0 | tmp%1#0 ^ 2\nresult = radius**2 * SCALED_PI simplish/contract.py:112-113 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) radius#0 | tmp%1#0 # PI * r ^ 2\nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 + int 100000 // (𝕡) radius#0 | tmp%1#0,100000 \nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 + / // (𝕡) radius#0 | {/} ^ 2\nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 + // virtual: store result#0 to l-stack (no copy) (𝕡) radius#0 | result#0 # PI * r ^ 2\nresult = radius**2 * SCALED_PI // SCALE simplish/contract.py:112-113 + // virtual: load result#0 from l-stack (no copy) (𝕡) radius#0 | result#0 return result simplish/contract.py:114 + retsub // result#0 return result simplish/contract.py:114 // test_cases.simplish.contract.circle_circumference(radius: uint64) -> uint64: circle_circumference: - proto 1 1 // (𝕡) radius#0 | @subroutine\ndef circle_circumference(radius: UInt64) -> UInt64: simplish/contract.py:103-104 + proto 1 1 // (𝕡) radius#0 | @subroutine\ndef circle_circumference(radius: UInt64) -> UInt64: simplish/contract.py:103-104 circle_circumference_block@0: - frame_dig -1 // load radius#0 from parameters (𝕡) radius#0 | radius#0 radius * two_pi simplish/contract.py:107 - int 628318 // (𝕡) radius#0 | radius#0,628318 \ntwo_pi = UInt64(2) * SCALED_PI simplish/contract.py:105-106 - * // (𝕡) radius#0 | {*} radius * two_pi simplish/contract.py:107 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) radius#0 | tmp%0#0 radius * two_pi simplish/contract.py:107 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) radius#0 | tmp%0#0 radius * two_pi // SCALE simplish/contract.py:107 - int 100000 // (𝕡) radius#0 | tmp%0#0,100000 SCALE simplish/contract.py:107 - / // (𝕡) radius#0 | {/} radius * two_pi // SCALE simplish/contract.py:107 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) radius#0 | tmp%1#0 radius * two_pi // SCALE simplish/contract.py:107 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) radius#0 | tmp%1#0 return radius * two_pi // SCALE simplish/contract.py:107 - retsub // tmp%1#0 return radius * two_pi // SCALE simplish/contract.py:107 + frame_dig -1 // load radius#0 from parameters (𝕡) radius#0 | radius#0 radius * two_pi simplish/contract.py:107 + int 628318 // (𝕡) radius#0 | radius#0,628318 \ntwo_pi = UInt64(2) * SCALED_PI simplish/contract.py:105-106 + * // (𝕡) radius#0 | {*} radius * two_pi simplish/contract.py:107 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) radius#0 | tmp%0#0 radius * two_pi simplish/contract.py:107 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) radius#0 | tmp%0#0 radius * two_pi // SCALE simplish/contract.py:107 + int 100000 // (𝕡) radius#0 | tmp%0#0,100000 SCALE simplish/contract.py:107 + / // (𝕡) radius#0 | {/} radius * two_pi // SCALE simplish/contract.py:107 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) radius#0 | tmp%1#0 radius * two_pi // SCALE simplish/contract.py:107 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) radius#0 | tmp%1#0 return radius * two_pi // SCALE simplish/contract.py:107 + retsub // tmp%1#0 return radius * two_pi // SCALE simplish/contract.py:107 // test_cases.simplish.contract.Simplish.increment_counter() -> void: increment_counter: - proto 0 0 // @subroutine\ndef increment_counter(self) -> None: simplish/contract.py:97-98 + proto 0 0 // @subroutine\ndef increment_counter(self) -> None: simplish/contract.py:97-98 increment_counter_block@0: - byte "Incrementing counter!" // "Incrementing counter!" b"Incrementing counter!" simplish/contract.py:99 - log // log(b"Incrementing counter!") simplish/contract.py:99 - callsub CallCounter.increment_counter // super().increment_counter() simplish/contract.py:100 + byte "Incrementing counter!" // "Incrementing counter!" b"Incrementing counter!" simplish/contract.py:99 + log // log(b"Incrementing counter!") simplish/contract.py:99 + callsub CallCounter.increment_counter // super().increment_counter() simplish/contract.py:100 retsub // // test_cases.simplish.base_class.CallCounter.increment_counter() -> void: CallCounter.increment_counter: - proto 0 0 // @subroutine\ndef increment_counter(self) -> None: simplish/base_class.py:11-12 + proto 0 0 // @subroutine\ndef increment_counter(self) -> None: simplish/base_class.py:11-12 CallCounter.increment_counter_block@0: - int 0 // 0 self.counter simplish/base_class.py:13 - byte "counter" // 0,"counter" self.counter simplish/base_class.py:13 - app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter simplish/base_class.py:13 - // virtual: store app_global_get_ex_did_exist%1#0 to l-stack (no copy) app_global_get_ex_did_exist%1#0,{app_global_get_ex}.0 self.counter simplish/base_class.py:13 - // virtual: store app_global_get_ex_value%0#0 to l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter simplish/base_class.py:13 - // virtual: load app_global_get_ex_did_exist%1#0 from l-stack (no copy) app_global_get_ex_value%0#0,app_global_get_ex_did_exist%1#0 self.counter simplish/base_class.py:13 - assert // check counter exists // app_global_get_ex_value%0#0 self.counter simplish/base_class.py:13 - // virtual: load app_global_get_ex_value%0#0 from l-stack (no copy) app_global_get_ex_value%0#0 self.counter += 1 simplish/base_class.py:13 - int 1 // app_global_get_ex_value%0#0,1 1 simplish/base_class.py:13 - + // {+} self.counter += 1 simplish/base_class.py:13 - // virtual: store new_state_value%2#0 to l-stack (no copy) new_state_value%2#0 self.counter += 1 simplish/base_class.py:13 - byte "counter" // new_state_value%2#0,"counter" self.counter simplish/base_class.py:13 - swap // load new_state_value%2#0 from l-stack (no copy) "counter",new_state_value%2#0 self.counter += 1 simplish/base_class.py:13 - app_global_put // self.counter += 1 simplish/base_class.py:13 + int 0 // 0 self.counter simplish/base_class.py:13 + byte "counter" // 0,"counter" self.counter simplish/base_class.py:13 + app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.counter simplish/base_class.py:13 + // virtual: store counter_exists%1#0 to l-stack (no copy) counter_exists%1#0,{app_global_get_ex}.0 self.counter simplish/base_class.py:13 + // virtual: store counter_value%0#0 to l-stack (no copy) counter_value%0#0,counter_exists%1#0 self.counter simplish/base_class.py:13 + // virtual: load counter_exists%1#0 from l-stack (no copy) counter_value%0#0,counter_exists%1#0 self.counter simplish/base_class.py:13 + assert // check counter exists // counter_value%0#0 self.counter simplish/base_class.py:13 + // virtual: load counter_value%0#0 from l-stack (no copy) counter_value%0#0 self.counter += 1 simplish/base_class.py:13 + int 1 // counter_value%0#0,1 1 simplish/base_class.py:13 + + // {+} self.counter += 1 simplish/base_class.py:13 + // virtual: store new_state_value%2#0 to l-stack (no copy) new_state_value%2#0 self.counter += 1 simplish/base_class.py:13 + byte "counter" // new_state_value%2#0,"counter" self.counter simplish/base_class.py:13 + swap // load new_state_value%2#0 from l-stack (no copy) "counter",new_state_value%2#0 self.counter += 1 simplish/base_class.py:13 + app_global_put // self.counter += 1 simplish/base_class.py:13 retsub // // test_cases.simplish.base_class.CallCounter.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: simplish/base_class.py:7 + proto 0 0 // def __init__(self) -> None: simplish/base_class.py:7 __init___block@0: - byte "counter" // "counter" self.counter simplish/base_class.py:8 - int 0 // "counter",0 0 simplish/base_class.py:8 - app_global_put // self.counter = UInt64(0) simplish/base_class.py:8 + byte "counter" // "counter" self.counter simplish/base_class.py:8 + int 0 // "counter",0 0 simplish/base_class.py:8 + app_global_put // self.counter = UInt64(0) simplish/base_class.py:8 retsub // diff --git a/test_cases/simplish/out/Simplish.destructured.ir b/test_cases/simplish/out/Simplish.destructured.ir index 9c72e8d43e..3b3f543a85 100644 --- a/test_cases/simplish/out/Simplish.destructured.ir +++ b/test_cases/simplish/out/Simplish.destructured.ir @@ -22,9 +22,9 @@ contract test_cases.simplish.contract.Simplish: block@5: // if_body_L35 goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 - let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check counter exists - let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) + let (counter_value%7#0: uint64, counter_exists%8#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%8#0) // check counter exists + let tmp%9#0: bytes = test_cases.simplish.contract.itoa(counter_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") (log tmp%11#0) @@ -172,9 +172,9 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists - let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists + let new_state_value%2#0: uint64 = (+ counter_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out/Simplish.ssa.ir b/test_cases/simplish/out/Simplish.ssa.ir index 84316e8031..cc208793b9 100644 --- a/test_cases/simplish/out/Simplish.ssa.ir +++ b/test_cases/simplish/out/Simplish.ssa.ir @@ -24,9 +24,9 @@ contract test_cases.simplish.contract.Simplish: let tmp%6#0: uint64 = (== oca#0 DeleteApplication) goto tmp%6#0 ? block@6 : block@7 block@6: // if_body_L39 - let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check counter exists - let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) + let (counter_value%7#0: uint64, counter_exists%8#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%8#0) // check counter exists + let tmp%9#0: bytes = test_cases.simplish.contract.itoa(counter_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") (log tmp%11#0) @@ -198,9 +198,9 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists - let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists + let new_state_value%2#0: uint64 = (+ counter_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir b/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir index 52000ffb6f..c54ca8cdb1 100644 --- a/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir +++ b/test_cases/simplish/out/Simplish.ssa.opt_pass_1.ir @@ -23,9 +23,9 @@ contract test_cases.simplish.contract.Simplish: block@5: // if_body_L35 goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 - let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check counter exists - let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) + let (counter_value%7#0: uint64, counter_exists%8#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%8#0) // check counter exists + let tmp%9#0: bytes = test_cases.simplish.contract.itoa(counter_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") (log tmp%11#0) @@ -189,9 +189,9 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists - let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists + let new_state_value%2#0: uint64 = (+ counter_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir b/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir index bcafba71a1..0f478dff5d 100644 --- a/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir +++ b/test_cases/simplish/out/Simplish.ssa.opt_pass_2.ir @@ -22,9 +22,9 @@ contract test_cases.simplish.contract.Simplish: block@5: // if_body_L35 goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 - let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check counter exists - let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) + let (counter_value%7#0: uint64, counter_exists%8#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%8#0) // check counter exists + let tmp%9#0: bytes = test_cases.simplish.contract.itoa(counter_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") (log tmp%11#0) @@ -187,9 +187,9 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists - let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists + let new_state_value%2#0: uint64 = (+ counter_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out_O2/Simplish.destructured.ir b/test_cases/simplish/out_O2/Simplish.destructured.ir index 2c5047fd53..c8f099b4f3 100644 --- a/test_cases/simplish/out_O2/Simplish.destructured.ir +++ b/test_cases/simplish/out_O2/Simplish.destructured.ir @@ -22,9 +22,9 @@ contract test_cases.simplish.contract.Simplish: block@5: // if_body_L35 goto is_equal%4#0 ? block@6 : block@7 block@6: // if_body_L39 - let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check counter exists - let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) + let (counter_value%7#0: uint64, counter_exists%8#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%8#0) // check counter exists + let tmp%9#0: bytes = test_cases.simplish.contract.itoa(counter_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") (log tmp%11#0) @@ -170,9 +170,9 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists - let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists + let new_state_value%2#0: uint64 = (+ counter_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/out_unoptimized/Simplish.destructured.ir b/test_cases/simplish/out_unoptimized/Simplish.destructured.ir index 443583a93d..6fb65e1d59 100644 --- a/test_cases/simplish/out_unoptimized/Simplish.destructured.ir +++ b/test_cases/simplish/out_unoptimized/Simplish.destructured.ir @@ -24,9 +24,9 @@ contract test_cases.simplish.contract.Simplish: let tmp%6#0: uint64 = (== oca#0 DeleteApplication) goto tmp%6#0 ? block@6 : block@7 block@6: // if_body_L39 - let (app_global_get_ex_value%7#0: uint64, app_global_get_ex_did_exist%8#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%8#0) // check counter exists - let tmp%9#0: bytes = test_cases.simplish.contract.itoa(app_global_get_ex_value%7#0) + let (counter_value%7#0: uint64, counter_exists%8#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%8#0) // check counter exists + let tmp%9#0: bytes = test_cases.simplish.contract.itoa(counter_value%7#0) let tmp%10#0: bytes = (concat "I was used " tmp%9#0) let tmp%11#0: bytes = (concat tmp%10#0 " time(s) before I died") (log tmp%11#0) @@ -187,9 +187,9 @@ contract test_cases.simplish.contract.Simplish: subroutine test_cases.simplish.base_class.CallCounter.increment_counter() -> void: block@0: // L11 - let (app_global_get_ex_value%0#0: uint64, app_global_get_ex_did_exist%1#0: uint64) = (app_global_get_ex 0u "counter") - (assert app_global_get_ex_did_exist%1#0) // check counter exists - let new_state_value%2#0: uint64 = (+ app_global_get_ex_value%0#0 1u) + let (counter_value%0#0: uint64, counter_exists%1#0: uint64) = (app_global_get_ex 0u "counter") + (assert counter_exists%1#0) // check counter exists + let new_state_value%2#0: uint64 = (+ counter_value%0#0 1u) (app_global_put "counter" new_state_value%2#0) return diff --git a/test_cases/simplish/puya.log b/test_cases/simplish/puya.log index ee31e82556..cd0eda3f2d 100644 --- a/test_cases/simplish/puya.log +++ b/test_cases/simplish/puya.log @@ -948,12 +948,12 @@ debug: Inserted main_if_body@6.ops[13]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced main_if_body@6.ops[15]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' debug: Inserted main_if_body@6.ops[18]: 'store tmp%11#0 to l-stack (copy)' debug: Replaced main_if_body@6.ops[20]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' -debug: Inserted main_if_body@6.ops[3]: 'store app_global_get_ex_did_exist%8#0 to l-stack (copy)' -debug: Replaced main_if_body@6.ops[6]: 'load app_global_get_ex_did_exist%8#0' with 'load app_global_get_ex_did_exist%8#0 from l-stack (no copy)' +debug: Inserted main_if_body@6.ops[3]: 'store counter_exists%8#0 to l-stack (copy)' +debug: Replaced main_if_body@6.ops[6]: 'load counter_exists%8#0' with 'load counter_exists%8#0 from l-stack (no copy)' debug: Inserted main_if_body@6.ops[10]: 'store tmp%9#0 to l-stack (copy)' debug: Replaced main_if_body@6.ops[13]: 'load tmp%9#0' with 'load tmp%9#0 from l-stack (no copy)' -debug: Inserted main_if_body@6.ops[5]: 'store app_global_get_ex_value%7#0 to l-stack (copy)' -debug: Replaced main_if_body@6.ops[9]: 'load app_global_get_ex_value%7#0' with 'load app_global_get_ex_value%7#0 from l-stack (no copy)' +debug: Inserted main_if_body@6.ops[5]: 'store counter_value%7#0 to l-stack (copy)' +debug: Replaced main_if_body@6.ops[9]: 'load counter_value%7#0' with 'load counter_value%7#0 from l-stack (no copy)' debug: Inserted main_after_if_else@7.ops[1]: 'store tmp%12#0 to l-stack (copy)' debug: Replaced main_after_if_else@7.ops[3]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' debug: Inserted main_after_if_else@7.ops[6]: 'store tmp%13#0 to l-stack (copy)' @@ -1059,11 +1059,11 @@ debug: Inserted circle_circumference_block@0.ops[3]: 'store tmp%0#0 to l-stack ( debug: Replaced circle_circumference_block@0.ops[5]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' debug: Inserted circle_circumference_block@0.ops[8]: 'store tmp%1#0 to l-stack (copy)' debug: Replaced circle_circumference_block@0.ops[10]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' -debug: Inserted CallCounter.increment_counter_block@0.ops[3]: 'store app_global_get_ex_did_exist%1#0 to l-stack (copy)' -debug: Replaced CallCounter.increment_counter_block@0.ops[6]: 'load app_global_get_ex_did_exist%1#0' with 'load app_global_get_ex_did_exist%1#0 from l-stack (no copy)' +debug: Inserted CallCounter.increment_counter_block@0.ops[3]: 'store counter_exists%1#0 to l-stack (copy)' +debug: Replaced CallCounter.increment_counter_block@0.ops[6]: 'load counter_exists%1#0' with 'load counter_exists%1#0 from l-stack (no copy)' debug: Inserted CallCounter.increment_counter_block@0.ops[11]: 'store new_state_value%2#0 to l-stack (copy)' debug: Replaced CallCounter.increment_counter_block@0.ops[14]: 'load new_state_value%2#0' with 'load new_state_value%2#0 from l-stack (no copy)' -debug: Inserted CallCounter.increment_counter_block@0.ops[5]: 'store app_global_get_ex_value%0#0 to l-stack (copy)' -debug: Replaced CallCounter.increment_counter_block@0.ops[9]: 'load app_global_get_ex_value%0#0' with 'load app_global_get_ex_value%0#0 from l-stack (no copy)' +debug: Inserted CallCounter.increment_counter_block@0.ops[5]: 'store counter_value%0#0 to l-stack (copy)' +debug: Replaced CallCounter.increment_counter_block@0.ops[9]: 'load counter_value%0#0' with 'load counter_value%0#0 from l-stack (no copy)' info: Writing simplish/out/Simplish.approval.teal info: Writing simplish/out/Simplish.clear.teal \ No newline at end of file From 096bbf6ad20686b7c93e76a194d9c41d3bbb3efd Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 5 Mar 2024 12:39:24 +0800 Subject: [PATCH 39/40] refactoring of checked_maybe IR implementation --- .../amm/out/ConstantProductAMM.approval.mir | 464 ++++++++-------- .../out/ConstantProductAMM.destructured.ir | 114 ++-- examples/amm/out/ConstantProductAMM.ssa.ir | 124 ++--- .../out/ConstantProductAMM.ssa.opt_pass_1.ir | 114 ++-- .../out_O2/ConstantProductAMM.destructured.ir | 114 ++-- .../ConstantProductAMM.destructured.ir | 134 ++--- examples/amm/puya.log | 234 ++++---- examples/auction/out/Auction.approval.mir | 60 +-- examples/auction/out/Auction.destructured.ir | 24 +- examples/auction/out/Auction.ssa.ir | 28 +- .../auction/out/Auction.ssa.opt_pass_1.ir | 24 +- .../auction/out_O2/Auction.destructured.ir | 24 +- .../out_unoptimized/Auction.destructured.ir | 32 +- examples/auction/puya.log | 58 +- .../voting/out/VotingRoundApp.approval.mir | 74 +-- .../voting/out/VotingRoundApp.destructured.ir | 24 +- examples/voting/out/VotingRoundApp.ssa.ir | 28 +- .../out/VotingRoundApp.ssa.opt_pass_1.ir | 24 +- .../out/VotingRoundApp.ssa.opt_pass_2.ir | 24 +- .../out_O2/VotingRoundApp.destructured.ir | 24 +- .../VotingRoundApp.destructured.ir | 32 +- examples/voting/puya.log | 58 +- src/puya/awst/nodes.py | 6 +- src/puya/ir/builder/_utils.py | 34 +- src/puya/ir/builder/main.py | 34 +- .../abi_routing/out/Reference.approval.mir | 360 ++++++------- .../abi_routing/out/Reference.destructured.ir | 34 +- test_cases/abi_routing/out/Reference.ssa.ir | 40 +- .../out/Reference.ssa.opt_pass_1.ir | 34 +- .../out/Reference.ssa.opt_pass_2.ir | 34 +- .../out/Reference.ssa.opt_pass_3.ir | 34 +- .../out/Reference.ssa.opt_pass_4.ir | 34 +- .../out_O2/Reference.destructured.ir | 34 +- .../out_unoptimized/Reference.destructured.ir | 46 +- test_cases/abi_routing/puya.log | 86 +-- .../application/out/Reference.approval.mir | 288 +++++----- .../application/out/Reference.destructured.ir | 48 +- test_cases/application/out/Reference.ssa.ir | 48 +- .../out/Reference.ssa.opt_pass_1.ir | 48 +- .../out_O2/Reference.destructured.ir | 48 +- .../out_unoptimized/Reference.destructured.ir | 48 +- test_cases/application/puya.log | 64 +-- .../out/Arc4RefTypesContract.approval.mir | 10 +- .../out/Arc4RefTypesContract.destructured.ir | 6 +- .../out/Arc4RefTypesContract.ssa.ir | 12 +- .../Arc4RefTypesContract.ssa.opt_pass_1.ir | 6 +- .../Arc4RefTypesContract.destructured.ir | 6 +- .../Arc4RefTypesContract.destructured.ir | 14 +- test_cases/arc4_types/puya.log | 16 +- test_cases/asset/out/Reference.approval.mir | 502 +++++++++--------- .../asset/out/Reference.destructured.ir | 72 +-- test_cases/asset/out/Reference.ssa.ir | 72 +-- .../asset/out/Reference.ssa.opt_pass_1.ir | 72 +-- .../asset/out_O2/Reference.destructured.ir | 72 +-- .../out_unoptimized/Reference.destructured.ir | 72 +-- test_cases/asset/puya.log | 96 ++-- .../out/Greeter.approval.mir | 10 +- .../out/Greeter.destructured.ir | 6 +- .../inner_transactions/out/Greeter.ssa.ir | 12 +- .../out/Greeter.ssa.opt_pass_1.ir | 6 +- .../out/MyContract.approval.mir | 24 +- .../out/MyContract.destructured.ir | 12 +- .../inner_transactions/out/MyContract.ssa.ir | 12 +- .../out/MyContract.ssa.opt_pass_1.ir | 12 +- .../out/MyContract.ssa.opt_pass_2.ir | 12 +- .../out_O2/Greeter.destructured.ir | 6 +- .../out_O2/MyContract.destructured.ir | 12 +- .../out_unoptimized/Greeter.destructured.ir | 14 +- .../MyContract.destructured.ir | 12 +- test_cases/inner_transactions/puya.log | 32 +- .../out/TransactionContract.approval.mir | 352 ++++++------ .../out/TransactionContract.destructured.ir | 136 ++--- .../out/TransactionContract.ssa.ir | 160 +++--- .../out/TransactionContract.ssa.opt_pass_1.ir | 136 ++--- .../TransactionContract.destructured.ir | 136 ++--- .../TransactionContract.destructured.ir | 184 +++---- test_cases/transaction/puya.log | 342 ++++++------ 77 files changed, 2951 insertions(+), 2943 deletions(-) diff --git a/examples/amm/out/ConstantProductAMM.approval.mir b/examples/amm/out/ConstantProductAMM.approval.mir index 9c87e3931d..755501d8c3 100644 --- a/examples/amm/out/ConstantProductAMM.approval.mir +++ b/examples/amm/out/ConstantProductAMM.approval.mir @@ -71,39 +71,39 @@ main_bootstrap_route@5: // virtual: load tmp%11#0 from l-stack (no copy) tmp%11#0 arc4.abimethod() amm/contract.py:49 assert // is not creating // arc4.abimethod() amm/contract.py:49 txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%14#0 to l-stack (no copy) tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%14#0 from l-stack (no copy) tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // tmp%14#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%12#0 to l-stack (no copy) tmp%12#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%12#0 from l-stack (no copy) tmp%12#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // tmp%12#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%16#0 to l-stack (no copy) awst_tmp%15#0,tmp%16#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%16#0 from l-stack (no copy) awst_tmp%15#0,tmp%16#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int pay // awst_tmp%15#0,tmp%16#0,pay class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%17#0 to l-stack (no copy) awst_tmp%15#0,tmp%17#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%17#0 from l-stack (no copy) awst_tmp%15#0,tmp%17#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is pay // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%18#0 to l-stack (no copy) awst_tmp%15#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%18#0 from l-stack (no copy) awst_tmp%15#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%19#0 to l-stack (no copy) awst_tmp%15#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%19#0 from l-stack (no copy) awst_tmp%15#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%20#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%15#0,tmp%20#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%21#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%21#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%20#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%22#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%22#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%20#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%23#0 to l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%23#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 2 // load awst_tmp%15#0 from l-stack (no copy) tmp%20#0,tmp%23#0,awst_tmp%15#0 arc4.abimethod() amm/contract.py:49 - uncover 2 // load tmp%20#0 from l-stack (no copy) tmp%23#0,awst_tmp%15#0,tmp%20#0 arc4.abimethod() amm/contract.py:49 - uncover 2 // load tmp%23#0 from l-stack (no copy) awst_tmp%15#0,tmp%20#0,tmp%23#0 arc4.abimethod() amm/contract.py:49 + // virtual: store awst_tmp%13#0 to l-stack (no copy) awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%13#0 from l-stack (copy) awst_tmp%13#0,awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%13#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%14#0 to l-stack (no copy) awst_tmp%13#0,tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%14#0 from l-stack (no copy) awst_tmp%13#0,tmp%14#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int pay // awst_tmp%13#0,tmp%14#0,pay class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%13#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%15#0 to l-stack (no copy) awst_tmp%13#0,tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%15#0 from l-stack (no copy) awst_tmp%13#0,tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is pay // awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%13#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%18#0 to l-stack (no copy) awst_tmp%13#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%18#0 from l-stack (no copy) awst_tmp%13#0,tmp%18#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%13#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%19#0 to l-stack (no copy) awst_tmp%13#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%19#0 from l-stack (no copy) awst_tmp%13#0,tmp%19#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%13#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%20#0 to l-stack (no copy) awst_tmp%13#0,tmp%20#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%13#0,tmp%20#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%21#0 to l-stack (no copy) awst_tmp%13#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%21#0 from l-stack (no copy) awst_tmp%13#0,tmp%20#0,tmp%21#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%13#0,tmp%20#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%22#0 to l-stack (no copy) awst_tmp%13#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%22#0 from l-stack (no copy) awst_tmp%13#0,tmp%20#0,tmp%22#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%13#0,tmp%20#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%23#0 to l-stack (no copy) awst_tmp%13#0,tmp%20#0,tmp%23#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 2 // load awst_tmp%13#0 from l-stack (no copy) tmp%20#0,tmp%23#0,awst_tmp%13#0 arc4.abimethod() amm/contract.py:49 + uncover 2 // load tmp%20#0 from l-stack (no copy) tmp%23#0,awst_tmp%13#0,tmp%20#0 arc4.abimethod() amm/contract.py:49 + uncover 2 // load tmp%23#0 from l-stack (no copy) awst_tmp%13#0,tmp%20#0,tmp%23#0 arc4.abimethod() amm/contract.py:49 callsub bootstrap // {bootstrap} arc4.abimethod() amm/contract.py:49 // virtual: store tmp%24#0 to l-stack (no copy) tmp%24#0 arc4.abimethod() amm/contract.py:49 byte 0x151f7c75 // tmp%24#0,0x151f7c75 arc4.abimethod() amm/contract.py:49 @@ -128,64 +128,64 @@ main_mint_route@6: // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 assert // is not creating // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%31#0 to l-stack (no copy) tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%31#0 from l-stack (no copy) tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 2 // tmp%31#0,2 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%29#0 to l-stack (no copy) tmp%29#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%29#0 from l-stack (no copy) tmp%29#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 2 // tmp%29#0,2 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%32#0 to l-stack (no copy) awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%32#0 from l-stack (copy) awst_tmp%32#0,awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%32#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%33#0 to l-stack (no copy) awst_tmp%32#0,tmp%33#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%33#0 from l-stack (no copy) awst_tmp%32#0,tmp%33#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%32#0,tmp%33#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%32#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%34#0 to l-stack (no copy) awst_tmp%32#0,tmp%34#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%34#0 from l-stack (no copy) awst_tmp%32#0,tmp%34#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txn GroupIndex // awst_tmp%32#0,{txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%37#0 to l-stack (no copy) awst_tmp%32#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%37#0 from l-stack (no copy) awst_tmp%32#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // awst_tmp%32#0,tmp%37#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - - // awst_tmp%32#0,{-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%32#0,awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%32#0,awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%38#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%38#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%38#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%38#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%32#0,awst_tmp%15#0,tmp%38#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%32#0,awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%39#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%39#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%39#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%39#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%32#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%32#0,awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%40#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%40#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%32#0,awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%41#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%41#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%32#0,awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 3 // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%46#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%47#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%47#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%48#0 to l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 4 // load awst_tmp%32#0 from l-stack (no copy) awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%32#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load awst_tmp%15#0 from l-stack (no copy) tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%32#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load tmp%42#0 from l-stack (no copy) tmp%45#0,tmp%48#0,awst_tmp%32#0,awst_tmp%15#0,tmp%42#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load tmp%45#0 from l-stack (no copy) tmp%48#0,awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 - uncover 4 // load tmp%48#0 from l-stack (no copy) awst_tmp%32#0,awst_tmp%15#0,tmp%42#0,tmp%45#0,tmp%48#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + // virtual: store awst_tmp%30#0 to l-stack (no copy) awst_tmp%30#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%30#0 from l-stack (copy) awst_tmp%30#0,awst_tmp%30#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%30#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%31#0 to l-stack (no copy) awst_tmp%30#0,tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%31#0 from l-stack (no copy) awst_tmp%30#0,tmp%31#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%30#0,tmp%31#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%30#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%32#0 to l-stack (no copy) awst_tmp%30#0,tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%32#0 from l-stack (no copy) awst_tmp%30#0,tmp%32#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%30#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txn GroupIndex // awst_tmp%30#0,{txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%35#0 to l-stack (no copy) awst_tmp%30#0,tmp%35#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%35#0 from l-stack (no copy) awst_tmp%30#0,tmp%35#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // awst_tmp%30#0,tmp%35#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + - // awst_tmp%30#0,{-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store awst_tmp%13#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%13#0 from l-stack (copy) awst_tmp%30#0,awst_tmp%13#0,awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%30#0,awst_tmp%13#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%36#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%36#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%36#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%36#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%30#0,awst_tmp%13#0,tmp%36#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%30#0,awst_tmp%13#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%37#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%37#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%37#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%30#0,awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%30#0,awst_tmp%13#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%40#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%40#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%40#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%30#0,awst_tmp%13#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%41#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%41#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%41#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%30#0,awst_tmp%13#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%43#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%44#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 3 // awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%46#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,tmp%46#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%47#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%47#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,tmp%47#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%48#0 to l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,tmp%48#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 4 // load awst_tmp%30#0 from l-stack (no copy) awst_tmp%13#0,tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%30#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load awst_tmp%13#0 from l-stack (no copy) tmp%42#0,tmp%45#0,tmp%48#0,awst_tmp%30#0,awst_tmp%13#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load tmp%42#0 from l-stack (no copy) tmp%45#0,tmp%48#0,awst_tmp%30#0,awst_tmp%13#0,tmp%42#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load tmp%45#0 from l-stack (no copy) tmp%48#0,awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 + uncover 4 // load tmp%48#0 from l-stack (no copy) awst_tmp%30#0,awst_tmp%13#0,tmp%42#0,tmp%45#0,tmp%48#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 callsub mint // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 int 1 // 1 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 return // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:83-89 @@ -203,48 +203,48 @@ main_burn_route@7: // virtual: load tmp%51#0 from l-stack (no copy) tmp%51#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 assert // is not creating // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%54#0 to l-stack (no copy) tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%54#0 from l-stack (no copy) tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // tmp%54#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%52#0 to l-stack (no copy) tmp%52#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%52#0 from l-stack (no copy) tmp%52#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // tmp%52#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%55#0 to l-stack (no copy) awst_tmp%15#0,tmp%55#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%55#0 from l-stack (no copy) awst_tmp%15#0,tmp%55#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%15#0,tmp%55#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%56#0 to l-stack (no copy) awst_tmp%15#0,tmp%56#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%56#0 from l-stack (no copy) awst_tmp%15#0,tmp%56#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%57#0 to l-stack (no copy) awst_tmp%15#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%57#0 from l-stack (no copy) awst_tmp%15#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%58#0 to l-stack (no copy) awst_tmp%15#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%58#0 from l-stack (no copy) awst_tmp%15#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%59#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%15#0,tmp%59#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%60#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%60#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%59#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%61#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%61#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%59#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%62#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 3 // awst_tmp%15#0,tmp%59#0,tmp%62#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%63#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%63#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%59#0,tmp%62#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%64#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%64#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%59#0,tmp%62#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%65#0 to l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%65#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 3 // load awst_tmp%15#0 from l-stack (no copy) tmp%59#0,tmp%62#0,tmp%65#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - uncover 3 // load tmp%59#0 from l-stack (no copy) tmp%62#0,tmp%65#0,awst_tmp%15#0,tmp%59#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - uncover 3 // load tmp%62#0 from l-stack (no copy) tmp%65#0,awst_tmp%15#0,tmp%59#0,tmp%62#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 - uncover 3 // load tmp%65#0 from l-stack (no copy) awst_tmp%15#0,tmp%59#0,tmp%62#0,tmp%65#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + // virtual: store awst_tmp%13#0 to l-stack (no copy) awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%13#0 from l-stack (copy) awst_tmp%13#0,awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%13#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%53#0 to l-stack (no copy) awst_tmp%13#0,tmp%53#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%53#0 from l-stack (no copy) awst_tmp%13#0,tmp%53#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%13#0,tmp%53#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%13#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%54#0 to l-stack (no copy) awst_tmp%13#0,tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%54#0 from l-stack (no copy) awst_tmp%13#0,tmp%54#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%13#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%57#0 to l-stack (no copy) awst_tmp%13#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%57#0 from l-stack (no copy) awst_tmp%13#0,tmp%57#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%13#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%58#0 to l-stack (no copy) awst_tmp%13#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%58#0 from l-stack (no copy) awst_tmp%13#0,tmp%58#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%13#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%59#0 to l-stack (no copy) awst_tmp%13#0,tmp%59#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%13#0,tmp%59#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%60#0 to l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%60#0 from l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%60#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%13#0,tmp%59#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%61#0 to l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%61#0 from l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%61#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%13#0,tmp%59#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%62#0 to l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%62#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 3 // awst_tmp%13#0,tmp%59#0,tmp%62#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%63#0 to l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%63#0 from l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%62#0,tmp%63#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%13#0,tmp%59#0,tmp%62#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%64#0 to l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%64#0 from l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%62#0,tmp%64#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%13#0,tmp%59#0,tmp%62#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%65#0 to l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%62#0,tmp%65#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 3 // load awst_tmp%13#0 from l-stack (no copy) tmp%59#0,tmp%62#0,tmp%65#0,awst_tmp%13#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + uncover 3 // load tmp%59#0 from l-stack (no copy) tmp%62#0,tmp%65#0,awst_tmp%13#0,tmp%59#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + uncover 3 // load tmp%62#0 from l-stack (no copy) tmp%65#0,awst_tmp%13#0,tmp%59#0,tmp%62#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 + uncover 3 // load tmp%65#0 from l-stack (no copy) awst_tmp%13#0,tmp%59#0,tmp%62#0,tmp%65#0 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 callsub burn // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 int 1 // 1 arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 return // arc4.abimethod(\ndefault_args={\n"pool_asset": "pool_token",\n"a_asset": "asset_a",\n"b_asset": "... amm/contract.py:149-155 @@ -262,39 +262,39 @@ main_swap_route@8: // virtual: load tmp%68#0 from l-stack (no copy) tmp%68#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 assert // is not creating // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 txn GroupIndex // {txn} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%71#0 to l-stack (no copy) tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%71#0 from l-stack (no copy) tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int 1 // tmp%71#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%69#0 to l-stack (no copy) tmp%69#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%69#0 from l-stack (no copy) tmp%69#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int 1 // tmp%69#0,1 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // {-} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - gtxns TypeEnum // awst_tmp%15#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%72#0 to l-stack (no copy) awst_tmp%15#0,tmp%72#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%72#0 from l-stack (no copy) awst_tmp%15#0,tmp%72#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - int axfer // awst_tmp%15#0,tmp%72#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - == // awst_tmp%15#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%73#0 to l-stack (no copy) awst_tmp%15#0,tmp%73#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%73#0 from l-stack (no copy) awst_tmp%15#0,tmp%73#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - assert // transaction type is axfer // awst_tmp%15#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 1 // awst_tmp%15#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%74#0 to l-stack (no copy) awst_tmp%15#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%74#0 from l-stack (no copy) awst_tmp%15#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%75#0 to l-stack (no copy) awst_tmp%15#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%75#0 from l-stack (no copy) awst_tmp%15#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%76#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txna ApplicationArgs 2 // awst_tmp%15#0,tmp%76#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%77#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%77#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - btoi // awst_tmp%15#0,tmp%76#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%78#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: load tmp%78#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - txnas Assets // awst_tmp%15#0,tmp%76#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - // virtual: store tmp%79#0 to l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%79#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 - uncover 2 // load awst_tmp%15#0 from l-stack (no copy) tmp%76#0,tmp%79#0,awst_tmp%15#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - uncover 2 // load tmp%76#0 from l-stack (no copy) tmp%79#0,awst_tmp%15#0,tmp%76#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 - uncover 2 // load tmp%79#0 from l-stack (no copy) awst_tmp%15#0,tmp%76#0,tmp%79#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + // virtual: store awst_tmp%13#0 to l-stack (no copy) awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + dup // load awst_tmp%13#0 from l-stack (copy) awst_tmp%13#0,awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + gtxns TypeEnum // awst_tmp%13#0,{gtxns} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%70#0 to l-stack (no copy) awst_tmp%13#0,tmp%70#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%70#0 from l-stack (no copy) awst_tmp%13#0,tmp%70#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + int axfer // awst_tmp%13#0,tmp%70#0,axfer class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + == // awst_tmp%13#0,{==} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%71#0 to l-stack (no copy) awst_tmp%13#0,tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%71#0 from l-stack (no copy) awst_tmp%13#0,tmp%71#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + assert // transaction type is axfer // awst_tmp%13#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 1 // awst_tmp%13#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%74#0 to l-stack (no copy) awst_tmp%13#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%74#0 from l-stack (no copy) awst_tmp%13#0,tmp%74#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%13#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%75#0 to l-stack (no copy) awst_tmp%13#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%75#0 from l-stack (no copy) awst_tmp%13#0,tmp%75#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%13#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%76#0 to l-stack (no copy) awst_tmp%13#0,tmp%76#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txna ApplicationArgs 2 // awst_tmp%13#0,tmp%76#0,{txna} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%77#0 to l-stack (no copy) awst_tmp%13#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%77#0 from l-stack (no copy) awst_tmp%13#0,tmp%76#0,tmp%77#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + btoi // awst_tmp%13#0,tmp%76#0,{btoi} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%78#0 to l-stack (no copy) awst_tmp%13#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: load tmp%78#0 from l-stack (no copy) awst_tmp%13#0,tmp%76#0,tmp%78#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + txnas Assets // awst_tmp%13#0,tmp%76#0,{txnas} class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + // virtual: store tmp%79#0 to l-stack (no copy) awst_tmp%13#0,tmp%76#0,tmp%79#0 class ConstantProductAMM(ARC4Contract): amm/contract.py:27 + uncover 2 // load awst_tmp%13#0 from l-stack (no copy) tmp%76#0,tmp%79#0,awst_tmp%13#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + uncover 2 // load tmp%76#0 from l-stack (no copy) tmp%79#0,awst_tmp%13#0,tmp%76#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 + uncover 2 // load tmp%79#0 from l-stack (no copy) awst_tmp%13#0,tmp%76#0,tmp%79#0 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 callsub swap // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 int 1 // 1 arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 return // arc4.abimethod(\ndefault_args={\n"a_asset": "asset_a",\n"b_asset": "asset_b",\n},\n) amm/contract.py:206-211 @@ -457,18 +457,18 @@ _create_pool_token_block@0: int 0 // 0 self.asset_a amm/contract.py:274 byte "asset_a" // 0,"asset_a" self.asset_a amm/contract.py:274 app_global_get_ex // {app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:274 - // virtual: store asset_a_exists%5#0 to l-stack (no copy) asset_a_exists%5#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:274 - // virtual: store asset_a_value%4#0 to l-stack (no copy) asset_a_value%4#0,asset_a_exists%5#0 self.asset_a amm/contract.py:274 - // virtual: load asset_a_exists%5#0 from l-stack (no copy) asset_a_value%4#0,asset_a_exists%5#0 self.asset_a amm/contract.py:274 - assert // check asset_a exists // asset_a_value%4#0 self.asset_a amm/contract.py:274 - // virtual: load asset_a_value%4#0 from l-stack (no copy) asset_a_value%4#0 self.asset_a.unit_name amm/contract.py:274 + // virtual: store asset_a_exists%3#0 to l-stack (no copy) asset_a_exists%3#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:274 + // virtual: store asset_a_value%2#0 to l-stack (no copy) asset_a_value%2#0,asset_a_exists%3#0 self.asset_a amm/contract.py:274 + // virtual: load asset_a_exists%3#0 from l-stack (no copy) asset_a_value%2#0,asset_a_exists%3#0 self.asset_a amm/contract.py:274 + assert // check asset_a exists // asset_a_value%2#0 self.asset_a amm/contract.py:274 + // virtual: load asset_a_value%2#0 from l-stack (no copy) asset_a_value%2#0 self.asset_a.unit_name amm/contract.py:274 asset_params_get AssetUnitName // {asset_params_get}.0,{asset_params_get}.1 self.asset_a.unit_name amm/contract.py:274 - // virtual: store maybe_value_did_exist%3#0 to l-stack (no copy) maybe_value_did_exist%3#0,{asset_params_get}.0 self.asset_a.unit_name amm/contract.py:274 - // virtual: store maybe_value%2#0 to l-stack (no copy) maybe_value%2#0,maybe_value_did_exist%3#0 self.asset_a.unit_name amm/contract.py:274 - // virtual: load maybe_value_did_exist%3#0 from l-stack (no copy) maybe_value%2#0,maybe_value_did_exist%3#0 self.asset_a.unit_name amm/contract.py:274 - assert // asset exists // maybe_value%2#0 self.asset_a.unit_name amm/contract.py:274 - byte "DPT-" // maybe_value%2#0,"DPT-" b"DPT-" amm/contract.py:274 - swap // load maybe_value%2#0 from l-stack (no copy) "DPT-",maybe_value%2#0 b"DPT-" + self.asset_a.unit_name amm/contract.py:274 + // virtual: store check%5#0 to l-stack (no copy) check%5#0,{asset_params_get}.0 self.asset_a.unit_name amm/contract.py:274 + // virtual: store value%4#0 to l-stack (no copy) value%4#0,check%5#0 self.asset_a.unit_name amm/contract.py:274 + // virtual: load check%5#0 from l-stack (no copy) value%4#0,check%5#0 self.asset_a.unit_name amm/contract.py:274 + assert // asset exists // value%4#0 self.asset_a.unit_name amm/contract.py:274 + byte "DPT-" // value%4#0,"DPT-" b"DPT-" amm/contract.py:274 + swap // load value%4#0 from l-stack (no copy) "DPT-",value%4#0 b"DPT-" + self.asset_a.unit_name amm/contract.py:274 concat // {concat} b"DPT-" + self.asset_a.unit_name amm/contract.py:274 // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 b"DPT-" + self.asset_a.unit_name amm/contract.py:274 // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 b"DPT-" + self.asset_a.unit_name + b"-" amm/contract.py:274 @@ -478,18 +478,18 @@ _create_pool_token_block@0: int 0 // tmp%7#0,0 self.asset_b amm/contract.py:274 byte "asset_b" // tmp%7#0,0,"asset_b" self.asset_b amm/contract.py:274 app_global_get_ex // tmp%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:274 - // virtual: store asset_b_exists%11#0 to l-stack (no copy) tmp%7#0,asset_b_exists%11#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:274 - // virtual: store asset_b_value%10#0 to l-stack (no copy) tmp%7#0,asset_b_value%10#0,asset_b_exists%11#0 self.asset_b amm/contract.py:274 - // virtual: load asset_b_exists%11#0 from l-stack (no copy) tmp%7#0,asset_b_value%10#0,asset_b_exists%11#0 self.asset_b amm/contract.py:274 - assert // check asset_b exists // tmp%7#0,asset_b_value%10#0 self.asset_b amm/contract.py:274 - // virtual: load asset_b_value%10#0 from l-stack (no copy) tmp%7#0,asset_b_value%10#0 self.asset_b.unit_name amm/contract.py:274 + // virtual: store asset_b_exists%9#0 to l-stack (no copy) tmp%7#0,asset_b_exists%9#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:274 + // virtual: store asset_b_value%8#0 to l-stack (no copy) tmp%7#0,asset_b_value%8#0,asset_b_exists%9#0 self.asset_b amm/contract.py:274 + // virtual: load asset_b_exists%9#0 from l-stack (no copy) tmp%7#0,asset_b_value%8#0,asset_b_exists%9#0 self.asset_b amm/contract.py:274 + assert // check asset_b exists // tmp%7#0,asset_b_value%8#0 self.asset_b amm/contract.py:274 + // virtual: load asset_b_value%8#0 from l-stack (no copy) tmp%7#0,asset_b_value%8#0 self.asset_b.unit_name amm/contract.py:274 asset_params_get AssetUnitName // tmp%7#0,{asset_params_get}.0,{asset_params_get}.1 self.asset_b.unit_name amm/contract.py:274 - // virtual: store maybe_value_did_exist%9#0 to l-stack (no copy) tmp%7#0,maybe_value_did_exist%9#0,{asset_params_get}.0 self.asset_b.unit_name amm/contract.py:274 - // virtual: store maybe_value%8#0 to l-stack (no copy) tmp%7#0,maybe_value%8#0,maybe_value_did_exist%9#0 self.asset_b.unit_name amm/contract.py:274 - // virtual: load maybe_value_did_exist%9#0 from l-stack (no copy) tmp%7#0,maybe_value%8#0,maybe_value_did_exist%9#0 self.asset_b.unit_name amm/contract.py:274 - assert // asset exists // tmp%7#0,maybe_value%8#0 self.asset_b.unit_name amm/contract.py:274 - // virtual: load tmp%7#0 from l-stack (no copy) maybe_value%8#0,tmp%7#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 - // virtual: load maybe_value%8#0 from l-stack (no copy) tmp%7#0,maybe_value%8#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 + // virtual: store check%11#0 to l-stack (no copy) tmp%7#0,check%11#0,{asset_params_get}.0 self.asset_b.unit_name amm/contract.py:274 + // virtual: store value%10#0 to l-stack (no copy) tmp%7#0,value%10#0,check%11#0 self.asset_b.unit_name amm/contract.py:274 + // virtual: load check%11#0 from l-stack (no copy) tmp%7#0,value%10#0,check%11#0 self.asset_b.unit_name amm/contract.py:274 + assert // asset exists // tmp%7#0,value%10#0 self.asset_b.unit_name amm/contract.py:274 + // virtual: load tmp%7#0 from l-stack (no copy) value%10#0,tmp%7#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 + // virtual: load value%10#0 from l-stack (no copy) tmp%7#0,value%10#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 concat // {concat} b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 // virtual: store inner_txn_params%1%%param_ConfigAssetName_idx_0#0 to l-stack (no copy) inner_txn_params%1%%param_ConfigAssetName_idx_0#0 b"DPT-" + self.asset_a.unit_name + b"-" + self.asset_b.unit_name amm/contract.py:274 global CurrentApplicationAddress // inner_txn_params%1%%param_ConfigAssetName_idx_0#0,{global} Global.current_application_address amm/contract.py:278 @@ -751,23 +751,23 @@ _current_pool_balance: _current_pool_balance_block@0: global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:296 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:296 - int 0 // tmp%2#0,0 self.pool_token amm/contract.py:296 - byte "pool_token" // tmp%2#0,0,"pool_token" self.pool_token amm/contract.py:296 - app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:296 - // virtual: store pool_token_exists%4#0 to l-stack (no copy) tmp%2#0,pool_token_exists%4#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:296 - // virtual: store pool_token_value%3#0 to l-stack (no copy) tmp%2#0,pool_token_value%3#0,pool_token_exists%4#0 self.pool_token amm/contract.py:296 - // virtual: load pool_token_exists%4#0 from l-stack (no copy) tmp%2#0,pool_token_value%3#0,pool_token_exists%4#0 self.pool_token amm/contract.py:296 - assert // check pool_token exists // tmp%2#0,pool_token_value%3#0 self.pool_token amm/contract.py:296 - // virtual: load tmp%2#0 from l-stack (no copy) pool_token_value%3#0,tmp%2#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: load pool_token_value%3#0 from l-stack (no copy) tmp%2#0,pool_token_value%3#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Global.current_application_address amm/contract.py:296 + int 0 // tmp%0#0,0 self.pool_token amm/contract.py:296 + byte "pool_token" // tmp%0#0,0,"pool_token" self.pool_token amm/contract.py:296 + app_global_get_ex // tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.pool_token amm/contract.py:296 + // virtual: store pool_token_exists%2#0 to l-stack (no copy) tmp%0#0,pool_token_exists%2#0,{app_global_get_ex}.0 self.pool_token amm/contract.py:296 + // virtual: store pool_token_value%1#0 to l-stack (no copy) tmp%0#0,pool_token_value%1#0,pool_token_exists%2#0 self.pool_token amm/contract.py:296 + // virtual: load pool_token_exists%2#0 from l-stack (no copy) tmp%0#0,pool_token_value%1#0,pool_token_exists%2#0 self.pool_token amm/contract.py:296 + assert // check pool_token exists // tmp%0#0,pool_token_value%1#0 self.pool_token amm/contract.py:296 + // virtual: load tmp%0#0 from l-stack (no copy) pool_token_value%1#0,tmp%0#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: load pool_token_value%1#0 from l-stack (no copy) tmp%0#0,pool_token_value%1#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - assert // account opted into asset // maybe_value%0#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 - retsub // maybe_value%0#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: store check%4#0 to l-stack (no copy) check%4#0,{asset_holding_get}.0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: store value%3#0 to l-stack (no copy) value%3#0,check%4#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: load check%4#0 from l-stack (no copy) value%3#0,check%4#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + assert // account opted into asset // value%3#0 self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + // virtual: load value%3#0 from l-stack (no copy) value%3#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 + retsub // value%3#0 return self.pool_token.balance(Global.current_application_address) amm/contract.py:296 // examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: @@ -776,23 +776,23 @@ _current_a_balance: _current_a_balance_block@0: global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:300 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:300 - int 0 // tmp%2#0,0 self.asset_a amm/contract.py:300 - byte "asset_a" // tmp%2#0,0,"asset_a" self.asset_a amm/contract.py:300 - app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:300 - // virtual: store asset_a_exists%4#0 to l-stack (no copy) tmp%2#0,asset_a_exists%4#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:300 - // virtual: store asset_a_value%3#0 to l-stack (no copy) tmp%2#0,asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:300 - // virtual: load asset_a_exists%4#0 from l-stack (no copy) tmp%2#0,asset_a_value%3#0,asset_a_exists%4#0 self.asset_a amm/contract.py:300 - assert // check asset_a exists // tmp%2#0,asset_a_value%3#0 self.asset_a amm/contract.py:300 - // virtual: load tmp%2#0 from l-stack (no copy) asset_a_value%3#0,tmp%2#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: load asset_a_value%3#0 from l-stack (no copy) tmp%2#0,asset_a_value%3#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Global.current_application_address amm/contract.py:300 + int 0 // tmp%0#0,0 self.asset_a amm/contract.py:300 + byte "asset_a" // tmp%0#0,0,"asset_a" self.asset_a amm/contract.py:300 + app_global_get_ex // tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_a amm/contract.py:300 + // virtual: store asset_a_exists%2#0 to l-stack (no copy) tmp%0#0,asset_a_exists%2#0,{app_global_get_ex}.0 self.asset_a amm/contract.py:300 + // virtual: store asset_a_value%1#0 to l-stack (no copy) tmp%0#0,asset_a_value%1#0,asset_a_exists%2#0 self.asset_a amm/contract.py:300 + // virtual: load asset_a_exists%2#0 from l-stack (no copy) tmp%0#0,asset_a_value%1#0,asset_a_exists%2#0 self.asset_a amm/contract.py:300 + assert // check asset_a exists // tmp%0#0,asset_a_value%1#0 self.asset_a amm/contract.py:300 + // virtual: load tmp%0#0 from l-stack (no copy) asset_a_value%1#0,tmp%0#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: load asset_a_value%1#0 from l-stack (no copy) tmp%0#0,asset_a_value%1#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - assert // account opted into asset // maybe_value%0#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 - retsub // maybe_value%0#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: store check%4#0 to l-stack (no copy) check%4#0,{asset_holding_get}.0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: store value%3#0 to l-stack (no copy) value%3#0,check%4#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: load check%4#0 from l-stack (no copy) value%3#0,check%4#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + assert // account opted into asset // value%3#0 self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + // virtual: load value%3#0 from l-stack (no copy) value%3#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 + retsub // value%3#0 return self.asset_a.balance(Global.current_application_address) amm/contract.py:300 // examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: @@ -801,23 +801,23 @@ _current_b_balance: _current_b_balance_block@0: global CurrentApplicationAddress // {global} Global.current_application_address amm/contract.py:304 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Global.current_application_address amm/contract.py:304 - int 0 // tmp%2#0,0 self.asset_b amm/contract.py:304 - byte "asset_b" // tmp%2#0,0,"asset_b" self.asset_b amm/contract.py:304 - app_global_get_ex // tmp%2#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:304 - // virtual: store asset_b_exists%4#0 to l-stack (no copy) tmp%2#0,asset_b_exists%4#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:304 - // virtual: store asset_b_value%3#0 to l-stack (no copy) tmp%2#0,asset_b_value%3#0,asset_b_exists%4#0 self.asset_b amm/contract.py:304 - // virtual: load asset_b_exists%4#0 from l-stack (no copy) tmp%2#0,asset_b_value%3#0,asset_b_exists%4#0 self.asset_b amm/contract.py:304 - assert // check asset_b exists // tmp%2#0,asset_b_value%3#0 self.asset_b amm/contract.py:304 - // virtual: load tmp%2#0 from l-stack (no copy) asset_b_value%3#0,tmp%2#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: load asset_b_value%3#0 from l-stack (no copy) tmp%2#0,asset_b_value%3#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: store tmp%0#0 to l-stack (no copy) tmp%0#0 Global.current_application_address amm/contract.py:304 + int 0 // tmp%0#0,0 self.asset_b amm/contract.py:304 + byte "asset_b" // tmp%0#0,0,"asset_b" self.asset_b amm/contract.py:304 + app_global_get_ex // tmp%0#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.asset_b amm/contract.py:304 + // virtual: store asset_b_exists%2#0 to l-stack (no copy) tmp%0#0,asset_b_exists%2#0,{app_global_get_ex}.0 self.asset_b amm/contract.py:304 + // virtual: store asset_b_value%1#0 to l-stack (no copy) tmp%0#0,asset_b_value%1#0,asset_b_exists%2#0 self.asset_b amm/contract.py:304 + // virtual: load asset_b_exists%2#0 from l-stack (no copy) tmp%0#0,asset_b_value%1#0,asset_b_exists%2#0 self.asset_b amm/contract.py:304 + assert // check asset_b exists // tmp%0#0,asset_b_value%1#0 self.asset_b amm/contract.py:304 + // virtual: load tmp%0#0 from l-stack (no copy) asset_b_value%1#0,tmp%0#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: load asset_b_value%1#0 from l-stack (no copy) tmp%0#0,asset_b_value%1#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 asset_holding_get AssetBalance // {asset_holding_get}.0,{asset_holding_get}.1 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) maybe_value_did_exist%1#0,{asset_holding_get}.0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: store maybe_value%0#0 to l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) maybe_value%0#0,maybe_value_did_exist%1#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - assert // account opted into asset // maybe_value%0#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - // virtual: load maybe_value%0#0 from l-stack (no copy) maybe_value%0#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 - retsub // maybe_value%0#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: store check%4#0 to l-stack (no copy) check%4#0,{asset_holding_get}.0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: store value%3#0 to l-stack (no copy) value%3#0,check%4#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: load check%4#0 from l-stack (no copy) value%3#0,check%4#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + assert // account opted into asset // value%3#0 self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + // virtual: load value%3#0 from l-stack (no copy) value%3#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 + retsub // value%3#0 return self.asset_b.balance(Global.current_application_address) amm/contract.py:304 // examples.amm.contract.tokens_to_mint(pool_balance: uint64, a_balance: uint64, b_balance: uint64, a_amount: uint64, b_amount: uint64) -> uint64: diff --git a/examples/amm/out/ConstantProductAMM.destructured.ir b/examples/amm/out/ConstantProductAMM.destructured.ir index 0f6c9ea9fa..46832a4d6e 100644 --- a/examples/amm/out/ConstantProductAMM.destructured.ir +++ b/examples/amm/out/ConstantProductAMM.destructured.ir @@ -30,18 +30,18 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%10#0) // OnCompletion is NoOp let tmp%11#0: uint64 = (txn ApplicationID) (assert tmp%11#0) // is not creating - let tmp%14#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) - let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%17#0: uint64 = (== tmp%16#0 pay) - (assert tmp%17#0) // transaction type is pay + let tmp%12#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%12#0 1u) + let tmp%14#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%15#0: uint64 = (== tmp%14#0 pay) + (assert tmp%15#0) // transaction type is pay let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Assets) tmp%19#0) let tmp%21#0: bytes = (txna ApplicationArgs 2) let tmp%22#0: uint64 = (btoi tmp%21#0) let tmp%23#0: uint64 = ((txnas Assets) tmp%22#0) - let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(awst_tmp%15#0, tmp%20#0, tmp%23#0) + let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(awst_tmp%13#0, tmp%20#0, tmp%23#0) let tmp%25#0: bytes = (concat 0x151f7c75 tmp%24#0) (log tmp%25#0) return 1u @@ -51,16 +51,16 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%27#0) // OnCompletion is NoOp let tmp%28#0: uint64 = (txn ApplicationID) (assert tmp%28#0) // is not creating - let tmp%31#0: uint64 = (txn GroupIndex) - let awst_tmp%32#0: uint64 = (- tmp%31#0 2u) - let tmp%33#0: uint64 = ((gtxns TypeEnum) awst_tmp%32#0) - let tmp%34#0: uint64 = (== tmp%33#0 axfer) - (assert tmp%34#0) // transaction type is axfer - let tmp%37#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%37#0 1u) - let tmp%38#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%39#0: uint64 = (== tmp%38#0 axfer) - (assert tmp%39#0) // transaction type is axfer + let tmp%29#0: uint64 = (txn GroupIndex) + let awst_tmp%30#0: uint64 = (- tmp%29#0 2u) + let tmp%31#0: uint64 = ((gtxns TypeEnum) awst_tmp%30#0) + let tmp%32#0: uint64 = (== tmp%31#0 axfer) + (assert tmp%32#0) // transaction type is axfer + let tmp%35#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%35#0 1u) + let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%37#0: uint64 = (== tmp%36#0 axfer) + (assert tmp%37#0) // transaction type is axfer let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: uint64 = (btoi tmp%40#0) let tmp%42#0: uint64 = ((txnas Assets) tmp%41#0) @@ -70,7 +70,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%46#0: bytes = (txna ApplicationArgs 3) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Assets) tmp%47#0) - examples.amm.contract.ConstantProductAMM.mint(awst_tmp%32#0, awst_tmp%15#0, tmp%42#0, tmp%45#0, tmp%48#0) + examples.amm.contract.ConstantProductAMM.mint(awst_tmp%30#0, awst_tmp%13#0, tmp%42#0, tmp%45#0, tmp%48#0) return 1u block@7: // burn_route_L149 let tmp%49#0: uint64 = (txn OnCompletion) @@ -78,11 +78,11 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%50#0) // OnCompletion is NoOp let tmp%51#0: uint64 = (txn ApplicationID) (assert tmp%51#0) // is not creating - let tmp%54#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%54#0 1u) - let tmp%55#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%56#0: uint64 = (== tmp%55#0 axfer) - (assert tmp%56#0) // transaction type is axfer + let tmp%52#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%52#0 1u) + let tmp%53#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%54#0: uint64 = (== tmp%53#0 axfer) + (assert tmp%54#0) // transaction type is axfer let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let tmp%59#0: uint64 = ((txnas Assets) tmp%58#0) @@ -92,7 +92,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%63#0: bytes = (txna ApplicationArgs 3) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Assets) tmp%64#0) - examples.amm.contract.ConstantProductAMM.burn(awst_tmp%15#0, tmp%59#0, tmp%62#0, tmp%65#0) + examples.amm.contract.ConstantProductAMM.burn(awst_tmp%13#0, tmp%59#0, tmp%62#0, tmp%65#0) return 1u block@8: // swap_route_L206 let tmp%66#0: uint64 = (txn OnCompletion) @@ -100,18 +100,18 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%67#0) // OnCompletion is NoOp let tmp%68#0: uint64 = (txn ApplicationID) (assert tmp%68#0) // is not creating - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%73#0: uint64 = (== tmp%72#0 axfer) - (assert tmp%73#0) // transaction type is axfer + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%71#0: uint64 = (== tmp%70#0 axfer) + (assert tmp%71#0) // transaction type is axfer let tmp%74#0: bytes = (txna ApplicationArgs 1) let tmp%75#0: uint64 = (btoi tmp%74#0) let tmp%76#0: uint64 = ((txnas Assets) tmp%75#0) let tmp%77#0: bytes = (txna ApplicationArgs 2) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Assets) tmp%78#0) - examples.amm.contract.ConstantProductAMM.swap(awst_tmp%15#0, tmp%76#0, tmp%79#0) + examples.amm.contract.ConstantProductAMM.swap(awst_tmp%13#0, tmp%76#0, tmp%79#0) return 1u block@11: // bare_routing_L27 let tmp%80#0: uint64 = (txn OnCompletion) @@ -174,17 +174,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) - (assert maybe_value_did_exist%3#0) // asset exists - let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) + let (asset_a_value%2#0: uint64, asset_a_exists%3#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%3#0) // check asset_a exists + let (value%4#0: bytes, check%5#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%2#0) + (assert check%5#0) // asset exists + let tmp%6#0: bytes = (concat "DPT-" value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) - (assert maybe_value_did_exist%9#0) // asset exists - let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) + let (asset_b_value%8#0: uint64, asset_b_exists%9#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%9#0) // check asset_b exists + let (value%10#0: bytes, check%11#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%8#0) + (assert check%11#0) // asset exists + let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 value%10#0) let inner_txn_params%1%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) ((itxn_field ConfigAssetUnitName) "dbt") @@ -285,30 +285,30 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert pool_token_exists%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (pool_token_value%1#0: uint64, pool_token_exists%2#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%2#0) // check pool_token exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 pool_token_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_a_value%1#0: uint64, asset_a_exists%2#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%2#0) // check asset_a exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_a_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_b_value%1#0: uint64, asset_b_exists%2#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%2#0) // check asset_b exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_b_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.tokens_to_mint(pool_balance: uint64, a_balance: uint64, b_balance: uint64, a_amount: uint64, b_amount: uint64) -> uint64: block@0: // L325 diff --git a/examples/amm/out/ConstantProductAMM.ssa.ir b/examples/amm/out/ConstantProductAMM.ssa.ir index 7c892813e4..cf1eacb305 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.ir @@ -30,19 +30,19 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%10#0) // OnCompletion is NoOp let tmp%11#0: uint64 = (txn ApplicationID) (assert tmp%11#0) // is not creating - let tmp%14#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) - let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%17#0: uint64 = (== tmp%16#0 pay) - let (maybe_value%12#0: uint64, maybe_value_did_exist%13#0: uint64) = (awst_tmp%15#0, tmp%17#0) - (assert maybe_value_did_exist%13#0) // transaction type is pay + let tmp%12#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%12#0 1u) + let tmp%14#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%15#0: uint64 = (== tmp%14#0 pay) + let (value%16#0: uint64, check%17#0: uint64) = (awst_tmp%13#0, tmp%15#0) + (assert check%17#0) // transaction type is pay let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Assets) tmp%19#0) let tmp%21#0: bytes = (txna ApplicationArgs 2) let tmp%22#0: uint64 = (btoi tmp%21#0) let tmp%23#0: uint64 = ((txnas Assets) tmp%22#0) - let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(maybe_value%12#0, tmp%20#0, tmp%23#0) + let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(value%16#0, tmp%20#0, tmp%23#0) let tmp%25#0: bytes = (concat 0x151f7c75 tmp%24#0) (log tmp%25#0) return 1u @@ -52,18 +52,18 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%27#0) // OnCompletion is NoOp let tmp%28#0: uint64 = (txn ApplicationID) (assert tmp%28#0) // is not creating - let tmp%31#0: uint64 = (txn GroupIndex) - let awst_tmp%32#0: uint64 = (- tmp%31#0 2u) - let tmp%33#0: uint64 = ((gtxns TypeEnum) awst_tmp%32#0) - let tmp%34#0: uint64 = (== tmp%33#0 axfer) - let (maybe_value%29#0: uint64, maybe_value_did_exist%30#0: uint64) = (awst_tmp%32#0, tmp%34#0) - (assert maybe_value_did_exist%30#0) // transaction type is axfer - let tmp%37#0: uint64 = (txn GroupIndex) - let awst_tmp%15#1: uint64 = (- tmp%37#0 1u) - let tmp%38#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#1) - let tmp%39#0: uint64 = (== tmp%38#0 axfer) - let (maybe_value%35#0: uint64, maybe_value_did_exist%36#0: uint64) = (awst_tmp%15#1, tmp%39#0) - (assert maybe_value_did_exist%36#0) // transaction type is axfer + let tmp%29#0: uint64 = (txn GroupIndex) + let awst_tmp%30#0: uint64 = (- tmp%29#0 2u) + let tmp%31#0: uint64 = ((gtxns TypeEnum) awst_tmp%30#0) + let tmp%32#0: uint64 = (== tmp%31#0 axfer) + let (value%33#0: uint64, check%34#0: uint64) = (awst_tmp%30#0, tmp%32#0) + (assert check%34#0) // transaction type is axfer + let tmp%35#0: uint64 = (txn GroupIndex) + let awst_tmp%13#1: uint64 = (- tmp%35#0 1u) + let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#1) + let tmp%37#0: uint64 = (== tmp%36#0 axfer) + let (value%38#0: uint64, check%39#0: uint64) = (awst_tmp%13#1, tmp%37#0) + (assert check%39#0) // transaction type is axfer let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: uint64 = (btoi tmp%40#0) let tmp%42#0: uint64 = ((txnas Assets) tmp%41#0) @@ -73,7 +73,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%46#0: bytes = (txna ApplicationArgs 3) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Assets) tmp%47#0) - examples.amm.contract.ConstantProductAMM.mint(maybe_value%29#0, maybe_value%35#0, tmp%42#0, tmp%45#0, tmp%48#0) + examples.amm.contract.ConstantProductAMM.mint(value%33#0, value%38#0, tmp%42#0, tmp%45#0, tmp%48#0) return 1u block@7: // burn_route_L149 let tmp%49#0: uint64 = (txn OnCompletion) @@ -81,12 +81,12 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%50#0) // OnCompletion is NoOp let tmp%51#0: uint64 = (txn ApplicationID) (assert tmp%51#0) // is not creating - let tmp%54#0: uint64 = (txn GroupIndex) - let awst_tmp%15#2: uint64 = (- tmp%54#0 1u) - let tmp%55#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#2) - let tmp%56#0: uint64 = (== tmp%55#0 axfer) - let (maybe_value%52#0: uint64, maybe_value_did_exist%53#0: uint64) = (awst_tmp%15#2, tmp%56#0) - (assert maybe_value_did_exist%53#0) // transaction type is axfer + let tmp%52#0: uint64 = (txn GroupIndex) + let awst_tmp%13#2: uint64 = (- tmp%52#0 1u) + let tmp%53#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#2) + let tmp%54#0: uint64 = (== tmp%53#0 axfer) + let (value%55#0: uint64, check%56#0: uint64) = (awst_tmp%13#2, tmp%54#0) + (assert check%56#0) // transaction type is axfer let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let tmp%59#0: uint64 = ((txnas Assets) tmp%58#0) @@ -96,7 +96,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%63#0: bytes = (txna ApplicationArgs 3) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Assets) tmp%64#0) - examples.amm.contract.ConstantProductAMM.burn(maybe_value%52#0, tmp%59#0, tmp%62#0, tmp%65#0) + examples.amm.contract.ConstantProductAMM.burn(value%55#0, tmp%59#0, tmp%62#0, tmp%65#0) return 1u block@8: // swap_route_L206 let tmp%66#0: uint64 = (txn OnCompletion) @@ -104,19 +104,19 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%67#0) // OnCompletion is NoOp let tmp%68#0: uint64 = (txn ApplicationID) (assert tmp%68#0) // is not creating - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%15#3: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#3) - let tmp%73#0: uint64 = (== tmp%72#0 axfer) - let (maybe_value%69#0: uint64, maybe_value_did_exist%70#0: uint64) = (awst_tmp%15#3, tmp%73#0) - (assert maybe_value_did_exist%70#0) // transaction type is axfer + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%13#3: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#3) + let tmp%71#0: uint64 = (== tmp%70#0 axfer) + let (value%72#0: uint64, check%73#0: uint64) = (awst_tmp%13#3, tmp%71#0) + (assert check%73#0) // transaction type is axfer let tmp%74#0: bytes = (txna ApplicationArgs 1) let tmp%75#0: uint64 = (btoi tmp%74#0) let tmp%76#0: uint64 = ((txnas Assets) tmp%75#0) let tmp%77#0: bytes = (txna ApplicationArgs 2) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Assets) tmp%78#0) - examples.amm.contract.ConstantProductAMM.swap(maybe_value%69#0, tmp%76#0, tmp%79#0) + examples.amm.contract.ConstantProductAMM.swap(value%72#0, tmp%76#0, tmp%79#0) return 1u block@9: // switch_case_default_L27 goto block@10 @@ -196,17 +196,17 @@ contract examples.amm.contract.ConstantProductAMM: let inner_txn_params%1%%Applications_length#0: uint64 = 0u let inner_txn_params%1%%AssetAmount_length#0: uint64 = 0u let inner_txn_params%1%%AssetCloseTo_length#0: uint64 = 0u - let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) - (assert maybe_value_did_exist%3#0) // asset exists - let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) + let (asset_a_value%2#0: uint64, asset_a_exists%3#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%3#0) // check asset_a exists + let (value%4#0: bytes, check%5#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%2#0) + (assert check%5#0) // asset exists + let tmp%6#0: bytes = (concat "DPT-" value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) - (assert maybe_value_did_exist%9#0) // asset exists - let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) + let (asset_b_value%8#0: uint64, asset_b_exists%9#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%9#0) // check asset_b exists + let (value%10#0: bytes, check%11#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%8#0) + (assert check%11#0) // asset exists + let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 value%10#0) let inner_txn_params%1%%ConfigAssetName_length#0: uint64 = 1u let inner_txn_params%1%%AssetReceiver_length#0: uint64 = 0u let inner_txn_params%1%%AssetSender_length#0: uint64 = 0u @@ -539,30 +539,30 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert pool_token_exists%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (pool_token_value%1#0: uint64, pool_token_exists%2#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%2#0) // check pool_token exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 pool_token_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_a_value%1#0: uint64, asset_a_exists%2#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%2#0) // check asset_a exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_a_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_b_value%1#0: uint64, asset_b_exists%2#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%2#0) // check asset_b exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_b_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.tokens_to_mint(pool_balance: uint64, a_balance: uint64, b_balance: uint64, a_amount: uint64, b_amount: uint64) -> uint64: block@0: // L325 diff --git a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir index 2d735b56b3..059035b7a9 100644 --- a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir +++ b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir @@ -30,18 +30,18 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%10#0) // OnCompletion is NoOp let tmp%11#0: uint64 = (txn ApplicationID) (assert tmp%11#0) // is not creating - let tmp%14#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) - let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%17#0: uint64 = (== tmp%16#0 pay) - (assert tmp%17#0) // transaction type is pay + let tmp%12#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%12#0 1u) + let tmp%14#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%15#0: uint64 = (== tmp%14#0 pay) + (assert tmp%15#0) // transaction type is pay let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Assets) tmp%19#0) let tmp%21#0: bytes = (txna ApplicationArgs 2) let tmp%22#0: uint64 = (btoi tmp%21#0) let tmp%23#0: uint64 = ((txnas Assets) tmp%22#0) - let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(awst_tmp%15#0, tmp%20#0, tmp%23#0) + let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(awst_tmp%13#0, tmp%20#0, tmp%23#0) let tmp%25#0: bytes = (concat 0x151f7c75 tmp%24#0) (log tmp%25#0) return 1u @@ -51,16 +51,16 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%27#0) // OnCompletion is NoOp let tmp%28#0: uint64 = (txn ApplicationID) (assert tmp%28#0) // is not creating - let tmp%31#0: uint64 = (txn GroupIndex) - let awst_tmp%32#0: uint64 = (- tmp%31#0 2u) - let tmp%33#0: uint64 = ((gtxns TypeEnum) awst_tmp%32#0) - let tmp%34#0: uint64 = (== tmp%33#0 axfer) - (assert tmp%34#0) // transaction type is axfer - let tmp%37#0: uint64 = (txn GroupIndex) - let awst_tmp%15#1: uint64 = (- tmp%37#0 1u) - let tmp%38#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#1) - let tmp%39#0: uint64 = (== tmp%38#0 axfer) - (assert tmp%39#0) // transaction type is axfer + let tmp%29#0: uint64 = (txn GroupIndex) + let awst_tmp%30#0: uint64 = (- tmp%29#0 2u) + let tmp%31#0: uint64 = ((gtxns TypeEnum) awst_tmp%30#0) + let tmp%32#0: uint64 = (== tmp%31#0 axfer) + (assert tmp%32#0) // transaction type is axfer + let tmp%35#0: uint64 = (txn GroupIndex) + let awst_tmp%13#1: uint64 = (- tmp%35#0 1u) + let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#1) + let tmp%37#0: uint64 = (== tmp%36#0 axfer) + (assert tmp%37#0) // transaction type is axfer let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: uint64 = (btoi tmp%40#0) let tmp%42#0: uint64 = ((txnas Assets) tmp%41#0) @@ -70,7 +70,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%46#0: bytes = (txna ApplicationArgs 3) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Assets) tmp%47#0) - examples.amm.contract.ConstantProductAMM.mint(awst_tmp%32#0, awst_tmp%15#1, tmp%42#0, tmp%45#0, tmp%48#0) + examples.amm.contract.ConstantProductAMM.mint(awst_tmp%30#0, awst_tmp%13#1, tmp%42#0, tmp%45#0, tmp%48#0) return 1u block@7: // burn_route_L149 let tmp%49#0: uint64 = (txn OnCompletion) @@ -78,11 +78,11 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%50#0) // OnCompletion is NoOp let tmp%51#0: uint64 = (txn ApplicationID) (assert tmp%51#0) // is not creating - let tmp%54#0: uint64 = (txn GroupIndex) - let awst_tmp%15#2: uint64 = (- tmp%54#0 1u) - let tmp%55#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#2) - let tmp%56#0: uint64 = (== tmp%55#0 axfer) - (assert tmp%56#0) // transaction type is axfer + let tmp%52#0: uint64 = (txn GroupIndex) + let awst_tmp%13#2: uint64 = (- tmp%52#0 1u) + let tmp%53#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#2) + let tmp%54#0: uint64 = (== tmp%53#0 axfer) + (assert tmp%54#0) // transaction type is axfer let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let tmp%59#0: uint64 = ((txnas Assets) tmp%58#0) @@ -92,7 +92,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%63#0: bytes = (txna ApplicationArgs 3) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Assets) tmp%64#0) - examples.amm.contract.ConstantProductAMM.burn(awst_tmp%15#2, tmp%59#0, tmp%62#0, tmp%65#0) + examples.amm.contract.ConstantProductAMM.burn(awst_tmp%13#2, tmp%59#0, tmp%62#0, tmp%65#0) return 1u block@8: // swap_route_L206 let tmp%66#0: uint64 = (txn OnCompletion) @@ -100,18 +100,18 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%67#0) // OnCompletion is NoOp let tmp%68#0: uint64 = (txn ApplicationID) (assert tmp%68#0) // is not creating - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%15#3: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#3) - let tmp%73#0: uint64 = (== tmp%72#0 axfer) - (assert tmp%73#0) // transaction type is axfer + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%13#3: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#3) + let tmp%71#0: uint64 = (== tmp%70#0 axfer) + (assert tmp%71#0) // transaction type is axfer let tmp%74#0: bytes = (txna ApplicationArgs 1) let tmp%75#0: uint64 = (btoi tmp%74#0) let tmp%76#0: uint64 = ((txnas Assets) tmp%75#0) let tmp%77#0: bytes = (txna ApplicationArgs 2) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Assets) tmp%78#0) - examples.amm.contract.ConstantProductAMM.swap(awst_tmp%15#3, tmp%76#0, tmp%79#0) + examples.amm.contract.ConstantProductAMM.swap(awst_tmp%13#3, tmp%76#0, tmp%79#0) return 1u block@11: // bare_routing_L27 let tmp%80#0: uint64 = (txn OnCompletion) @@ -174,17 +174,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) - (assert maybe_value_did_exist%3#0) // asset exists - let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) + let (asset_a_value%2#0: uint64, asset_a_exists%3#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%3#0) // check asset_a exists + let (value%4#0: bytes, check%5#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%2#0) + (assert check%5#0) // asset exists + let tmp%6#0: bytes = (concat "DPT-" value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) - (assert maybe_value_did_exist%9#0) // asset exists - let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) + let (asset_b_value%8#0: uint64, asset_b_exists%9#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%9#0) // check asset_b exists + let (value%10#0: bytes, check%11#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%8#0) + (assert check%11#0) // asset exists + let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 value%10#0) let inner_txn_params%1%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) ((itxn_field ConfigAssetUnitName) "dbt") @@ -285,30 +285,30 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert pool_token_exists%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (pool_token_value%1#0: uint64, pool_token_exists%2#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%2#0) // check pool_token exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 pool_token_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_a_value%1#0: uint64, asset_a_exists%2#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%2#0) // check asset_a exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_a_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_b_value%1#0: uint64, asset_b_exists%2#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%2#0) // check asset_b exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_b_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.tokens_to_mint(pool_balance: uint64, a_balance: uint64, b_balance: uint64, a_amount: uint64, b_amount: uint64) -> uint64: block@0: // L325 diff --git a/examples/amm/out_O2/ConstantProductAMM.destructured.ir b/examples/amm/out_O2/ConstantProductAMM.destructured.ir index 0f6c9ea9fa..46832a4d6e 100644 --- a/examples/amm/out_O2/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_O2/ConstantProductAMM.destructured.ir @@ -30,18 +30,18 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%10#0) // OnCompletion is NoOp let tmp%11#0: uint64 = (txn ApplicationID) (assert tmp%11#0) // is not creating - let tmp%14#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) - let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%17#0: uint64 = (== tmp%16#0 pay) - (assert tmp%17#0) // transaction type is pay + let tmp%12#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%12#0 1u) + let tmp%14#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%15#0: uint64 = (== tmp%14#0 pay) + (assert tmp%15#0) // transaction type is pay let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Assets) tmp%19#0) let tmp%21#0: bytes = (txna ApplicationArgs 2) let tmp%22#0: uint64 = (btoi tmp%21#0) let tmp%23#0: uint64 = ((txnas Assets) tmp%22#0) - let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(awst_tmp%15#0, tmp%20#0, tmp%23#0) + let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(awst_tmp%13#0, tmp%20#0, tmp%23#0) let tmp%25#0: bytes = (concat 0x151f7c75 tmp%24#0) (log tmp%25#0) return 1u @@ -51,16 +51,16 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%27#0) // OnCompletion is NoOp let tmp%28#0: uint64 = (txn ApplicationID) (assert tmp%28#0) // is not creating - let tmp%31#0: uint64 = (txn GroupIndex) - let awst_tmp%32#0: uint64 = (- tmp%31#0 2u) - let tmp%33#0: uint64 = ((gtxns TypeEnum) awst_tmp%32#0) - let tmp%34#0: uint64 = (== tmp%33#0 axfer) - (assert tmp%34#0) // transaction type is axfer - let tmp%37#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%37#0 1u) - let tmp%38#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%39#0: uint64 = (== tmp%38#0 axfer) - (assert tmp%39#0) // transaction type is axfer + let tmp%29#0: uint64 = (txn GroupIndex) + let awst_tmp%30#0: uint64 = (- tmp%29#0 2u) + let tmp%31#0: uint64 = ((gtxns TypeEnum) awst_tmp%30#0) + let tmp%32#0: uint64 = (== tmp%31#0 axfer) + (assert tmp%32#0) // transaction type is axfer + let tmp%35#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%35#0 1u) + let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%37#0: uint64 = (== tmp%36#0 axfer) + (assert tmp%37#0) // transaction type is axfer let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: uint64 = (btoi tmp%40#0) let tmp%42#0: uint64 = ((txnas Assets) tmp%41#0) @@ -70,7 +70,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%46#0: bytes = (txna ApplicationArgs 3) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Assets) tmp%47#0) - examples.amm.contract.ConstantProductAMM.mint(awst_tmp%32#0, awst_tmp%15#0, tmp%42#0, tmp%45#0, tmp%48#0) + examples.amm.contract.ConstantProductAMM.mint(awst_tmp%30#0, awst_tmp%13#0, tmp%42#0, tmp%45#0, tmp%48#0) return 1u block@7: // burn_route_L149 let tmp%49#0: uint64 = (txn OnCompletion) @@ -78,11 +78,11 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%50#0) // OnCompletion is NoOp let tmp%51#0: uint64 = (txn ApplicationID) (assert tmp%51#0) // is not creating - let tmp%54#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%54#0 1u) - let tmp%55#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%56#0: uint64 = (== tmp%55#0 axfer) - (assert tmp%56#0) // transaction type is axfer + let tmp%52#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%52#0 1u) + let tmp%53#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%54#0: uint64 = (== tmp%53#0 axfer) + (assert tmp%54#0) // transaction type is axfer let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let tmp%59#0: uint64 = ((txnas Assets) tmp%58#0) @@ -92,7 +92,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%63#0: bytes = (txna ApplicationArgs 3) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Assets) tmp%64#0) - examples.amm.contract.ConstantProductAMM.burn(awst_tmp%15#0, tmp%59#0, tmp%62#0, tmp%65#0) + examples.amm.contract.ConstantProductAMM.burn(awst_tmp%13#0, tmp%59#0, tmp%62#0, tmp%65#0) return 1u block@8: // swap_route_L206 let tmp%66#0: uint64 = (txn OnCompletion) @@ -100,18 +100,18 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%67#0) // OnCompletion is NoOp let tmp%68#0: uint64 = (txn ApplicationID) (assert tmp%68#0) // is not creating - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%73#0: uint64 = (== tmp%72#0 axfer) - (assert tmp%73#0) // transaction type is axfer + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%71#0: uint64 = (== tmp%70#0 axfer) + (assert tmp%71#0) // transaction type is axfer let tmp%74#0: bytes = (txna ApplicationArgs 1) let tmp%75#0: uint64 = (btoi tmp%74#0) let tmp%76#0: uint64 = ((txnas Assets) tmp%75#0) let tmp%77#0: bytes = (txna ApplicationArgs 2) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Assets) tmp%78#0) - examples.amm.contract.ConstantProductAMM.swap(awst_tmp%15#0, tmp%76#0, tmp%79#0) + examples.amm.contract.ConstantProductAMM.swap(awst_tmp%13#0, tmp%76#0, tmp%79#0) return 1u block@11: // bare_routing_L27 let tmp%80#0: uint64 = (txn OnCompletion) @@ -174,17 +174,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) - (assert maybe_value_did_exist%3#0) // asset exists - let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) + let (asset_a_value%2#0: uint64, asset_a_exists%3#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%3#0) // check asset_a exists + let (value%4#0: bytes, check%5#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%2#0) + (assert check%5#0) // asset exists + let tmp%6#0: bytes = (concat "DPT-" value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) - (assert maybe_value_did_exist%9#0) // asset exists - let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) + let (asset_b_value%8#0: uint64, asset_b_exists%9#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%9#0) // check asset_b exists + let (value%10#0: bytes, check%11#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%8#0) + (assert check%11#0) // asset exists + let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 value%10#0) let inner_txn_params%1%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) let inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0: bytes = (global CurrentApplicationAddress) ((itxn_field ConfigAssetUnitName) "dbt") @@ -285,30 +285,30 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert pool_token_exists%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (pool_token_value%1#0: uint64, pool_token_exists%2#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%2#0) // check pool_token exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 pool_token_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_a_value%1#0: uint64, asset_a_exists%2#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%2#0) // check asset_a exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_a_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_b_value%1#0: uint64, asset_b_exists%2#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%2#0) // check asset_b exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_b_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.tokens_to_mint(pool_balance: uint64, a_balance: uint64, b_balance: uint64, a_amount: uint64, b_amount: uint64) -> uint64: block@0: // L325 diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir index 92cedd2bf1..6b2acd5ac2 100644 --- a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir +++ b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir @@ -30,20 +30,20 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%10#0) // OnCompletion is NoOp let tmp%11#0: uint64 = (txn ApplicationID) (assert tmp%11#0) // is not creating - let tmp%14#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) - let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%17#0: uint64 = (== tmp%16#0 pay) - let maybe_value%12#0: uint64 = awst_tmp%15#0 - let maybe_value_did_exist%13#0: uint64 = tmp%17#0 - (assert maybe_value_did_exist%13#0) // transaction type is pay + let tmp%12#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%12#0 1u) + let tmp%14#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%15#0: uint64 = (== tmp%14#0 pay) + let value%16#0: uint64 = awst_tmp%13#0 + let check%17#0: uint64 = tmp%15#0 + (assert check%17#0) // transaction type is pay let tmp%18#0: bytes = (txna ApplicationArgs 1) let tmp%19#0: uint64 = (btoi tmp%18#0) let tmp%20#0: uint64 = ((txnas Assets) tmp%19#0) let tmp%21#0: bytes = (txna ApplicationArgs 2) let tmp%22#0: uint64 = (btoi tmp%21#0) let tmp%23#0: uint64 = ((txnas Assets) tmp%22#0) - let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(maybe_value%12#0, tmp%20#0, tmp%23#0) + let tmp%24#0: bytes = examples.amm.contract.ConstantProductAMM.bootstrap(value%16#0, tmp%20#0, tmp%23#0) let tmp%25#0: bytes = (concat 0x151f7c75 tmp%24#0) (log tmp%25#0) return 1u @@ -53,20 +53,20 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%27#0) // OnCompletion is NoOp let tmp%28#0: uint64 = (txn ApplicationID) (assert tmp%28#0) // is not creating - let tmp%31#0: uint64 = (txn GroupIndex) - let awst_tmp%32#0: uint64 = (- tmp%31#0 2u) - let tmp%33#0: uint64 = ((gtxns TypeEnum) awst_tmp%32#0) - let tmp%34#0: uint64 = (== tmp%33#0 axfer) - let maybe_value%29#0: uint64 = awst_tmp%32#0 - let maybe_value_did_exist%30#0: uint64 = tmp%34#0 - (assert maybe_value_did_exist%30#0) // transaction type is axfer - let tmp%37#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%37#0 1u) - let tmp%38#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%39#0: uint64 = (== tmp%38#0 axfer) - let maybe_value%35#0: uint64 = awst_tmp%15#0 - let maybe_value_did_exist%36#0: uint64 = tmp%39#0 - (assert maybe_value_did_exist%36#0) // transaction type is axfer + let tmp%29#0: uint64 = (txn GroupIndex) + let awst_tmp%30#0: uint64 = (- tmp%29#0 2u) + let tmp%31#0: uint64 = ((gtxns TypeEnum) awst_tmp%30#0) + let tmp%32#0: uint64 = (== tmp%31#0 axfer) + let value%33#0: uint64 = awst_tmp%30#0 + let check%34#0: uint64 = tmp%32#0 + (assert check%34#0) // transaction type is axfer + let tmp%35#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%35#0 1u) + let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%37#0: uint64 = (== tmp%36#0 axfer) + let value%38#0: uint64 = awst_tmp%13#0 + let check%39#0: uint64 = tmp%37#0 + (assert check%39#0) // transaction type is axfer let tmp%40#0: bytes = (txna ApplicationArgs 1) let tmp%41#0: uint64 = (btoi tmp%40#0) let tmp%42#0: uint64 = ((txnas Assets) tmp%41#0) @@ -76,7 +76,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%46#0: bytes = (txna ApplicationArgs 3) let tmp%47#0: uint64 = (btoi tmp%46#0) let tmp%48#0: uint64 = ((txnas Assets) tmp%47#0) - examples.amm.contract.ConstantProductAMM.mint(maybe_value%29#0, maybe_value%35#0, tmp%42#0, tmp%45#0, tmp%48#0) + examples.amm.contract.ConstantProductAMM.mint(value%33#0, value%38#0, tmp%42#0, tmp%45#0, tmp%48#0) return 1u block@7: // burn_route_L149 let tmp%49#0: uint64 = (txn OnCompletion) @@ -84,13 +84,13 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%50#0) // OnCompletion is NoOp let tmp%51#0: uint64 = (txn ApplicationID) (assert tmp%51#0) // is not creating - let tmp%54#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%54#0 1u) - let tmp%55#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%56#0: uint64 = (== tmp%55#0 axfer) - let maybe_value%52#0: uint64 = awst_tmp%15#0 - let maybe_value_did_exist%53#0: uint64 = tmp%56#0 - (assert maybe_value_did_exist%53#0) // transaction type is axfer + let tmp%52#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%52#0 1u) + let tmp%53#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%54#0: uint64 = (== tmp%53#0 axfer) + let value%55#0: uint64 = awst_tmp%13#0 + let check%56#0: uint64 = tmp%54#0 + (assert check%56#0) // transaction type is axfer let tmp%57#0: bytes = (txna ApplicationArgs 1) let tmp%58#0: uint64 = (btoi tmp%57#0) let tmp%59#0: uint64 = ((txnas Assets) tmp%58#0) @@ -100,7 +100,7 @@ contract examples.amm.contract.ConstantProductAMM: let tmp%63#0: bytes = (txna ApplicationArgs 3) let tmp%64#0: uint64 = (btoi tmp%63#0) let tmp%65#0: uint64 = ((txnas Assets) tmp%64#0) - examples.amm.contract.ConstantProductAMM.burn(maybe_value%52#0, tmp%59#0, tmp%62#0, tmp%65#0) + examples.amm.contract.ConstantProductAMM.burn(value%55#0, tmp%59#0, tmp%62#0, tmp%65#0) return 1u block@8: // swap_route_L206 let tmp%66#0: uint64 = (txn OnCompletion) @@ -108,20 +108,20 @@ contract examples.amm.contract.ConstantProductAMM: (assert tmp%67#0) // OnCompletion is NoOp let tmp%68#0: uint64 = (txn ApplicationID) (assert tmp%68#0) // is not creating - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%15#0: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) - let tmp%73#0: uint64 = (== tmp%72#0 axfer) - let maybe_value%69#0: uint64 = awst_tmp%15#0 - let maybe_value_did_exist%70#0: uint64 = tmp%73#0 - (assert maybe_value_did_exist%70#0) // transaction type is axfer + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%13#0: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%13#0) + let tmp%71#0: uint64 = (== tmp%70#0 axfer) + let value%72#0: uint64 = awst_tmp%13#0 + let check%73#0: uint64 = tmp%71#0 + (assert check%73#0) // transaction type is axfer let tmp%74#0: bytes = (txna ApplicationArgs 1) let tmp%75#0: uint64 = (btoi tmp%74#0) let tmp%76#0: uint64 = ((txnas Assets) tmp%75#0) let tmp%77#0: bytes = (txna ApplicationArgs 2) let tmp%78#0: uint64 = (btoi tmp%77#0) let tmp%79#0: uint64 = ((txnas Assets) tmp%78#0) - examples.amm.contract.ConstantProductAMM.swap(maybe_value%69#0, tmp%76#0, tmp%79#0) + examples.amm.contract.ConstantProductAMM.swap(value%72#0, tmp%76#0, tmp%79#0) return 1u block@9: // switch_case_default_L27 goto block@10 @@ -192,17 +192,17 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._create_pool_token() -> uint64: block@0: // L270 itxn_begin - let (asset_a_value%4#0: uint64, asset_a_exists%5#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%5#0) // check asset_a exists - let (maybe_value%2#0: bytes, maybe_value_did_exist%3#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%4#0) - (assert maybe_value_did_exist%3#0) // asset exists - let tmp%6#0: bytes = (concat "DPT-" maybe_value%2#0) + let (asset_a_value%2#0: uint64, asset_a_exists%3#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%3#0) // check asset_a exists + let (value%4#0: bytes, check%5#0: uint64) = ((asset_params_get AssetUnitName) asset_a_value%2#0) + (assert check%5#0) // asset exists + let tmp%6#0: bytes = (concat "DPT-" value%4#0) let tmp%7#0: bytes = (concat tmp%6#0 "-") - let (asset_b_value%10#0: uint64, asset_b_exists%11#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%11#0) // check asset_b exists - let (maybe_value%8#0: bytes, maybe_value_did_exist%9#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%10#0) - (assert maybe_value_did_exist%9#0) // asset exists - let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 maybe_value%8#0) + let (asset_b_value%8#0: uint64, asset_b_exists%9#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%9#0) // check asset_b exists + let (value%10#0: bytes, check%11#0: uint64) = ((asset_params_get AssetUnitName) asset_b_value%8#0) + (assert check%11#0) // asset exists + let inner_txn_params%1%%param_ConfigAssetName_idx_0#0: bytes = (concat tmp%7#0 value%10#0) let inner_txn_params%1%%param_ConfigAssetDecimals_idx_0#0: uint64 = 3u let inner_txn_params%1%%param_Fee_idx_0#0: uint64 = 0u let inner_txn_params%1%%param_ConfigAssetManager_idx_0#0: bytes = (global CurrentApplicationAddress) @@ -319,30 +319,30 @@ contract examples.amm.contract.ConstantProductAMM: subroutine examples.amm.contract.ConstantProductAMM._current_pool_balance() -> uint64: block@0: // L294 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (pool_token_value%3#0: uint64, pool_token_exists%4#0: uint64) = (app_global_get_ex 0u "pool_token") - (assert pool_token_exists%4#0) // check pool_token exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 pool_token_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (pool_token_value%1#0: uint64, pool_token_exists%2#0: uint64) = (app_global_get_ex 0u "pool_token") + (assert pool_token_exists%2#0) // check pool_token exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 pool_token_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_a_balance() -> uint64: block@0: // L298 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_a_value%3#0: uint64, asset_a_exists%4#0: uint64) = (app_global_get_ex 0u "asset_a") - (assert asset_a_exists%4#0) // check asset_a exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_a_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_a_value%1#0: uint64, asset_a_exists%2#0: uint64) = (app_global_get_ex 0u "asset_a") + (assert asset_a_exists%2#0) // check asset_a exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_a_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.ConstantProductAMM._current_b_balance() -> uint64: block@0: // L302 - let tmp%2#0: bytes = (global CurrentApplicationAddress) - let (asset_b_value%3#0: uint64, asset_b_exists%4#0: uint64) = (app_global_get_ex 0u "asset_b") - (assert asset_b_exists%4#0) // check asset_b exists - let (maybe_value%0#0: uint64, maybe_value_did_exist%1#0: uint64) = ((asset_holding_get AssetBalance) tmp%2#0 asset_b_value%3#0) - (assert maybe_value_did_exist%1#0) // account opted into asset - return maybe_value%0#0 + let tmp%0#0: bytes = (global CurrentApplicationAddress) + let (asset_b_value%1#0: uint64, asset_b_exists%2#0: uint64) = (app_global_get_ex 0u "asset_b") + (assert asset_b_exists%2#0) // check asset_b exists + let (value%3#0: uint64, check%4#0: uint64) = ((asset_holding_get AssetBalance) tmp%0#0 asset_b_value%1#0) + (assert check%4#0) // account opted into asset + return value%3#0 subroutine examples.amm.contract.tokens_to_mint(pool_balance: uint64, a_balance: uint64, b_balance: uint64, a_amount: uint64, b_amount: uint64) -> uint64: block@0: // L325 diff --git a/examples/amm/puya.log b/examples/amm/puya.log index 161cfc942d..5f59e92679 100644 --- a/examples/amm/puya.log +++ b/examples/amm/puya.log @@ -470,26 +470,26 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: awst_tmp%15#0, maybe_value%12#0 -debug: Replacing {maybe_value%12#0} with awst_tmp%15#0 made 1 modifications -debug: Found equivalence set: tmp%17#0, maybe_value_did_exist%13#0 -debug: Replacing {maybe_value_did_exist%13#0} with tmp%17#0 made 1 modifications -debug: Found equivalence set: awst_tmp%32#0, maybe_value%29#0 -debug: Replacing {maybe_value%29#0} with awst_tmp%32#0 made 1 modifications -debug: Found equivalence set: tmp%34#0, maybe_value_did_exist%30#0 -debug: Replacing {maybe_value_did_exist%30#0} with tmp%34#0 made 1 modifications -debug: Found equivalence set: awst_tmp%15#1, maybe_value%35#0 -debug: Replacing {maybe_value%35#0} with awst_tmp%15#1 made 1 modifications -debug: Found equivalence set: tmp%39#0, maybe_value_did_exist%36#0 -debug: Replacing {maybe_value_did_exist%36#0} with tmp%39#0 made 1 modifications -debug: Found equivalence set: awst_tmp%15#2, maybe_value%52#0 -debug: Replacing {maybe_value%52#0} with awst_tmp%15#2 made 1 modifications -debug: Found equivalence set: tmp%56#0, maybe_value_did_exist%53#0 -debug: Replacing {maybe_value_did_exist%53#0} with tmp%56#0 made 1 modifications -debug: Found equivalence set: awst_tmp%15#3, maybe_value%69#0 -debug: Replacing {maybe_value%69#0} with awst_tmp%15#3 made 1 modifications -debug: Found equivalence set: tmp%73#0, maybe_value_did_exist%70#0 -debug: Replacing {maybe_value_did_exist%70#0} with tmp%73#0 made 1 modifications +debug: Found equivalence set: awst_tmp%13#0, value%16#0 +debug: Replacing {value%16#0} with awst_tmp%13#0 made 1 modifications +debug: Found equivalence set: tmp%15#0, check%17#0 +debug: Replacing {check%17#0} with tmp%15#0 made 1 modifications +debug: Found equivalence set: awst_tmp%30#0, value%33#0 +debug: Replacing {value%33#0} with awst_tmp%30#0 made 1 modifications +debug: Found equivalence set: tmp%32#0, check%34#0 +debug: Replacing {check%34#0} with tmp%32#0 made 1 modifications +debug: Found equivalence set: awst_tmp%13#1, value%38#0 +debug: Replacing {value%38#0} with awst_tmp%13#1 made 1 modifications +debug: Found equivalence set: tmp%37#0, check%39#0 +debug: Replacing {check%39#0} with tmp%37#0 made 1 modifications +debug: Found equivalence set: awst_tmp%13#2, value%55#0 +debug: Replacing {value%55#0} with awst_tmp%13#2 made 1 modifications +debug: Found equivalence set: tmp%54#0, check%56#0 +debug: Replacing {check%56#0} with tmp%54#0 made 1 modifications +debug: Found equivalence set: awst_tmp%13#3, value%72#0 +debug: Replacing {value%72#0} with awst_tmp%13#3 made 1 modifications +debug: Found equivalence set: tmp%71#0, check%73#0 +debug: Replacing {check%73#0} with tmp%71#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops @@ -1247,7 +1247,7 @@ debug: Removing Phis from examples.amm.contract.tokens_to_swap debug: Removing Phis from examples.amm.contract.ConstantProductAMM.__init__ debug: Removing Phis from examples.amm.contract.ConstantProductAMM.clear_state_program debug: Coalescing local variables in examples.amm.contract.ConstantProductAMM.approval_program using strategy RootOperandGrouping -debug: Coalescing awst_tmp%15#0 with [awst_tmp%15#1, awst_tmp%15#2, awst_tmp%15#3] +debug: Coalescing awst_tmp%13#0 with [awst_tmp%13#1, awst_tmp%13#2, awst_tmp%13#3] debug: Coalescing resulted in 9 replacement/s debug: Coalescing local variables in examples.amm.contract.ConstantProductAMM.set_governor using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -1359,14 +1359,14 @@ debug: Inserted main_bootstrap_route@5.ops[5]: 'store tmp%10#0 to l-stack (copy) debug: Replaced main_bootstrap_route@5.ops[7]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' debug: Inserted main_bootstrap_route@5.ops[10]: 'store tmp%11#0 to l-stack (copy)' debug: Replaced main_bootstrap_route@5.ops[12]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@5.ops[15]: 'store tmp%14#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@5.ops[17]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@5.ops[20]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@5.ops[22]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@5.ops[24]: 'store tmp%16#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@5.ops[26]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@5.ops[29]: 'store tmp%17#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@5.ops[31]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@5.ops[15]: 'store tmp%12#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@5.ops[17]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@5.ops[20]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@5.ops[22]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@5.ops[24]: 'store tmp%14#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@5.ops[26]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@5.ops[29]: 'store tmp%15#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@5.ops[31]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' debug: Inserted main_bootstrap_route@5.ops[34]: 'store tmp%18#0 to l-stack (copy)' debug: Replaced main_bootstrap_route@5.ops[36]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' debug: Inserted main_bootstrap_route@5.ops[38]: 'store tmp%19#0 to l-stack (copy)' @@ -1383,30 +1383,30 @@ debug: Inserted main_bootstrap_route@5.ops[52]: 'store tmp%23#0 to l-stack (copy debug: Replaced main_bootstrap_route@5.ops[56]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' debug: Inserted main_bootstrap_route@5.ops[42]: 'store tmp%20#0 to l-stack (copy)' debug: Replaced main_bootstrap_route@5.ops[56]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@5.ops[23]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@5.ops[56]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@5.ops[23]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@5.ops[56]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' debug: Inserted main_mint_route@6.ops[1]: 'store tmp%26#0 to l-stack (copy)' debug: Replaced main_mint_route@6.ops[3]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' debug: Inserted main_mint_route@6.ops[5]: 'store tmp%27#0 to l-stack (copy)' debug: Replaced main_mint_route@6.ops[7]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' debug: Inserted main_mint_route@6.ops[10]: 'store tmp%28#0 to l-stack (copy)' debug: Replaced main_mint_route@6.ops[12]: 'load tmp%28#0' with 'load tmp%28#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[15]: 'store tmp%31#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[17]: 'load tmp%31#0' with 'load tmp%31#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[20]: 'store awst_tmp%32#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[22]: 'load awst_tmp%32#0' with 'load awst_tmp%32#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[24]: 'store tmp%33#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[26]: 'load tmp%33#0' with 'load tmp%33#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[29]: 'store tmp%34#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[31]: 'load tmp%34#0' with 'load tmp%34#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[34]: 'store tmp%37#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[36]: 'load tmp%37#0' with 'load tmp%37#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[39]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[41]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[43]: 'store tmp%38#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[45]: 'load tmp%38#0' with 'load tmp%38#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[48]: 'store tmp%39#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[50]: 'load tmp%39#0' with 'load tmp%39#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[15]: 'store tmp%29#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[17]: 'load tmp%29#0' with 'load tmp%29#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[20]: 'store awst_tmp%30#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[22]: 'load awst_tmp%30#0' with 'load awst_tmp%30#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[24]: 'store tmp%31#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[26]: 'load tmp%31#0' with 'load tmp%31#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[29]: 'store tmp%32#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[31]: 'load tmp%32#0' with 'load tmp%32#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[34]: 'store tmp%35#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[36]: 'load tmp%35#0' with 'load tmp%35#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[39]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[41]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[43]: 'store tmp%36#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[45]: 'load tmp%36#0' with 'load tmp%36#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[48]: 'store tmp%37#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[50]: 'load tmp%37#0' with 'load tmp%37#0 from l-stack (no copy)' debug: Inserted main_mint_route@6.ops[53]: 'store tmp%40#0 to l-stack (copy)' debug: Replaced main_mint_route@6.ops[55]: 'load tmp%40#0' with 'load tmp%40#0 from l-stack (no copy)' debug: Inserted main_mint_route@6.ops[57]: 'store tmp%41#0 to l-stack (copy)' @@ -1425,24 +1425,24 @@ debug: Inserted main_mint_route@6.ops[71]: 'store tmp%45#0 to l-stack (copy)' debug: Replaced main_mint_route@6.ops[87]: 'load tmp%45#0' with 'load tmp%45#0 from l-stack (no copy)' debug: Inserted main_mint_route@6.ops[61]: 'store tmp%42#0 to l-stack (copy)' debug: Replaced main_mint_route@6.ops[87]: 'load tmp%42#0' with 'load tmp%42#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[42]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[87]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' -debug: Inserted main_mint_route@6.ops[23]: 'store awst_tmp%32#0 to l-stack (copy)' -debug: Replaced main_mint_route@6.ops[87]: 'load awst_tmp%32#0' with 'load awst_tmp%32#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[42]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[87]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' +debug: Inserted main_mint_route@6.ops[23]: 'store awst_tmp%30#0 to l-stack (copy)' +debug: Replaced main_mint_route@6.ops[87]: 'load awst_tmp%30#0' with 'load awst_tmp%30#0 from l-stack (no copy)' debug: Inserted main_burn_route@7.ops[1]: 'store tmp%49#0 to l-stack (copy)' debug: Replaced main_burn_route@7.ops[3]: 'load tmp%49#0' with 'load tmp%49#0 from l-stack (no copy)' debug: Inserted main_burn_route@7.ops[5]: 'store tmp%50#0 to l-stack (copy)' debug: Replaced main_burn_route@7.ops[7]: 'load tmp%50#0' with 'load tmp%50#0 from l-stack (no copy)' debug: Inserted main_burn_route@7.ops[10]: 'store tmp%51#0 to l-stack (copy)' debug: Replaced main_burn_route@7.ops[12]: 'load tmp%51#0' with 'load tmp%51#0 from l-stack (no copy)' -debug: Inserted main_burn_route@7.ops[15]: 'store tmp%54#0 to l-stack (copy)' -debug: Replaced main_burn_route@7.ops[17]: 'load tmp%54#0' with 'load tmp%54#0 from l-stack (no copy)' -debug: Inserted main_burn_route@7.ops[20]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_burn_route@7.ops[22]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' -debug: Inserted main_burn_route@7.ops[24]: 'store tmp%55#0 to l-stack (copy)' -debug: Replaced main_burn_route@7.ops[26]: 'load tmp%55#0' with 'load tmp%55#0 from l-stack (no copy)' -debug: Inserted main_burn_route@7.ops[29]: 'store tmp%56#0 to l-stack (copy)' -debug: Replaced main_burn_route@7.ops[31]: 'load tmp%56#0' with 'load tmp%56#0 from l-stack (no copy)' +debug: Inserted main_burn_route@7.ops[15]: 'store tmp%52#0 to l-stack (copy)' +debug: Replaced main_burn_route@7.ops[17]: 'load tmp%52#0' with 'load tmp%52#0 from l-stack (no copy)' +debug: Inserted main_burn_route@7.ops[20]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_burn_route@7.ops[22]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' +debug: Inserted main_burn_route@7.ops[24]: 'store tmp%53#0 to l-stack (copy)' +debug: Replaced main_burn_route@7.ops[26]: 'load tmp%53#0' with 'load tmp%53#0 from l-stack (no copy)' +debug: Inserted main_burn_route@7.ops[29]: 'store tmp%54#0 to l-stack (copy)' +debug: Replaced main_burn_route@7.ops[31]: 'load tmp%54#0' with 'load tmp%54#0 from l-stack (no copy)' debug: Inserted main_burn_route@7.ops[34]: 'store tmp%57#0 to l-stack (copy)' debug: Replaced main_burn_route@7.ops[36]: 'load tmp%57#0' with 'load tmp%57#0 from l-stack (no copy)' debug: Inserted main_burn_route@7.ops[38]: 'store tmp%58#0 to l-stack (copy)' @@ -1461,22 +1461,22 @@ debug: Inserted main_burn_route@7.ops[52]: 'store tmp%62#0 to l-stack (copy)' debug: Replaced main_burn_route@7.ops[67]: 'load tmp%62#0' with 'load tmp%62#0 from l-stack (no copy)' debug: Inserted main_burn_route@7.ops[42]: 'store tmp%59#0 to l-stack (copy)' debug: Replaced main_burn_route@7.ops[67]: 'load tmp%59#0' with 'load tmp%59#0 from l-stack (no copy)' -debug: Inserted main_burn_route@7.ops[23]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_burn_route@7.ops[67]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' +debug: Inserted main_burn_route@7.ops[23]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_burn_route@7.ops[67]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' debug: Inserted main_swap_route@8.ops[1]: 'store tmp%66#0 to l-stack (copy)' debug: Replaced main_swap_route@8.ops[3]: 'load tmp%66#0' with 'load tmp%66#0 from l-stack (no copy)' debug: Inserted main_swap_route@8.ops[5]: 'store tmp%67#0 to l-stack (copy)' debug: Replaced main_swap_route@8.ops[7]: 'load tmp%67#0' with 'load tmp%67#0 from l-stack (no copy)' debug: Inserted main_swap_route@8.ops[10]: 'store tmp%68#0 to l-stack (copy)' debug: Replaced main_swap_route@8.ops[12]: 'load tmp%68#0' with 'load tmp%68#0 from l-stack (no copy)' -debug: Inserted main_swap_route@8.ops[15]: 'store tmp%71#0 to l-stack (copy)' -debug: Replaced main_swap_route@8.ops[17]: 'load tmp%71#0' with 'load tmp%71#0 from l-stack (no copy)' -debug: Inserted main_swap_route@8.ops[20]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_swap_route@8.ops[22]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' -debug: Inserted main_swap_route@8.ops[24]: 'store tmp%72#0 to l-stack (copy)' -debug: Replaced main_swap_route@8.ops[26]: 'load tmp%72#0' with 'load tmp%72#0 from l-stack (no copy)' -debug: Inserted main_swap_route@8.ops[29]: 'store tmp%73#0 to l-stack (copy)' -debug: Replaced main_swap_route@8.ops[31]: 'load tmp%73#0' with 'load tmp%73#0 from l-stack (no copy)' +debug: Inserted main_swap_route@8.ops[15]: 'store tmp%69#0 to l-stack (copy)' +debug: Replaced main_swap_route@8.ops[17]: 'load tmp%69#0' with 'load tmp%69#0 from l-stack (no copy)' +debug: Inserted main_swap_route@8.ops[20]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_swap_route@8.ops[22]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' +debug: Inserted main_swap_route@8.ops[24]: 'store tmp%70#0 to l-stack (copy)' +debug: Replaced main_swap_route@8.ops[26]: 'load tmp%70#0' with 'load tmp%70#0 from l-stack (no copy)' +debug: Inserted main_swap_route@8.ops[29]: 'store tmp%71#0 to l-stack (copy)' +debug: Replaced main_swap_route@8.ops[31]: 'load tmp%71#0' with 'load tmp%71#0 from l-stack (no copy)' debug: Inserted main_swap_route@8.ops[34]: 'store tmp%74#0 to l-stack (copy)' debug: Replaced main_swap_route@8.ops[36]: 'load tmp%74#0' with 'load tmp%74#0 from l-stack (no copy)' debug: Inserted main_swap_route@8.ops[38]: 'store tmp%75#0 to l-stack (copy)' @@ -1489,8 +1489,8 @@ debug: Inserted main_swap_route@8.ops[52]: 'store tmp%79#0 to l-stack (copy)' debug: Replaced main_swap_route@8.ops[56]: 'load tmp%79#0' with 'load tmp%79#0 from l-stack (no copy)' debug: Inserted main_swap_route@8.ops[42]: 'store tmp%76#0 to l-stack (copy)' debug: Replaced main_swap_route@8.ops[56]: 'load tmp%76#0' with 'load tmp%76#0 from l-stack (no copy)' -debug: Inserted main_swap_route@8.ops[23]: 'store awst_tmp%15#0 to l-stack (copy)' -debug: Replaced main_swap_route@8.ops[56]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' +debug: Inserted main_swap_route@8.ops[23]: 'store awst_tmp%13#0 to l-stack (copy)' +debug: Replaced main_swap_route@8.ops[56]: 'load awst_tmp%13#0' with 'load awst_tmp%13#0 from l-stack (no copy)' debug: Inserted main_bare_routing@11.ops[1]: 'store tmp%80#0 to l-stack (copy)' debug: Replaced main_bare_routing@11.ops[3]: 'load tmp%80#0' with 'load tmp%80#0 from l-stack (no copy)' debug: Inserted main_bare_routing@11.ops[5]: 'store not%tmp%80#0 to l-stack (copy)' @@ -1550,22 +1550,22 @@ debug: Inserted _create_pool_token_block@0.ops[17]: 'store tmp%6#0 to l-stack (c debug: Replaced _create_pool_token_block@0.ops[19]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[62]: 'store submit_result_0%0%%CreatedAssetID#0 to l-stack (copy)' debug: Replaced _create_pool_token_block@0.ops[64]: 'load submit_result_0%0%%CreatedAssetID#0' with 'load submit_result_0%0%%CreatedAssetID#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[4]: 'store asset_a_exists%5#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[7]: 'load asset_a_exists%5#0' with 'load asset_a_exists%5#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[11]: 'store maybe_value_did_exist%3#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[14]: 'load maybe_value_did_exist%3#0' with 'load maybe_value_did_exist%3#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[28]: 'store asset_b_exists%11#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[31]: 'load asset_b_exists%11#0' with 'load asset_b_exists%11#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[35]: 'store maybe_value_did_exist%9#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[38]: 'load maybe_value_did_exist%9#0' with 'load maybe_value_did_exist%9#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[6]: 'store asset_a_value%4#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[10]: 'load asset_a_value%4#0' with 'load asset_a_value%4#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[31]: 'store asset_b_value%10#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[35]: 'load asset_b_value%10#0' with 'load asset_b_value%10#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[14]: 'store maybe_value%2#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[19]: 'load maybe_value%2#0' with 'load maybe_value%2#0 from l-stack (no copy)' -debug: Inserted _create_pool_token_block@0.ops[40]: 'store maybe_value%8#0 to l-stack (copy)' -debug: Replaced _create_pool_token_block@0.ops[45]: 'load maybe_value%8#0' with 'load maybe_value%8#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[4]: 'store asset_a_exists%3#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[7]: 'load asset_a_exists%3#0' with 'load asset_a_exists%3#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[11]: 'store check%5#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[14]: 'load check%5#0' with 'load check%5#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[28]: 'store asset_b_exists%9#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[31]: 'load asset_b_exists%9#0' with 'load asset_b_exists%9#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[35]: 'store check%11#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[38]: 'load check%11#0' with 'load check%11#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[6]: 'store asset_a_value%2#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[10]: 'load asset_a_value%2#0' with 'load asset_a_value%2#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[31]: 'store asset_b_value%8#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[35]: 'load asset_b_value%8#0' with 'load asset_b_value%8#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[14]: 'store value%4#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[19]: 'load value%4#0' with 'load value%4#0 from l-stack (no copy)' +debug: Inserted _create_pool_token_block@0.ops[40]: 'store value%10#0 to l-stack (copy)' +debug: Replaced _create_pool_token_block@0.ops[45]: 'load value%10#0' with 'load value%10#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[51]: 'store inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 to l-stack (copy)' debug: Replaced _create_pool_token_block@0.ops[59]: 'load inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0' with 'load inner_txn_params%1%%param_ConfigAssetReserve_idx_0#0 from l-stack (no copy)' debug: Inserted _create_pool_token_block@0.ops[49]: 'store inner_txn_params%1%%param_ConfigAssetManager_idx_0#0 to l-stack (copy)' @@ -1668,36 +1668,36 @@ debug: Inserted _check_bootstrapped_block@0.ops[3]: 'store pool_token_exists%1#0 debug: Replaced _check_bootstrapped_block@0.ops[6]: 'load pool_token_exists%1#0' with 'load pool_token_exists%1#0 from l-stack (no copy)' debug: Inserted _check_bootstrapped_block@0.ops[5]: 'store pool_token_value%0#0 to l-stack (copy)' debug: Replaced _check_bootstrapped_block@0.ops[9]: 'load pool_token_value%0#0' with 'load pool_token_value%0#0 from l-stack (no copy)' -debug: Inserted _current_pool_balance_block@0.ops[5]: 'store pool_token_exists%4#0 to l-stack (copy)' -debug: Replaced _current_pool_balance_block@0.ops[8]: 'load pool_token_exists%4#0' with 'load pool_token_exists%4#0 from l-stack (no copy)' -debug: Inserted _current_pool_balance_block@0.ops[13]: 'store maybe_value_did_exist%1#0 to l-stack (copy)' -debug: Replaced _current_pool_balance_block@0.ops[16]: 'load maybe_value_did_exist%1#0' with 'load maybe_value_did_exist%1#0 from l-stack (no copy)' -debug: Inserted _current_pool_balance_block@0.ops[15]: 'store maybe_value%0#0 to l-stack (copy)' -debug: Replaced _current_pool_balance_block@0.ops[19]: 'load maybe_value%0#0' with 'load maybe_value%0#0 from l-stack (no copy)' -debug: Inserted _current_pool_balance_block@0.ops[7]: 'store pool_token_value%3#0 to l-stack (copy)' -debug: Replaced _current_pool_balance_block@0.ops[12]: 'load pool_token_value%3#0' with 'load pool_token_value%3#0 from l-stack (no copy)' -debug: Inserted _current_pool_balance_block@0.ops[1]: 'store tmp%2#0 to l-stack (copy)' -debug: Replaced _current_pool_balance_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' -debug: Inserted _current_a_balance_block@0.ops[5]: 'store asset_a_exists%4#0 to l-stack (copy)' -debug: Replaced _current_a_balance_block@0.ops[8]: 'load asset_a_exists%4#0' with 'load asset_a_exists%4#0 from l-stack (no copy)' -debug: Inserted _current_a_balance_block@0.ops[13]: 'store maybe_value_did_exist%1#0 to l-stack (copy)' -debug: Replaced _current_a_balance_block@0.ops[16]: 'load maybe_value_did_exist%1#0' with 'load maybe_value_did_exist%1#0 from l-stack (no copy)' -debug: Inserted _current_a_balance_block@0.ops[15]: 'store maybe_value%0#0 to l-stack (copy)' -debug: Replaced _current_a_balance_block@0.ops[19]: 'load maybe_value%0#0' with 'load maybe_value%0#0 from l-stack (no copy)' -debug: Inserted _current_a_balance_block@0.ops[7]: 'store asset_a_value%3#0 to l-stack (copy)' -debug: Replaced _current_a_balance_block@0.ops[12]: 'load asset_a_value%3#0' with 'load asset_a_value%3#0 from l-stack (no copy)' -debug: Inserted _current_a_balance_block@0.ops[1]: 'store tmp%2#0 to l-stack (copy)' -debug: Replaced _current_a_balance_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' -debug: Inserted _current_b_balance_block@0.ops[5]: 'store asset_b_exists%4#0 to l-stack (copy)' -debug: Replaced _current_b_balance_block@0.ops[8]: 'load asset_b_exists%4#0' with 'load asset_b_exists%4#0 from l-stack (no copy)' -debug: Inserted _current_b_balance_block@0.ops[13]: 'store maybe_value_did_exist%1#0 to l-stack (copy)' -debug: Replaced _current_b_balance_block@0.ops[16]: 'load maybe_value_did_exist%1#0' with 'load maybe_value_did_exist%1#0 from l-stack (no copy)' -debug: Inserted _current_b_balance_block@0.ops[15]: 'store maybe_value%0#0 to l-stack (copy)' -debug: Replaced _current_b_balance_block@0.ops[19]: 'load maybe_value%0#0' with 'load maybe_value%0#0 from l-stack (no copy)' -debug: Inserted _current_b_balance_block@0.ops[7]: 'store asset_b_value%3#0 to l-stack (copy)' -debug: Replaced _current_b_balance_block@0.ops[12]: 'load asset_b_value%3#0' with 'load asset_b_value%3#0 from l-stack (no copy)' -debug: Inserted _current_b_balance_block@0.ops[1]: 'store tmp%2#0 to l-stack (copy)' -debug: Replaced _current_b_balance_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' +debug: Inserted _current_pool_balance_block@0.ops[5]: 'store pool_token_exists%2#0 to l-stack (copy)' +debug: Replaced _current_pool_balance_block@0.ops[8]: 'load pool_token_exists%2#0' with 'load pool_token_exists%2#0 from l-stack (no copy)' +debug: Inserted _current_pool_balance_block@0.ops[13]: 'store check%4#0 to l-stack (copy)' +debug: Replaced _current_pool_balance_block@0.ops[16]: 'load check%4#0' with 'load check%4#0 from l-stack (no copy)' +debug: Inserted _current_pool_balance_block@0.ops[15]: 'store value%3#0 to l-stack (copy)' +debug: Replaced _current_pool_balance_block@0.ops[19]: 'load value%3#0' with 'load value%3#0 from l-stack (no copy)' +debug: Inserted _current_pool_balance_block@0.ops[7]: 'store pool_token_value%1#0 to l-stack (copy)' +debug: Replaced _current_pool_balance_block@0.ops[12]: 'load pool_token_value%1#0' with 'load pool_token_value%1#0 from l-stack (no copy)' +debug: Inserted _current_pool_balance_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced _current_pool_balance_block@0.ops[12]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' +debug: Inserted _current_a_balance_block@0.ops[5]: 'store asset_a_exists%2#0 to l-stack (copy)' +debug: Replaced _current_a_balance_block@0.ops[8]: 'load asset_a_exists%2#0' with 'load asset_a_exists%2#0 from l-stack (no copy)' +debug: Inserted _current_a_balance_block@0.ops[13]: 'store check%4#0 to l-stack (copy)' +debug: Replaced _current_a_balance_block@0.ops[16]: 'load check%4#0' with 'load check%4#0 from l-stack (no copy)' +debug: Inserted _current_a_balance_block@0.ops[15]: 'store value%3#0 to l-stack (copy)' +debug: Replaced _current_a_balance_block@0.ops[19]: 'load value%3#0' with 'load value%3#0 from l-stack (no copy)' +debug: Inserted _current_a_balance_block@0.ops[7]: 'store asset_a_value%1#0 to l-stack (copy)' +debug: Replaced _current_a_balance_block@0.ops[12]: 'load asset_a_value%1#0' with 'load asset_a_value%1#0 from l-stack (no copy)' +debug: Inserted _current_a_balance_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced _current_a_balance_block@0.ops[12]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' +debug: Inserted _current_b_balance_block@0.ops[5]: 'store asset_b_exists%2#0 to l-stack (copy)' +debug: Replaced _current_b_balance_block@0.ops[8]: 'load asset_b_exists%2#0' with 'load asset_b_exists%2#0 from l-stack (no copy)' +debug: Inserted _current_b_balance_block@0.ops[13]: 'store check%4#0 to l-stack (copy)' +debug: Replaced _current_b_balance_block@0.ops[16]: 'load check%4#0' with 'load check%4#0 from l-stack (no copy)' +debug: Inserted _current_b_balance_block@0.ops[15]: 'store value%3#0 to l-stack (copy)' +debug: Replaced _current_b_balance_block@0.ops[19]: 'load value%3#0' with 'load value%3#0 from l-stack (no copy)' +debug: Inserted _current_b_balance_block@0.ops[7]: 'store asset_b_value%1#0 to l-stack (copy)' +debug: Replaced _current_b_balance_block@0.ops[12]: 'load asset_b_value%1#0' with 'load asset_b_value%1#0 from l-stack (no copy)' +debug: Inserted _current_b_balance_block@0.ops[1]: 'store tmp%0#0 to l-stack (copy)' +debug: Replaced _current_b_balance_block@0.ops[12]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' debug: Inserted tokens_to_mint_block@0.ops[3]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced tokens_to_mint_block@0.ops[5]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' debug: Inserted tokens_to_mint_and_contd@1.ops[3]: 'store tmp%1#0 to l-stack (copy)' diff --git a/examples/auction/out/Auction.approval.mir b/examples/auction/out/Auction.approval.mir index 3d9b50ad93..e6ed12d9e6 100644 --- a/examples/auction/out/Auction.approval.mir +++ b/examples/auction/out/Auction.approval.mir @@ -76,23 +76,23 @@ main_start_auction_route@5: txna ApplicationArgs 2 // tmp%12#0,{txna} class Auction(ARC4Contract): auction/contract.py:15 // virtual: store tmp%13#0 to l-stack (no copy) tmp%12#0,tmp%13#0 class Auction(ARC4Contract): auction/contract.py:15 txn GroupIndex // tmp%12#0,tmp%13#0,{txn} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%16#0 to l-stack (no copy) tmp%12#0,tmp%13#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%16#0 from l-stack (no copy) tmp%12#0,tmp%13#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 - int 1 // tmp%12#0,tmp%13#0,tmp%16#0,1 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%14#0 to l-stack (no copy) tmp%12#0,tmp%13#0,tmp%14#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%14#0 from l-stack (no copy) tmp%12#0,tmp%13#0,tmp%14#0 class Auction(ARC4Contract): auction/contract.py:15 + int 1 // tmp%12#0,tmp%13#0,tmp%14#0,1 class Auction(ARC4Contract): auction/contract.py:15 - // tmp%12#0,tmp%13#0,{-} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store awst_tmp%17#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - dup // load awst_tmp%17#0 from l-stack (copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - gtxns TypeEnum // tmp%12#0,tmp%13#0,awst_tmp%17#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%18#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%18#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0 class Auction(ARC4Contract): auction/contract.py:15 - int axfer // tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%18#0,axfer class Auction(ARC4Contract): auction/contract.py:15 - == // tmp%12#0,tmp%13#0,awst_tmp%17#0,{==} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%19#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%19#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%19#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0,tmp%19#0 class Auction(ARC4Contract): auction/contract.py:15 - assert // transaction type is axfer // tmp%12#0,tmp%13#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - uncover 2 // load tmp%12#0 from l-stack (no copy) tmp%13#0,awst_tmp%17#0,tmp%12#0 arc4.abimethod auction/contract.py:41 - uncover 2 // load tmp%13#0 from l-stack (no copy) awst_tmp%17#0,tmp%12#0,tmp%13#0 arc4.abimethod auction/contract.py:41 - uncover 2 // load awst_tmp%17#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%17#0 arc4.abimethod auction/contract.py:41 + // virtual: store awst_tmp%15#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%15#0 class Auction(ARC4Contract): auction/contract.py:15 + dup // load awst_tmp%15#0 from l-stack (copy) tmp%12#0,tmp%13#0,awst_tmp%15#0,awst_tmp%15#0 class Auction(ARC4Contract): auction/contract.py:15 + gtxns TypeEnum // tmp%12#0,tmp%13#0,awst_tmp%15#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%16#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%15#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%16#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%15#0,tmp%16#0 class Auction(ARC4Contract): auction/contract.py:15 + int axfer // tmp%12#0,tmp%13#0,awst_tmp%15#0,tmp%16#0,axfer class Auction(ARC4Contract): auction/contract.py:15 + == // tmp%12#0,tmp%13#0,awst_tmp%15#0,{==} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%15#0,tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%17#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%15#0,tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 + assert // transaction type is axfer // tmp%12#0,tmp%13#0,awst_tmp%15#0 class Auction(ARC4Contract): auction/contract.py:15 + uncover 2 // load tmp%12#0 from l-stack (no copy) tmp%13#0,awst_tmp%15#0,tmp%12#0 arc4.abimethod auction/contract.py:41 + uncover 2 // load tmp%13#0 from l-stack (no copy) awst_tmp%15#0,tmp%12#0,tmp%13#0 arc4.abimethod auction/contract.py:41 + uncover 2 // load awst_tmp%15#0 from l-stack (no copy) tmp%12#0,tmp%13#0,awst_tmp%15#0 arc4.abimethod auction/contract.py:41 callsub start_auction // arc4.abimethod auction/contract.py:41 int 1 // 1 arc4.abimethod auction/contract.py:41 return // arc4.abimethod auction/contract.py:41 @@ -126,21 +126,21 @@ main_bid_route@7: // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 arc4.abimethod auction/contract.py:67 assert // is not creating // arc4.abimethod auction/contract.py:67 txn GroupIndex // {txn} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%28#0 to l-stack (no copy) tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%28#0 from l-stack (no copy) tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 - int 1 // tmp%28#0,1 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%26#0 to l-stack (no copy) tmp%26#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%26#0 from l-stack (no copy) tmp%26#0 class Auction(ARC4Contract): auction/contract.py:15 + int 1 // tmp%26#0,1 class Auction(ARC4Contract): auction/contract.py:15 - // {-} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store awst_tmp%17#0 to l-stack (no copy) awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - dup // load awst_tmp%17#0 from l-stack (copy) awst_tmp%17#0,awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - gtxns TypeEnum // awst_tmp%17#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%29#0 to l-stack (no copy) awst_tmp%17#0,tmp%29#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%29#0 from l-stack (no copy) awst_tmp%17#0,tmp%29#0 class Auction(ARC4Contract): auction/contract.py:15 - int pay // awst_tmp%17#0,tmp%29#0,pay class Auction(ARC4Contract): auction/contract.py:15 - == // awst_tmp%17#0,{==} class Auction(ARC4Contract): auction/contract.py:15 - // virtual: store tmp%30#0 to l-stack (no copy) awst_tmp%17#0,tmp%30#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load tmp%30#0 from l-stack (no copy) awst_tmp%17#0,tmp%30#0 class Auction(ARC4Contract): auction/contract.py:15 - assert // transaction type is pay // awst_tmp%17#0 class Auction(ARC4Contract): auction/contract.py:15 - // virtual: load awst_tmp%17#0 from l-stack (no copy) awst_tmp%17#0 arc4.abimethod auction/contract.py:67 + // virtual: store awst_tmp%15#0 to l-stack (no copy) awst_tmp%15#0 class Auction(ARC4Contract): auction/contract.py:15 + dup // load awst_tmp%15#0 from l-stack (copy) awst_tmp%15#0,awst_tmp%15#0 class Auction(ARC4Contract): auction/contract.py:15 + gtxns TypeEnum // awst_tmp%15#0,{gtxns} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%27#0 to l-stack (no copy) awst_tmp%15#0,tmp%27#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%27#0 from l-stack (no copy) awst_tmp%15#0,tmp%27#0 class Auction(ARC4Contract): auction/contract.py:15 + int pay // awst_tmp%15#0,tmp%27#0,pay class Auction(ARC4Contract): auction/contract.py:15 + == // awst_tmp%15#0,{==} class Auction(ARC4Contract): auction/contract.py:15 + // virtual: store tmp%28#0 to l-stack (no copy) awst_tmp%15#0,tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load tmp%28#0 from l-stack (no copy) awst_tmp%15#0,tmp%28#0 class Auction(ARC4Contract): auction/contract.py:15 + assert // transaction type is pay // awst_tmp%15#0 class Auction(ARC4Contract): auction/contract.py:15 + // virtual: load awst_tmp%15#0 from l-stack (no copy) awst_tmp%15#0 arc4.abimethod auction/contract.py:67 callsub bid // arc4.abimethod auction/contract.py:67 int 1 // 1 arc4.abimethod auction/contract.py:67 return // arc4.abimethod auction/contract.py:67 diff --git a/examples/auction/out/Auction.destructured.ir b/examples/auction/out/Auction.destructured.ir index 2a266cb2d2..3b8cfeb301 100644 --- a/examples/auction/out/Auction.destructured.ir +++ b/examples/auction/out/Auction.destructured.ir @@ -32,12 +32,12 @@ contract examples.auction.contract.Auction: (assert tmp%11#0) // is not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) - let tmp%16#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%16#0 1u) - let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%19#0: uint64 = (== tmp%18#0 axfer) - (assert tmp%19#0) // transaction type is axfer - examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, awst_tmp%17#0) + let tmp%14#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) + let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%17#0: uint64 = (== tmp%16#0 axfer) + (assert tmp%17#0) // transaction type is axfer + examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, awst_tmp%15#0) return 1u block@6: // opt_in_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) @@ -53,12 +53,12 @@ contract examples.auction.contract.Auction: (assert tmp%24#0) // OnCompletion is NoOp let tmp%25#0: uint64 = (txn ApplicationID) (assert tmp%25#0) // is not creating - let tmp%28#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%28#0 1u) - let tmp%29#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%30#0: uint64 = (== tmp%29#0 pay) - (assert tmp%30#0) // transaction type is pay - examples.auction.contract.Auction.bid(awst_tmp%17#0) + let tmp%26#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%26#0 1u) + let tmp%27#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%28#0: uint64 = (== tmp%27#0 pay) + (assert tmp%28#0) // transaction type is pay + examples.auction.contract.Auction.bid(awst_tmp%15#0) return 1u block@8: // claim_bids_route_L83 let tmp%31#0: uint64 = (txn OnCompletion) diff --git a/examples/auction/out/Auction.ssa.ir b/examples/auction/out/Auction.ssa.ir index 429f31cd3a..36913ca08b 100644 --- a/examples/auction/out/Auction.ssa.ir +++ b/examples/auction/out/Auction.ssa.ir @@ -32,13 +32,13 @@ contract examples.auction.contract.Auction: (assert tmp%11#0) // is not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) - let tmp%16#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%16#0 1u) - let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%19#0: uint64 = (== tmp%18#0 axfer) - let (maybe_value%14#0: uint64, maybe_value_did_exist%15#0: uint64) = (awst_tmp%17#0, tmp%19#0) - (assert maybe_value_did_exist%15#0) // transaction type is axfer - examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, maybe_value%14#0) + let tmp%14#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) + let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%17#0: uint64 = (== tmp%16#0 axfer) + let (value%18#0: uint64, check%19#0: uint64) = (awst_tmp%15#0, tmp%17#0) + (assert check%19#0) // transaction type is axfer + examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, value%18#0) return 1u block@6: // opt_in_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) @@ -54,13 +54,13 @@ contract examples.auction.contract.Auction: (assert tmp%24#0) // OnCompletion is NoOp let tmp%25#0: uint64 = (txn ApplicationID) (assert tmp%25#0) // is not creating - let tmp%28#0: uint64 = (txn GroupIndex) - let awst_tmp%17#1: uint64 = (- tmp%28#0 1u) - let tmp%29#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#1) - let tmp%30#0: uint64 = (== tmp%29#0 pay) - let (maybe_value%26#0: uint64, maybe_value_did_exist%27#0: uint64) = (awst_tmp%17#1, tmp%30#0) - (assert maybe_value_did_exist%27#0) // transaction type is pay - examples.auction.contract.Auction.bid(maybe_value%26#0) + let tmp%26#0: uint64 = (txn GroupIndex) + let awst_tmp%15#1: uint64 = (- tmp%26#0 1u) + let tmp%27#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#1) + let tmp%28#0: uint64 = (== tmp%27#0 pay) + let (value%29#0: uint64, check%30#0: uint64) = (awst_tmp%15#1, tmp%28#0) + (assert check%30#0) // transaction type is pay + examples.auction.contract.Auction.bid(value%29#0) return 1u block@8: // claim_bids_route_L83 let tmp%31#0: uint64 = (txn OnCompletion) diff --git a/examples/auction/out/Auction.ssa.opt_pass_1.ir b/examples/auction/out/Auction.ssa.opt_pass_1.ir index 96e9fd72ef..c5ffb6b0e4 100644 --- a/examples/auction/out/Auction.ssa.opt_pass_1.ir +++ b/examples/auction/out/Auction.ssa.opt_pass_1.ir @@ -32,12 +32,12 @@ contract examples.auction.contract.Auction: (assert tmp%11#0) // is not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) - let tmp%16#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%16#0 1u) - let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%19#0: uint64 = (== tmp%18#0 axfer) - (assert tmp%19#0) // transaction type is axfer - examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, awst_tmp%17#0) + let tmp%14#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) + let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%17#0: uint64 = (== tmp%16#0 axfer) + (assert tmp%17#0) // transaction type is axfer + examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, awst_tmp%15#0) return 1u block@6: // opt_in_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) @@ -53,12 +53,12 @@ contract examples.auction.contract.Auction: (assert tmp%24#0) // OnCompletion is NoOp let tmp%25#0: uint64 = (txn ApplicationID) (assert tmp%25#0) // is not creating - let tmp%28#0: uint64 = (txn GroupIndex) - let awst_tmp%17#1: uint64 = (- tmp%28#0 1u) - let tmp%29#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#1) - let tmp%30#0: uint64 = (== tmp%29#0 pay) - (assert tmp%30#0) // transaction type is pay - examples.auction.contract.Auction.bid(awst_tmp%17#1) + let tmp%26#0: uint64 = (txn GroupIndex) + let awst_tmp%15#1: uint64 = (- tmp%26#0 1u) + let tmp%27#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#1) + let tmp%28#0: uint64 = (== tmp%27#0 pay) + (assert tmp%28#0) // transaction type is pay + examples.auction.contract.Auction.bid(awst_tmp%15#1) return 1u block@8: // claim_bids_route_L83 let tmp%31#0: uint64 = (txn OnCompletion) diff --git a/examples/auction/out_O2/Auction.destructured.ir b/examples/auction/out_O2/Auction.destructured.ir index 2a266cb2d2..3b8cfeb301 100644 --- a/examples/auction/out_O2/Auction.destructured.ir +++ b/examples/auction/out_O2/Auction.destructured.ir @@ -32,12 +32,12 @@ contract examples.auction.contract.Auction: (assert tmp%11#0) // is not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) - let tmp%16#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%16#0 1u) - let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%19#0: uint64 = (== tmp%18#0 axfer) - (assert tmp%19#0) // transaction type is axfer - examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, awst_tmp%17#0) + let tmp%14#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) + let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%17#0: uint64 = (== tmp%16#0 axfer) + (assert tmp%17#0) // transaction type is axfer + examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, awst_tmp%15#0) return 1u block@6: // opt_in_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) @@ -53,12 +53,12 @@ contract examples.auction.contract.Auction: (assert tmp%24#0) // OnCompletion is NoOp let tmp%25#0: uint64 = (txn ApplicationID) (assert tmp%25#0) // is not creating - let tmp%28#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%28#0 1u) - let tmp%29#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%30#0: uint64 = (== tmp%29#0 pay) - (assert tmp%30#0) // transaction type is pay - examples.auction.contract.Auction.bid(awst_tmp%17#0) + let tmp%26#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%26#0 1u) + let tmp%27#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%28#0: uint64 = (== tmp%27#0 pay) + (assert tmp%28#0) // transaction type is pay + examples.auction.contract.Auction.bid(awst_tmp%15#0) return 1u block@8: // claim_bids_route_L83 let tmp%31#0: uint64 = (txn OnCompletion) diff --git a/examples/auction/out_unoptimized/Auction.destructured.ir b/examples/auction/out_unoptimized/Auction.destructured.ir index ff92452079..6d3c220df9 100644 --- a/examples/auction/out_unoptimized/Auction.destructured.ir +++ b/examples/auction/out_unoptimized/Auction.destructured.ir @@ -32,14 +32,14 @@ contract examples.auction.contract.Auction: (assert tmp%11#0) // is not creating let tmp%12#0: bytes = (txna ApplicationArgs 1) let tmp%13#0: bytes = (txna ApplicationArgs 2) - let tmp%16#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%16#0 1u) - let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%19#0: uint64 = (== tmp%18#0 axfer) - let maybe_value%14#0: uint64 = awst_tmp%17#0 - let maybe_value_did_exist%15#0: uint64 = tmp%19#0 - (assert maybe_value_did_exist%15#0) // transaction type is axfer - examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, maybe_value%14#0) + let tmp%14#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%14#0 1u) + let tmp%16#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%17#0: uint64 = (== tmp%16#0 axfer) + let value%18#0: uint64 = awst_tmp%15#0 + let check%19#0: uint64 = tmp%17#0 + (assert check%19#0) // transaction type is axfer + examples.auction.contract.Auction.start_auction(tmp%12#0, tmp%13#0, value%18#0) return 1u block@6: // opt_in_route_L63 let tmp%20#0: uint64 = (txn OnCompletion) @@ -55,14 +55,14 @@ contract examples.auction.contract.Auction: (assert tmp%24#0) // OnCompletion is NoOp let tmp%25#0: uint64 = (txn ApplicationID) (assert tmp%25#0) // is not creating - let tmp%28#0: uint64 = (txn GroupIndex) - let awst_tmp%17#0: uint64 = (- tmp%28#0 1u) - let tmp%29#0: uint64 = ((gtxns TypeEnum) awst_tmp%17#0) - let tmp%30#0: uint64 = (== tmp%29#0 pay) - let maybe_value%26#0: uint64 = awst_tmp%17#0 - let maybe_value_did_exist%27#0: uint64 = tmp%30#0 - (assert maybe_value_did_exist%27#0) // transaction type is pay - examples.auction.contract.Auction.bid(maybe_value%26#0) + let tmp%26#0: uint64 = (txn GroupIndex) + let awst_tmp%15#0: uint64 = (- tmp%26#0 1u) + let tmp%27#0: uint64 = ((gtxns TypeEnum) awst_tmp%15#0) + let tmp%28#0: uint64 = (== tmp%27#0 pay) + let value%29#0: uint64 = awst_tmp%15#0 + let check%30#0: uint64 = tmp%28#0 + (assert check%30#0) // transaction type is pay + examples.auction.contract.Auction.bid(value%29#0) return 1u block@8: // claim_bids_route_L83 let tmp%31#0: uint64 = (txn OnCompletion) diff --git a/examples/auction/puya.log b/examples/auction/puya.log index efc1455e06..d0532211a2 100644 --- a/examples/auction/puya.log +++ b/examples/auction/puya.log @@ -362,14 +362,14 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: awst_tmp%17#0, maybe_value%14#0 -debug: Replacing {maybe_value%14#0} with awst_tmp%17#0 made 1 modifications -debug: Found equivalence set: tmp%19#0, maybe_value_did_exist%15#0 -debug: Replacing {maybe_value_did_exist%15#0} with tmp%19#0 made 1 modifications -debug: Found equivalence set: awst_tmp%17#1, maybe_value%26#0 -debug: Replacing {maybe_value%26#0} with awst_tmp%17#1 made 1 modifications -debug: Found equivalence set: tmp%30#0, maybe_value_did_exist%27#0 -debug: Replacing {maybe_value_did_exist%27#0} with tmp%30#0 made 1 modifications +debug: Found equivalence set: awst_tmp%15#0, value%18#0 +debug: Replacing {value%18#0} with awst_tmp%15#0 made 1 modifications +debug: Found equivalence set: tmp%17#0, check%19#0 +debug: Replacing {check%19#0} with tmp%17#0 made 1 modifications +debug: Found equivalence set: awst_tmp%15#1, value%29#0 +debug: Replacing {value%29#0} with awst_tmp%15#1 made 1 modifications +debug: Found equivalence set: tmp%28#0, check%30#0 +debug: Replacing {check%30#0} with tmp%28#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops @@ -968,7 +968,7 @@ debug: Removing Phis from examples.auction.contract.Auction.claim_asset debug: Removing Phis from examples.auction.contract.Auction.__init__ debug: Removing Phis from examples.auction.contract.Auction.clear_state_program debug: Coalescing local variables in examples.auction.contract.Auction.approval_program using strategy RootOperandGrouping -debug: Coalescing awst_tmp%17#0 with [awst_tmp%17#1] +debug: Coalescing awst_tmp%15#0 with [awst_tmp%15#1] debug: Coalescing resulted in 3 replacement/s debug: Coalescing local variables in examples.auction.contract.Auction.opt_into_asset using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -1022,16 +1022,16 @@ debug: Inserted main_start_auction_route@5.ops[5]: 'store tmp%10#0 to l-stack (c debug: Replaced main_start_auction_route@5.ops[7]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' debug: Inserted main_start_auction_route@5.ops[10]: 'store tmp%11#0 to l-stack (copy)' debug: Replaced main_start_auction_route@5.ops[12]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' -debug: Inserted main_start_auction_route@5.ops[19]: 'store tmp%16#0 to l-stack (copy)' -debug: Replaced main_start_auction_route@5.ops[21]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' -debug: Inserted main_start_auction_route@5.ops[24]: 'store awst_tmp%17#0 to l-stack (copy)' -debug: Replaced main_start_auction_route@5.ops[26]: 'load awst_tmp%17#0' with 'load awst_tmp%17#0 from l-stack (no copy)' -debug: Inserted main_start_auction_route@5.ops[28]: 'store tmp%18#0 to l-stack (copy)' -debug: Replaced main_start_auction_route@5.ops[30]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' -debug: Inserted main_start_auction_route@5.ops[33]: 'store tmp%19#0 to l-stack (copy)' -debug: Replaced main_start_auction_route@5.ops[35]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' -debug: Inserted main_start_auction_route@5.ops[27]: 'store awst_tmp%17#0 to l-stack (copy)' -debug: Replaced main_start_auction_route@5.ops[40]: 'load awst_tmp%17#0' with 'load awst_tmp%17#0 from l-stack (no copy)' +debug: Inserted main_start_auction_route@5.ops[19]: 'store tmp%14#0 to l-stack (copy)' +debug: Replaced main_start_auction_route@5.ops[21]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' +debug: Inserted main_start_auction_route@5.ops[24]: 'store awst_tmp%15#0 to l-stack (copy)' +debug: Replaced main_start_auction_route@5.ops[26]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' +debug: Inserted main_start_auction_route@5.ops[28]: 'store tmp%16#0 to l-stack (copy)' +debug: Replaced main_start_auction_route@5.ops[30]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' +debug: Inserted main_start_auction_route@5.ops[33]: 'store tmp%17#0 to l-stack (copy)' +debug: Replaced main_start_auction_route@5.ops[35]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' +debug: Inserted main_start_auction_route@5.ops[27]: 'store awst_tmp%15#0 to l-stack (copy)' +debug: Replaced main_start_auction_route@5.ops[40]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' debug: Inserted main_start_auction_route@5.ops[17]: 'store tmp%13#0 to l-stack (copy)' debug: Replaced main_start_auction_route@5.ops[40]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' debug: Inserted main_start_auction_route@5.ops[15]: 'store tmp%12#0 to l-stack (copy)' @@ -1048,16 +1048,16 @@ debug: Inserted main_bid_route@7.ops[5]: 'store tmp%24#0 to l-stack (copy)' debug: Replaced main_bid_route@7.ops[7]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' debug: Inserted main_bid_route@7.ops[10]: 'store tmp%25#0 to l-stack (copy)' debug: Replaced main_bid_route@7.ops[12]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' -debug: Inserted main_bid_route@7.ops[15]: 'store tmp%28#0 to l-stack (copy)' -debug: Replaced main_bid_route@7.ops[17]: 'load tmp%28#0' with 'load tmp%28#0 from l-stack (no copy)' -debug: Inserted main_bid_route@7.ops[20]: 'store awst_tmp%17#0 to l-stack (copy)' -debug: Replaced main_bid_route@7.ops[22]: 'load awst_tmp%17#0' with 'load awst_tmp%17#0 from l-stack (no copy)' -debug: Inserted main_bid_route@7.ops[24]: 'store tmp%29#0 to l-stack (copy)' -debug: Replaced main_bid_route@7.ops[26]: 'load tmp%29#0' with 'load tmp%29#0 from l-stack (no copy)' -debug: Inserted main_bid_route@7.ops[29]: 'store tmp%30#0 to l-stack (copy)' -debug: Replaced main_bid_route@7.ops[31]: 'load tmp%30#0' with 'load tmp%30#0 from l-stack (no copy)' -debug: Inserted main_bid_route@7.ops[23]: 'store awst_tmp%17#0 to l-stack (copy)' -debug: Replaced main_bid_route@7.ops[34]: 'load awst_tmp%17#0' with 'load awst_tmp%17#0 from l-stack (no copy)' +debug: Inserted main_bid_route@7.ops[15]: 'store tmp%26#0 to l-stack (copy)' +debug: Replaced main_bid_route@7.ops[17]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' +debug: Inserted main_bid_route@7.ops[20]: 'store awst_tmp%15#0 to l-stack (copy)' +debug: Replaced main_bid_route@7.ops[22]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' +debug: Inserted main_bid_route@7.ops[24]: 'store tmp%27#0 to l-stack (copy)' +debug: Replaced main_bid_route@7.ops[26]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' +debug: Inserted main_bid_route@7.ops[29]: 'store tmp%28#0 to l-stack (copy)' +debug: Replaced main_bid_route@7.ops[31]: 'load tmp%28#0' with 'load tmp%28#0 from l-stack (no copy)' +debug: Inserted main_bid_route@7.ops[23]: 'store awst_tmp%15#0 to l-stack (copy)' +debug: Replaced main_bid_route@7.ops[34]: 'load awst_tmp%15#0' with 'load awst_tmp%15#0 from l-stack (no copy)' debug: Inserted main_claim_bids_route@8.ops[1]: 'store tmp%31#0 to l-stack (copy)' debug: Replaced main_claim_bids_route@8.ops[3]: 'load tmp%31#0' with 'load tmp%31#0 from l-stack (no copy)' debug: Inserted main_claim_bids_route@8.ops[5]: 'store tmp%32#0 to l-stack (copy)' diff --git a/examples/voting/out/VotingRoundApp.approval.mir b/examples/voting/out/VotingRoundApp.approval.mir index 28cae7349b..5a7c476a8e 100644 --- a/examples/voting/out/VotingRoundApp.approval.mir +++ b/examples/voting/out/VotingRoundApp.approval.mir @@ -94,21 +94,21 @@ main_bootstrap_route@4: // virtual: load tmp%20#0 from l-stack (no copy) tmp%20#0 arc4.abimethod voting/voting.py:79 assert // is not creating // arc4.abimethod voting/voting.py:79 txn GroupIndex // {txn} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%23#0 to l-stack (no copy) tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%23#0 from l-stack (no copy) tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int 1 // tmp%23#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%21#0 to l-stack (no copy) tmp%21#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%21#0 from l-stack (no copy) tmp%21#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int 1 // tmp%21#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // {-} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store awst_tmp%24#0 to l-stack (no copy) awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - dup // load awst_tmp%24#0 from l-stack (copy) awst_tmp%24#0,awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - gtxns TypeEnum // awst_tmp%24#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%25#0 to l-stack (no copy) awst_tmp%24#0,tmp%25#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%25#0 from l-stack (no copy) awst_tmp%24#0,tmp%25#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int pay // awst_tmp%24#0,tmp%25#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 - == // awst_tmp%24#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%26#0 to l-stack (no copy) awst_tmp%24#0,tmp%26#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%26#0 from l-stack (no copy) awst_tmp%24#0,tmp%26#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - assert // transaction type is pay // awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load awst_tmp%24#0 from l-stack (no copy) awst_tmp%24#0 arc4.abimethod voting/voting.py:79 + // virtual: store awst_tmp%22#0 to l-stack (no copy) awst_tmp%22#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + dup // load awst_tmp%22#0 from l-stack (copy) awst_tmp%22#0,awst_tmp%22#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + gtxns TypeEnum // awst_tmp%22#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%23#0 to l-stack (no copy) awst_tmp%22#0,tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%23#0 from l-stack (no copy) awst_tmp%22#0,tmp%23#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int pay // awst_tmp%22#0,tmp%23#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 + == // awst_tmp%22#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%24#0 to l-stack (no copy) awst_tmp%22#0,tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%24#0 from l-stack (no copy) awst_tmp%22#0,tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + assert // transaction type is pay // awst_tmp%22#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load awst_tmp%22#0 from l-stack (no copy) awst_tmp%22#0 arc4.abimethod voting/voting.py:79 callsub bootstrap // arc4.abimethod voting/voting.py:79 int 1 // 1 arc4.abimethod voting/voting.py:79 return // arc4.abimethod voting/voting.py:79 @@ -168,30 +168,30 @@ main_vote_route@7: // virtual: load tmp%38#0 from l-stack (no copy) tmp%38#0 arc4.abimethod voting/voting.py:166 assert // is not creating // arc4.abimethod voting/voting.py:166 txn GroupIndex // {txn} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int 1 // tmp%41#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%39#0 to l-stack (no copy) tmp%39#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%39#0 from l-stack (no copy) tmp%39#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int 1 // tmp%39#0,1 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // {-} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store awst_tmp%24#0 to l-stack (no copy) awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - dup // load awst_tmp%24#0 from l-stack (copy) awst_tmp%24#0,awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - gtxns TypeEnum // awst_tmp%24#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%24#0,tmp%42#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%42#0 from l-stack (no copy) awst_tmp%24#0,tmp%42#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - int pay // awst_tmp%24#0,tmp%42#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 - == // awst_tmp%24#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%24#0,tmp%43#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%24#0,tmp%43#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - assert // transaction type is pay // awst_tmp%24#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 1 // awst_tmp%24#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%24#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%24#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - extract 2 0 // awst_tmp%24#0,{extract} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%24#0,tmp%45#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - txna ApplicationArgs 2 // awst_tmp%24#0,tmp%45#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 - // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%24#0,tmp%45#0,tmp%46#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 - uncover 2 // load awst_tmp%24#0 from l-stack (no copy) tmp%45#0,tmp%46#0,awst_tmp%24#0 arc4.abimethod voting/voting.py:166 - uncover 2 // load tmp%45#0 from l-stack (no copy) tmp%46#0,awst_tmp%24#0,tmp%45#0 arc4.abimethod voting/voting.py:166 - uncover 2 // load tmp%46#0 from l-stack (no copy) awst_tmp%24#0,tmp%45#0,tmp%46#0 arc4.abimethod voting/voting.py:166 + // virtual: store awst_tmp%22#0 to l-stack (no copy) awst_tmp%22#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + dup // load awst_tmp%22#0 from l-stack (copy) awst_tmp%22#0,awst_tmp%22#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + gtxns TypeEnum // awst_tmp%22#0,{gtxns} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%40#0 to l-stack (no copy) awst_tmp%22#0,tmp%40#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%40#0 from l-stack (no copy) awst_tmp%22#0,tmp%40#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + int pay // awst_tmp%22#0,tmp%40#0,pay class VotingRoundApp(ARC4Contract): voting/voting.py:48 + == // awst_tmp%22#0,{==} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%41#0 to l-stack (no copy) awst_tmp%22#0,tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%41#0 from l-stack (no copy) awst_tmp%22#0,tmp%41#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + assert // transaction type is pay // awst_tmp%22#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 1 // awst_tmp%22#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%22#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%22#0,tmp%44#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + extract 2 0 // awst_tmp%22#0,{extract} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%22#0,tmp%45#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + txna ApplicationArgs 2 // awst_tmp%22#0,tmp%45#0,{txna} class VotingRoundApp(ARC4Contract): voting/voting.py:48 + // virtual: store tmp%46#0 to l-stack (no copy) awst_tmp%22#0,tmp%45#0,tmp%46#0 class VotingRoundApp(ARC4Contract): voting/voting.py:48 + uncover 2 // load awst_tmp%22#0 from l-stack (no copy) tmp%45#0,tmp%46#0,awst_tmp%22#0 arc4.abimethod voting/voting.py:166 + uncover 2 // load tmp%45#0 from l-stack (no copy) tmp%46#0,awst_tmp%22#0,tmp%45#0 arc4.abimethod voting/voting.py:166 + uncover 2 // load tmp%46#0 from l-stack (no copy) awst_tmp%22#0,tmp%45#0,tmp%46#0 arc4.abimethod voting/voting.py:166 callsub vote // arc4.abimethod voting/voting.py:166 int 1 // 1 arc4.abimethod voting/voting.py:166 return // arc4.abimethod voting/voting.py:166 diff --git a/examples/voting/out/VotingRoundApp.destructured.ir b/examples/voting/out/VotingRoundApp.destructured.ir index 5a110877bf..f677578155 100644 --- a/examples/voting/out/VotingRoundApp.destructured.ir +++ b/examples/voting/out/VotingRoundApp.destructured.ir @@ -37,12 +37,12 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%19#0) // OnCompletion is NoOp let tmp%20#0: uint64 = (txn ApplicationID) (assert tmp%20#0) // is not creating - let tmp%23#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%23#0 1u) - let tmp%25#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%26#0: uint64 = (== tmp%25#0 pay) - (assert tmp%26#0) // transaction type is pay - examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%24#0) + let tmp%21#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%21#0 1u) + let tmp%23#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%24#0: uint64 = (== tmp%23#0 pay) + (assert tmp%24#0) // transaction type is pay + examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%22#0) return 1u block@5: // close_route_L107 let tmp%27#0: uint64 = (txn OnCompletion) @@ -69,15 +69,15 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%37#0) // OnCompletion is NoOp let tmp%38#0: uint64 = (txn ApplicationID) (assert tmp%38#0) // is not creating - let tmp%41#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%41#0 1u) - let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%43#0: uint64 = (== tmp%42#0 pay) - (assert tmp%43#0) // transaction type is pay + let tmp%39#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%39#0 1u) + let tmp%40#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%41#0: uint64 = (== tmp%40#0 pay) + (assert tmp%41#0) // transaction type is pay let tmp%44#0: bytes = (txna ApplicationArgs 1) let tmp%45#0: bytes = ((extract 2 0) tmp%44#0) let tmp%46#0: bytes = (txna ApplicationArgs 2) - examples.voting.voting.VotingRoundApp.vote(awst_tmp%24#0, tmp%45#0, tmp%46#0) + examples.voting.voting.VotingRoundApp.vote(awst_tmp%22#0, tmp%45#0, tmp%46#0) return 1u subroutine examples.voting.voting.VotingRoundApp.create(vote_id: bytes, snapshot_public_key: bytes, metadata_ipfs_cid: bytes, start_time: uint64, end_time: uint64, option_counts: bytes, quorum: uint64, nft_image_url: bytes) -> void: diff --git a/examples/voting/out/VotingRoundApp.ssa.ir b/examples/voting/out/VotingRoundApp.ssa.ir index 6461a4b5ee..07dbd26144 100644 --- a/examples/voting/out/VotingRoundApp.ssa.ir +++ b/examples/voting/out/VotingRoundApp.ssa.ir @@ -37,13 +37,13 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%19#0) // OnCompletion is NoOp let tmp%20#0: uint64 = (txn ApplicationID) (assert tmp%20#0) // is not creating - let tmp%23#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%23#0 1u) - let tmp%25#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%26#0: uint64 = (== tmp%25#0 pay) - let (maybe_value%21#0: uint64, maybe_value_did_exist%22#0: uint64) = (awst_tmp%24#0, tmp%26#0) - (assert maybe_value_did_exist%22#0) // transaction type is pay - examples.voting.voting.VotingRoundApp.bootstrap(maybe_value%21#0) + let tmp%21#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%21#0 1u) + let tmp%23#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%24#0: uint64 = (== tmp%23#0 pay) + let (value%25#0: uint64, check%26#0: uint64) = (awst_tmp%22#0, tmp%24#0) + (assert check%26#0) // transaction type is pay + examples.voting.voting.VotingRoundApp.bootstrap(value%25#0) return 1u block@5: // close_route_L107 let tmp%27#0: uint64 = (txn OnCompletion) @@ -70,16 +70,16 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%37#0) // OnCompletion is NoOp let tmp%38#0: uint64 = (txn ApplicationID) (assert tmp%38#0) // is not creating - let tmp%41#0: uint64 = (txn GroupIndex) - let awst_tmp%24#1: uint64 = (- tmp%41#0 1u) - let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#1) - let tmp%43#0: uint64 = (== tmp%42#0 pay) - let (maybe_value%39#0: uint64, maybe_value_did_exist%40#0: uint64) = (awst_tmp%24#1, tmp%43#0) - (assert maybe_value_did_exist%40#0) // transaction type is pay + let tmp%39#0: uint64 = (txn GroupIndex) + let awst_tmp%22#1: uint64 = (- tmp%39#0 1u) + let tmp%40#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#1) + let tmp%41#0: uint64 = (== tmp%40#0 pay) + let (value%42#0: uint64, check%43#0: uint64) = (awst_tmp%22#1, tmp%41#0) + (assert check%43#0) // transaction type is pay let tmp%44#0: bytes = (txna ApplicationArgs 1) let tmp%45#0: bytes = ((extract 2 0) tmp%44#0) let tmp%46#0: bytes = (txna ApplicationArgs 2) - examples.voting.voting.VotingRoundApp.vote(maybe_value%39#0, tmp%45#0, tmp%46#0) + examples.voting.voting.VotingRoundApp.vote(value%42#0, tmp%45#0, tmp%46#0) return 1u block@8: // switch_case_default_L48 goto block@9 diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir index 93bdb7af54..c51a654934 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir @@ -37,12 +37,12 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%19#0) // OnCompletion is NoOp let tmp%20#0: uint64 = (txn ApplicationID) (assert tmp%20#0) // is not creating - let tmp%23#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%23#0 1u) - let tmp%25#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%26#0: uint64 = (== tmp%25#0 pay) - (assert tmp%26#0) // transaction type is pay - examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%24#0) + let tmp%21#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%21#0 1u) + let tmp%23#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%24#0: uint64 = (== tmp%23#0 pay) + (assert tmp%24#0) // transaction type is pay + examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%22#0) return 1u block@5: // close_route_L107 let tmp%27#0: uint64 = (txn OnCompletion) @@ -69,15 +69,15 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%37#0) // OnCompletion is NoOp let tmp%38#0: uint64 = (txn ApplicationID) (assert tmp%38#0) // is not creating - let tmp%41#0: uint64 = (txn GroupIndex) - let awst_tmp%24#1: uint64 = (- tmp%41#0 1u) - let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#1) - let tmp%43#0: uint64 = (== tmp%42#0 pay) - (assert tmp%43#0) // transaction type is pay + let tmp%39#0: uint64 = (txn GroupIndex) + let awst_tmp%22#1: uint64 = (- tmp%39#0 1u) + let tmp%40#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#1) + let tmp%41#0: uint64 = (== tmp%40#0 pay) + (assert tmp%41#0) // transaction type is pay let tmp%44#0: bytes = (txna ApplicationArgs 1) let tmp%45#0: bytes = ((extract 2 0) tmp%44#0) let tmp%46#0: bytes = (txna ApplicationArgs 2) - examples.voting.voting.VotingRoundApp.vote(awst_tmp%24#1, tmp%45#0, tmp%46#0) + examples.voting.voting.VotingRoundApp.vote(awst_tmp%22#1, tmp%45#0, tmp%46#0) return 1u subroutine examples.voting.voting.VotingRoundApp.create(vote_id: bytes, snapshot_public_key: bytes, metadata_ipfs_cid: bytes, start_time: uint64, end_time: uint64, option_counts: bytes, quorum: uint64, nft_image_url: bytes) -> void: diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir index 9544038bbf..d55a492d1d 100644 --- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir +++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir @@ -37,12 +37,12 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%19#0) // OnCompletion is NoOp let tmp%20#0: uint64 = (txn ApplicationID) (assert tmp%20#0) // is not creating - let tmp%23#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%23#0 1u) - let tmp%25#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%26#0: uint64 = (== tmp%25#0 pay) - (assert tmp%26#0) // transaction type is pay - examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%24#0) + let tmp%21#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%21#0 1u) + let tmp%23#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%24#0: uint64 = (== tmp%23#0 pay) + (assert tmp%24#0) // transaction type is pay + examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%22#0) return 1u block@5: // close_route_L107 let tmp%27#0: uint64 = (txn OnCompletion) @@ -69,15 +69,15 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%37#0) // OnCompletion is NoOp let tmp%38#0: uint64 = (txn ApplicationID) (assert tmp%38#0) // is not creating - let tmp%41#0: uint64 = (txn GroupIndex) - let awst_tmp%24#1: uint64 = (- tmp%41#0 1u) - let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#1) - let tmp%43#0: uint64 = (== tmp%42#0 pay) - (assert tmp%43#0) // transaction type is pay + let tmp%39#0: uint64 = (txn GroupIndex) + let awst_tmp%22#1: uint64 = (- tmp%39#0 1u) + let tmp%40#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#1) + let tmp%41#0: uint64 = (== tmp%40#0 pay) + (assert tmp%41#0) // transaction type is pay let tmp%44#0: bytes = (txna ApplicationArgs 1) let tmp%45#0: bytes = ((extract 2 0) tmp%44#0) let tmp%46#0: bytes = (txna ApplicationArgs 2) - examples.voting.voting.VotingRoundApp.vote(awst_tmp%24#1, tmp%45#0, tmp%46#0) + examples.voting.voting.VotingRoundApp.vote(awst_tmp%22#1, tmp%45#0, tmp%46#0) return 1u subroutine examples.voting.voting.VotingRoundApp.create(vote_id: bytes, snapshot_public_key: bytes, metadata_ipfs_cid: bytes, start_time: uint64, end_time: uint64, option_counts: bytes, quorum: uint64, nft_image_url: bytes) -> void: diff --git a/examples/voting/out_O2/VotingRoundApp.destructured.ir b/examples/voting/out_O2/VotingRoundApp.destructured.ir index 5a110877bf..f677578155 100644 --- a/examples/voting/out_O2/VotingRoundApp.destructured.ir +++ b/examples/voting/out_O2/VotingRoundApp.destructured.ir @@ -37,12 +37,12 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%19#0) // OnCompletion is NoOp let tmp%20#0: uint64 = (txn ApplicationID) (assert tmp%20#0) // is not creating - let tmp%23#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%23#0 1u) - let tmp%25#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%26#0: uint64 = (== tmp%25#0 pay) - (assert tmp%26#0) // transaction type is pay - examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%24#0) + let tmp%21#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%21#0 1u) + let tmp%23#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%24#0: uint64 = (== tmp%23#0 pay) + (assert tmp%24#0) // transaction type is pay + examples.voting.voting.VotingRoundApp.bootstrap(awst_tmp%22#0) return 1u block@5: // close_route_L107 let tmp%27#0: uint64 = (txn OnCompletion) @@ -69,15 +69,15 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%37#0) // OnCompletion is NoOp let tmp%38#0: uint64 = (txn ApplicationID) (assert tmp%38#0) // is not creating - let tmp%41#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%41#0 1u) - let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%43#0: uint64 = (== tmp%42#0 pay) - (assert tmp%43#0) // transaction type is pay + let tmp%39#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%39#0 1u) + let tmp%40#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%41#0: uint64 = (== tmp%40#0 pay) + (assert tmp%41#0) // transaction type is pay let tmp%44#0: bytes = (txna ApplicationArgs 1) let tmp%45#0: bytes = ((extract 2 0) tmp%44#0) let tmp%46#0: bytes = (txna ApplicationArgs 2) - examples.voting.voting.VotingRoundApp.vote(awst_tmp%24#0, tmp%45#0, tmp%46#0) + examples.voting.voting.VotingRoundApp.vote(awst_tmp%22#0, tmp%45#0, tmp%46#0) return 1u subroutine examples.voting.voting.VotingRoundApp.create(vote_id: bytes, snapshot_public_key: bytes, metadata_ipfs_cid: bytes, start_time: uint64, end_time: uint64, option_counts: bytes, quorum: uint64, nft_image_url: bytes) -> void: diff --git a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir index 98f03133c4..bf6ab5813d 100644 --- a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir +++ b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir @@ -37,14 +37,14 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%19#0) // OnCompletion is NoOp let tmp%20#0: uint64 = (txn ApplicationID) (assert tmp%20#0) // is not creating - let tmp%23#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%23#0 1u) - let tmp%25#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%26#0: uint64 = (== tmp%25#0 pay) - let maybe_value%21#0: uint64 = awst_tmp%24#0 - let maybe_value_did_exist%22#0: uint64 = tmp%26#0 - (assert maybe_value_did_exist%22#0) // transaction type is pay - examples.voting.voting.VotingRoundApp.bootstrap(maybe_value%21#0) + let tmp%21#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%21#0 1u) + let tmp%23#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%24#0: uint64 = (== tmp%23#0 pay) + let value%25#0: uint64 = awst_tmp%22#0 + let check%26#0: uint64 = tmp%24#0 + (assert check%26#0) // transaction type is pay + examples.voting.voting.VotingRoundApp.bootstrap(value%25#0) return 1u block@5: // close_route_L107 let tmp%27#0: uint64 = (txn OnCompletion) @@ -71,17 +71,17 @@ contract examples.voting.voting.VotingRoundApp: (assert tmp%37#0) // OnCompletion is NoOp let tmp%38#0: uint64 = (txn ApplicationID) (assert tmp%38#0) // is not creating - let tmp%41#0: uint64 = (txn GroupIndex) - let awst_tmp%24#0: uint64 = (- tmp%41#0 1u) - let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%24#0) - let tmp%43#0: uint64 = (== tmp%42#0 pay) - let maybe_value%39#0: uint64 = awst_tmp%24#0 - let maybe_value_did_exist%40#0: uint64 = tmp%43#0 - (assert maybe_value_did_exist%40#0) // transaction type is pay + let tmp%39#0: uint64 = (txn GroupIndex) + let awst_tmp%22#0: uint64 = (- tmp%39#0 1u) + let tmp%40#0: uint64 = ((gtxns TypeEnum) awst_tmp%22#0) + let tmp%41#0: uint64 = (== tmp%40#0 pay) + let value%42#0: uint64 = awst_tmp%22#0 + let check%43#0: uint64 = tmp%41#0 + (assert check%43#0) // transaction type is pay let tmp%44#0: bytes = (txna ApplicationArgs 1) let tmp%45#0: bytes = ((extract 2 0) tmp%44#0) let tmp%46#0: bytes = (txna ApplicationArgs 2) - examples.voting.voting.VotingRoundApp.vote(maybe_value%39#0, tmp%45#0, tmp%46#0) + examples.voting.voting.VotingRoundApp.vote(value%42#0, tmp%45#0, tmp%46#0) return 1u block@8: // switch_case_default_L48 goto block@9 diff --git a/examples/voting/puya.log b/examples/voting/puya.log index 80dabf8008..6b577bc60d 100644 --- a/examples/voting/puya.log +++ b/examples/voting/puya.log @@ -568,14 +568,14 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: awst_tmp%24#0, maybe_value%21#0 -debug: Replacing {maybe_value%21#0} with awst_tmp%24#0 made 1 modifications -debug: Found equivalence set: tmp%26#0, maybe_value_did_exist%22#0 -debug: Replacing {maybe_value_did_exist%22#0} with tmp%26#0 made 1 modifications -debug: Found equivalence set: awst_tmp%24#1, maybe_value%39#0 -debug: Replacing {maybe_value%39#0} with awst_tmp%24#1 made 1 modifications -debug: Found equivalence set: tmp%43#0, maybe_value_did_exist%40#0 -debug: Replacing {maybe_value_did_exist%40#0} with tmp%43#0 made 1 modifications +debug: Found equivalence set: awst_tmp%22#0, value%25#0 +debug: Replacing {value%25#0} with awst_tmp%22#0 made 1 modifications +debug: Found equivalence set: tmp%24#0, check%26#0 +debug: Replacing {check%26#0} with tmp%24#0 made 1 modifications +debug: Found equivalence set: awst_tmp%22#1, value%42#0 +debug: Replacing {value%42#0} with awst_tmp%22#1 made 1 modifications +debug: Found equivalence set: tmp%41#0, check%43#0 +debug: Replacing {check%43#0} with tmp%41#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops @@ -1332,7 +1332,7 @@ debug: Removing Phis from examples.voting.voting.increment_vote_in_box debug: Removing Phis from examples.voting.voting.VotingRoundApp.__init__ debug: Removing Phis from examples.voting.voting.VotingRoundApp.clear_state_program debug: Coalescing local variables in examples.voting.voting.VotingRoundApp.approval_program using strategy RootOperandGrouping -debug: Coalescing awst_tmp%24#0 with [awst_tmp%24#1] +debug: Coalescing awst_tmp%22#0 with [awst_tmp%22#1] debug: Coalescing resulted in 3 replacement/s debug: Coalescing local variables in examples.voting.voting.VotingRoundApp.create using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -1559,16 +1559,16 @@ debug: Inserted main_bootstrap_route@4.ops[5]: 'store tmp%19#0 to l-stack (copy) debug: Replaced main_bootstrap_route@4.ops[7]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' debug: Inserted main_bootstrap_route@4.ops[10]: 'store tmp%20#0 to l-stack (copy)' debug: Replaced main_bootstrap_route@4.ops[12]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@4.ops[15]: 'store tmp%23#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@4.ops[17]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@4.ops[20]: 'store awst_tmp%24#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@4.ops[22]: 'load awst_tmp%24#0' with 'load awst_tmp%24#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@4.ops[24]: 'store tmp%25#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@4.ops[26]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@4.ops[29]: 'store tmp%26#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@4.ops[31]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' -debug: Inserted main_bootstrap_route@4.ops[23]: 'store awst_tmp%24#0 to l-stack (copy)' -debug: Replaced main_bootstrap_route@4.ops[34]: 'load awst_tmp%24#0' with 'load awst_tmp%24#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@4.ops[15]: 'store tmp%21#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@4.ops[17]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@4.ops[20]: 'store awst_tmp%22#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@4.ops[22]: 'load awst_tmp%22#0' with 'load awst_tmp%22#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@4.ops[24]: 'store tmp%23#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@4.ops[26]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@4.ops[29]: 'store tmp%24#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@4.ops[31]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' +debug: Inserted main_bootstrap_route@4.ops[23]: 'store awst_tmp%22#0 to l-stack (copy)' +debug: Replaced main_bootstrap_route@4.ops[34]: 'load awst_tmp%22#0' with 'load awst_tmp%22#0 from l-stack (no copy)' debug: Inserted main_close_route@5.ops[1]: 'store tmp%27#0 to l-stack (copy)' debug: Replaced main_close_route@5.ops[3]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' debug: Inserted main_close_route@5.ops[5]: 'store tmp%28#0 to l-stack (copy)' @@ -1593,22 +1593,22 @@ debug: Inserted main_vote_route@7.ops[5]: 'store tmp%37#0 to l-stack (copy)' debug: Replaced main_vote_route@7.ops[7]: 'load tmp%37#0' with 'load tmp%37#0 from l-stack (no copy)' debug: Inserted main_vote_route@7.ops[10]: 'store tmp%38#0 to l-stack (copy)' debug: Replaced main_vote_route@7.ops[12]: 'load tmp%38#0' with 'load tmp%38#0 from l-stack (no copy)' -debug: Inserted main_vote_route@7.ops[15]: 'store tmp%41#0 to l-stack (copy)' -debug: Replaced main_vote_route@7.ops[17]: 'load tmp%41#0' with 'load tmp%41#0 from l-stack (no copy)' -debug: Inserted main_vote_route@7.ops[20]: 'store awst_tmp%24#0 to l-stack (copy)' -debug: Replaced main_vote_route@7.ops[22]: 'load awst_tmp%24#0' with 'load awst_tmp%24#0 from l-stack (no copy)' -debug: Inserted main_vote_route@7.ops[24]: 'store tmp%42#0 to l-stack (copy)' -debug: Replaced main_vote_route@7.ops[26]: 'load tmp%42#0' with 'load tmp%42#0 from l-stack (no copy)' -debug: Inserted main_vote_route@7.ops[29]: 'store tmp%43#0 to l-stack (copy)' -debug: Replaced main_vote_route@7.ops[31]: 'load tmp%43#0' with 'load tmp%43#0 from l-stack (no copy)' +debug: Inserted main_vote_route@7.ops[15]: 'store tmp%39#0 to l-stack (copy)' +debug: Replaced main_vote_route@7.ops[17]: 'load tmp%39#0' with 'load tmp%39#0 from l-stack (no copy)' +debug: Inserted main_vote_route@7.ops[20]: 'store awst_tmp%22#0 to l-stack (copy)' +debug: Replaced main_vote_route@7.ops[22]: 'load awst_tmp%22#0' with 'load awst_tmp%22#0 from l-stack (no copy)' +debug: Inserted main_vote_route@7.ops[24]: 'store tmp%40#0 to l-stack (copy)' +debug: Replaced main_vote_route@7.ops[26]: 'load tmp%40#0' with 'load tmp%40#0 from l-stack (no copy)' +debug: Inserted main_vote_route@7.ops[29]: 'store tmp%41#0 to l-stack (copy)' +debug: Replaced main_vote_route@7.ops[31]: 'load tmp%41#0' with 'load tmp%41#0 from l-stack (no copy)' debug: Inserted main_vote_route@7.ops[34]: 'store tmp%44#0 to l-stack (copy)' debug: Replaced main_vote_route@7.ops[36]: 'load tmp%44#0' with 'load tmp%44#0 from l-stack (no copy)' debug: Inserted main_vote_route@7.ops[40]: 'store tmp%46#0 to l-stack (copy)' debug: Replaced main_vote_route@7.ops[44]: 'load tmp%46#0' with 'load tmp%46#0 from l-stack (no copy)' debug: Inserted main_vote_route@7.ops[38]: 'store tmp%45#0 to l-stack (copy)' debug: Replaced main_vote_route@7.ops[44]: 'load tmp%45#0' with 'load tmp%45#0 from l-stack (no copy)' -debug: Inserted main_vote_route@7.ops[23]: 'store awst_tmp%24#0 to l-stack (copy)' -debug: Replaced main_vote_route@7.ops[44]: 'load awst_tmp%24#0' with 'load awst_tmp%24#0 from l-stack (no copy)' +debug: Inserted main_vote_route@7.ops[23]: 'store awst_tmp%22#0 to l-stack (copy)' +debug: Replaced main_vote_route@7.ops[44]: 'load awst_tmp%22#0' with 'load awst_tmp%22#0 from l-stack (no copy)' debug: Found 2 edge set/s for examples.voting.voting.VotingRoundApp.approval_program debug: Inserted create_block@0.ops[3]: 'store tmp%0#0 to l-stack (copy)' debug: Replaced create_block@0.ops[5]: 'load tmp%0#0' with 'load tmp%0#0 from l-stack (no copy)' diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py index ffd26ae876..d5e2e1fcbe 100644 --- a/src/puya/awst/nodes.py +++ b/src/puya/awst/nodes.py @@ -720,9 +720,9 @@ class CheckedMaybe(Expression): the 2nd bool element is true""" expr: Expression - comment: str | None + comment: str - def __init__(self, expr: Expression, comment: str | None = None) -> None: + def __init__(self, expr: Expression, comment: str) -> None: match expr.wtype: case wtypes.WTuple(types=(wtype, wtypes.bool_wtype)): pass @@ -744,7 +744,7 @@ def from_tuple_items( expr: Expression, check: Expression, source_location: SourceLocation, - comment: str | None = None, + comment: str, ) -> CheckedMaybe: if check.wtype != wtypes.bool_wtype: raise InternalError( diff --git a/src/puya/ir/builder/_utils.py b/src/puya/ir/builder/_utils.py index 8cfbd978f2..630302c1b8 100644 --- a/src/puya/ir/builder/_utils.py +++ b/src/puya/ir/builder/_utils.py @@ -1,5 +1,5 @@ -from collections.abc import Iterator -from typing import Sequence +import typing +from collections.abc import Iterator, Sequence from puya.avm_type import AVMType from puya.awst import nodes as awst_nodes @@ -22,12 +22,34 @@ from puya.parse import SourceLocation +@typing.overload +def assign( + context: IRFunctionBuildContext, + source: ValueProvider, + *, + names: Sequence[tuple[str, SourceLocation | None]], + source_location: SourceLocation | None, +) -> Sequence[Register]: + ... + + +@typing.overload +def assign( + context: IRFunctionBuildContext, + source: ValueProvider, + *, + temp_description: str | Sequence[str], + source_location: SourceLocation | None, +) -> Sequence[Register]: + ... + + def assign( context: IRFunctionBuildContext, source: ValueProvider, *, names: Sequence[tuple[str, SourceLocation | None]] | None = None, - temp_description: str | None = None, + temp_description: str | Sequence[str] | None = None, source_location: SourceLocation | None, ) -> Sequence[Register]: atypes = source.types @@ -38,9 +60,11 @@ def assign( if temp_description is not None: assert names is None, "One and only one of names and temp_description should be supplied" + if isinstance(temp_description, str): + temp_description = [temp_description] * len(atypes) targets = [ - mktemp(context, atype, source_location, description=temp_description) - for atype in atypes + mktemp(context, atype, source_location, description=descr) + for atype, descr in zip(atypes, temp_description, strict=True) ] else: assert ( diff --git a/src/puya/ir/builder/main.py b/src/puya/ir/builder/main.py index fbe6a907bc..33be1fdb66 100644 --- a/src/puya/ir/builder/main.py +++ b/src/puya/ir/builder/main.py @@ -16,7 +16,7 @@ from puya.errors import CodeError, InternalError, TodoError from puya.ir.avm_ops import AVMOp from puya.ir.builder import arc4, flow_control, state -from puya.ir.builder._utils import assign, assign_targets, mkblocks, mktemp +from puya.ir.builder._utils import assert_value, assign, mkblocks from puya.ir.builder.assignment import handle_assignment, handle_assignment_expr from puya.ir.builder.iteration import handle_for_in_loop from puya.ir.builder.itxn import InnerTransactionBuilder @@ -250,36 +250,20 @@ def visit_numeric_comparison_expression( ) def visit_checked_maybe(self, expr: awst_nodes.CheckedMaybe) -> TExpression: - value_atype = wtype_to_avm_type(expr.wtype) - value_tmp = mktemp( + value_with_check = self.visit_expr(expr.expr) + value, check = assign( self.context, - atype=value_atype, + value_with_check, + temp_description=("value", "check"), source_location=expr.source_location, - description="maybe_value", ) - did_exist_tmp = mktemp( + assert_value( self.context, - atype=AVMType.uint64, + check, + comment=expr.comment, source_location=expr.source_location, - description="maybe_value_did_exist", ) - maybe_value = self.visit_expr(expr.expr) - assign_targets( - self.context, - source=maybe_value, - targets=[value_tmp, did_exist_tmp], - assignment_location=expr.source_location, - ) - self.context.block_builder.add( - Intrinsic( - op=AVMOp.assert_, - args=[did_exist_tmp], - comment=expr.comment or "check value exists", - source_location=expr.source_location, - ) - ) - - return value_tmp + return value def visit_var_expression(self, expr: awst_nodes.VarExpression) -> TExpression: if isinstance(expr.wtype, wtypes.WTuple): diff --git a/test_cases/abi_routing/out/Reference.approval.mir b/test_cases/abi_routing/out/Reference.approval.mir index 2dd7b69a8c..1cc16ad3e9 100644 --- a/test_cases/abi_routing/out/Reference.approval.mir +++ b/test_cases/abi_routing/out/Reference.approval.mir @@ -160,26 +160,26 @@ main_with_transactions_route@8: txna ApplicationArgs 2 // tmp%30#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 // virtual: store tmp%31#0 to l-stack (no copy) tmp%30#0,tmp%31#0 class Reference(ARC4Contract): abi_routing/contract.py:21 txn GroupIndex // tmp%30#0,tmp%31#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%34#0 to l-stack (no copy) tmp%30#0,tmp%31#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%34#0 from l-stack (no copy) tmp%30#0,tmp%31#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 1 // tmp%30#0,tmp%31#0,tmp%34#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%32#0 to l-stack (no copy) tmp%30#0,tmp%31#0,tmp%32#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%32#0 from l-stack (no copy) tmp%30#0,tmp%31#0,tmp%32#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 1 // tmp%30#0,tmp%31#0,tmp%32#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 - // tmp%30#0,tmp%31#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store awst_tmp%35#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load awst_tmp%35#0 from l-stack (copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - gtxns TypeEnum // tmp%30#0,tmp%31#0,awst_tmp%35#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%36#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%36#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int pay // tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%36#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 - == // tmp%30#0,tmp%31#0,awst_tmp%35#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%37#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%37#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%37#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%37#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - assert // transaction type is pay // tmp%30#0,tmp%31#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 3 // tmp%30#0,tmp%31#0,awst_tmp%35#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%38#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%38#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 3 // load tmp%30#0 from l-stack (no copy) tmp%31#0,awst_tmp%35#0,tmp%38#0,tmp%30#0 arc4.abimethod abi_routing/contract.py:95 - uncover 3 // load tmp%31#0 from l-stack (no copy) awst_tmp%35#0,tmp%38#0,tmp%30#0,tmp%31#0 arc4.abimethod abi_routing/contract.py:95 - uncover 3 // load awst_tmp%35#0 from l-stack (no copy) tmp%38#0,tmp%30#0,tmp%31#0,awst_tmp%35#0 arc4.abimethod abi_routing/contract.py:95 - uncover 3 // load tmp%38#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%35#0,tmp%38#0 arc4.abimethod abi_routing/contract.py:95 + // virtual: store awst_tmp%33#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%33#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load awst_tmp%33#0 from l-stack (copy) tmp%30#0,tmp%31#0,awst_tmp%33#0,awst_tmp%33#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + gtxns TypeEnum // tmp%30#0,tmp%31#0,awst_tmp%33#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%34#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%33#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%34#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%33#0,tmp%34#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int pay // tmp%30#0,tmp%31#0,awst_tmp%33#0,tmp%34#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 + == // tmp%30#0,tmp%31#0,awst_tmp%33#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%35#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%33#0,tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%35#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%33#0,tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + assert // transaction type is pay // tmp%30#0,tmp%31#0,awst_tmp%33#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 3 // tmp%30#0,tmp%31#0,awst_tmp%33#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%38#0 to l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%33#0,tmp%38#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 3 // load tmp%30#0 from l-stack (no copy) tmp%31#0,awst_tmp%33#0,tmp%38#0,tmp%30#0 arc4.abimethod abi_routing/contract.py:95 + uncover 3 // load tmp%31#0 from l-stack (no copy) awst_tmp%33#0,tmp%38#0,tmp%30#0,tmp%31#0 arc4.abimethod abi_routing/contract.py:95 + uncover 3 // load awst_tmp%33#0 from l-stack (no copy) tmp%38#0,tmp%30#0,tmp%31#0,awst_tmp%33#0 arc4.abimethod abi_routing/contract.py:95 + uncover 3 // load tmp%38#0 from l-stack (no copy) tmp%30#0,tmp%31#0,awst_tmp%33#0,tmp%38#0 arc4.abimethod abi_routing/contract.py:95 callsub with_transactions // arc4.abimethod abi_routing/contract.py:95 int 1 // 1 arc4.abimethod abi_routing/contract.py:95 return // arc4.abimethod abi_routing/contract.py:95 @@ -425,168 +425,168 @@ main_method_with_more_than_15_args_route@15: txna ApplicationArgs 7 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 // virtual: store tmp%104#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0 class Reference(ARC4Contract): abi_routing/contract.py:21 txn GroupIndex // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%107#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%107#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%107#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%105#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%105#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%105#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%105#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,tmp%105#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 - // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store awst_tmp%108#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load awst_tmp%108#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%109#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%109#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%109#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 - == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%110#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%110#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%110#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%110#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%111#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 9 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%112#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 10 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%113#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 11 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%114#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 12 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%115#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 13 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%116#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 14 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%117#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%118#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%118#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 0 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%119#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%120#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%120#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 8 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%121#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%122#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%122#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 16 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%123#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%123#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%124#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%125#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%125#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 24 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%126#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%127#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%127#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 32 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%128#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%129#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 40 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0,40 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_index%130#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load item_index%130#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length%131#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load item_length%131#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 - + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length_plus_2%132#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load tmp%129#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_index%130#0,item_length_plus_2%132#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_index%130#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_length_plus_2%132#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_length_plus_2%132#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%133#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%133#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%134#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%135#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 42 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0,42 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_index%136#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dig 1 // load item_index%136#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length%137#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load item_length%137#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 - + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store item_length_plus_2%138#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load tmp%135#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_index%136#0,item_length_plus_2%138#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_index%136#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_length_plus_2%138#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 2 // load item_length_plus_2%138#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%139#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%139#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%140#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%141#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%141#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 44 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%142#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%142#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%143#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%143#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txnas Assets // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%144#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txn GroupIndex // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%147#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%147#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%147#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 - - // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store awst_tmp%35#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - dup // load awst_tmp%35#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%148#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%148#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%148#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 - == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%149#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%149#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%149#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%149#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%150#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%150#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 45 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%151#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%152#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: load tmp%152#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - extract 53 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 - // virtual: store tmp%153#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0 class Reference(ARC4Contract): abi_routing/contract.py:21 - uncover 25 // load tmp%95#0 from l-stack (no copy) tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%96#0 from l-stack (no copy) tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%97#0 from l-stack (no copy) tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%99#0 from l-stack (no copy) tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%102#0 from l-stack (no copy) tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%103#0 from l-stack (no copy) tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%104#0 from l-stack (no copy) awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load awst_tmp%108#0 from l-stack (no copy) tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%111#0 from l-stack (no copy) tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%112#0 from l-stack (no copy) tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%113#0 from l-stack (no copy) tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%114#0 from l-stack (no copy) tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%115#0 from l-stack (no copy) tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%116#0 from l-stack (no copy) tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%117#0 from l-stack (no copy) tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%119#0 from l-stack (no copy) tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%121#0 from l-stack (no copy) tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%124#0 from l-stack (no copy) tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%126#0 from l-stack (no copy) tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%128#0 from l-stack (no copy) tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%134#0 from l-stack (no copy) tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%140#0 from l-stack (no copy) tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%144#0 from l-stack (no copy) awst_tmp%35#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load awst_tmp%35#0 from l-stack (no copy) tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%151#0 from l-stack (no copy) tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0 arc4.abimethod abi_routing/contract.py:165 - uncover 25 // load tmp%153#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%108#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%35#0,tmp%151#0,tmp%153#0 arc4.abimethod abi_routing/contract.py:165 + // virtual: store awst_tmp%106#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load awst_tmp%106#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,awst_tmp%106#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%107#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%107#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%107#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%107#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 + == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%108#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%108#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%108#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%111#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 9 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%112#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 10 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%113#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 11 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%114#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 12 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%115#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 13 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%116#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 14 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%117#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%118#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%118#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%118#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 0 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%119#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%120#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%120#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%120#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 8 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%121#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%122#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%122#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%122#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 16 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%123#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%123#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%123#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%124#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%125#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%125#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%125#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 24 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%126#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%127#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%127#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%127#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 32 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%128#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%129#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 40 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,tmp%129#0,40 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_index%130#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load tmp%129#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load item_index%130#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length%131#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load item_length%131#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length%131#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 + + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length_plus_2%132#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load tmp%129#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_index%130#0,item_length_plus_2%132#0,tmp%129#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_index%130#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,item_length_plus_2%132#0,tmp%129#0,item_index%130#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_length_plus_2%132#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%129#0,item_index%130#0,item_length_plus_2%132#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%133#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%133#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%133#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%134#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%135#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 42 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,tmp%135#0,42 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_index%136#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load tmp%135#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dig 1 // load item_index%136#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract_uint16 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{extract_uint16} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length%137#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load item_length%137#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 2 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length%137#0,2 class Reference(ARC4Contract): abi_routing/contract.py:21 + + // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,{+} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store item_length_plus_2%138#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load tmp%135#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_index%136#0,item_length_plus_2%138#0,tmp%135#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_index%136#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,item_length_plus_2%138#0,tmp%135#0,item_index%136#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 2 // load item_length_plus_2%138#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%135#0,item_index%136#0,item_length_plus_2%138#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract3 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract3} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%139#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%139#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%139#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 2 0 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%140#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%141#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%141#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%141#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 44 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%142#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%142#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%142#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + btoi // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{btoi} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%143#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%143#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%143#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txnas Assets // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,{txnas} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%144#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txn GroupIndex // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{txn} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%145#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%145#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%145#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%145#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int 1 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,tmp%145#0,1 class Reference(ARC4Contract): abi_routing/contract.py:21 + - // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,{-} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store awst_tmp%33#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + dup // load awst_tmp%33#0 from l-stack (copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,awst_tmp%33#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + gtxns TypeEnum // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,{gtxns} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%146#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%146#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%146#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%146#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + int pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%146#0,pay class Reference(ARC4Contract): abi_routing/contract.py:21 + == // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,{==} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%147#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%147#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%147#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + assert // transaction type is pay // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%150#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%150#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%150#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 45 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%151#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + txna ApplicationArgs 15 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,{txna} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%152#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: load tmp%152#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%152#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + extract 53 8 // tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,{extract} class Reference(ARC4Contract): abi_routing/contract.py:21 + // virtual: store tmp%153#0 to l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0 class Reference(ARC4Contract): abi_routing/contract.py:21 + uncover 25 // load tmp%95#0 from l-stack (no copy) tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%96#0 from l-stack (no copy) tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%97#0 from l-stack (no copy) tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%99#0 from l-stack (no copy) tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%102#0 from l-stack (no copy) tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%103#0 from l-stack (no copy) tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%104#0 from l-stack (no copy) awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load awst_tmp%106#0 from l-stack (no copy) tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%111#0 from l-stack (no copy) tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%112#0 from l-stack (no copy) tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%113#0 from l-stack (no copy) tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%114#0 from l-stack (no copy) tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%115#0 from l-stack (no copy) tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%116#0 from l-stack (no copy) tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%117#0 from l-stack (no copy) tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%119#0 from l-stack (no copy) tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%121#0 from l-stack (no copy) tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%124#0 from l-stack (no copy) tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%126#0 from l-stack (no copy) tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%128#0 from l-stack (no copy) tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%134#0 from l-stack (no copy) tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%140#0 from l-stack (no copy) tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%144#0 from l-stack (no copy) awst_tmp%33#0,tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load awst_tmp%33#0 from l-stack (no copy) tmp%151#0,tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%151#0 from l-stack (no copy) tmp%153#0,tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0 arc4.abimethod abi_routing/contract.py:165 + uncover 25 // load tmp%153#0 from l-stack (no copy) tmp%95#0,tmp%96#0,tmp%97#0,tmp%99#0,tmp%102#0,tmp%103#0,tmp%104#0,awst_tmp%106#0,tmp%111#0,tmp%112#0,tmp%113#0,tmp%114#0,tmp%115#0,tmp%116#0,tmp%117#0,tmp%119#0,tmp%121#0,tmp%124#0,tmp%126#0,tmp%128#0,tmp%134#0,tmp%140#0,tmp%144#0,awst_tmp%33#0,tmp%151#0,tmp%153#0 arc4.abimethod abi_routing/contract.py:165 callsub method_with_more_than_15_args // {method_with_more_than_15_args} arc4.abimethod abi_routing/contract.py:165 // virtual: store tmp%154#0 to l-stack (no copy) tmp%154#0 arc4.abimethod abi_routing/contract.py:165 byte 0x151f7c75 // tmp%154#0,0x151f7c75 arc4.abimethod abi_routing/contract.py:165 diff --git a/test_cases/abi_routing/out/Reference.destructured.ir b/test_cases/abi_routing/out/Reference.destructured.ir index 68603a24bc..ee7749bb52 100644 --- a/test_cases/abi_routing/out/Reference.destructured.ir +++ b/test_cases/abi_routing/out/Reference.destructured.ir @@ -63,13 +63,13 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - (assert tmp%37#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + (assert tmp%35#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%35#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%33#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -170,11 +170,11 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - (assert tmp%110#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + (assert tmp%108#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -209,16 +209,16 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = ((extract 44 1) tmp%141#0) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - (assert tmp%149#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + (assert tmp%147#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = ((extract 45 8) tmp%150#0) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = ((extract 53 8) tmp%152#0) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%108#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%35#0, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%106#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%33#0, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/out/Reference.ssa.ir b/test_cases/abi_routing/out/Reference.ssa.ir index 8279dcf93c..2a39d381c8 100644 --- a/test_cases/abi_routing/out/Reference.ssa.ir +++ b/test_cases/abi_routing/out/Reference.ssa.ir @@ -63,14 +63,14 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - let (maybe_value%32#0: uint64, maybe_value_did_exist%33#0: uint64) = (awst_tmp%35#0, tmp%37#0) - (assert maybe_value_did_exist%33#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + let (value%36#0: uint64, check%37#0: uint64) = (awst_tmp%33#0, tmp%35#0) + (assert check%37#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, maybe_value%32#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, value%36#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -171,12 +171,12 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - let (maybe_value%105#0: uint64, maybe_value_did_exist%106#0: uint64) = (awst_tmp%108#0, tmp%110#0) - (assert maybe_value_did_exist%106#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + let (value%109#0: uint64, check%110#0: uint64) = (awst_tmp%106#0, tmp%108#0) + (assert check%110#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -211,17 +211,17 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = (extract3 tmp%141#0 44u 1u) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#1: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#1) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - let (maybe_value%145#0: uint64, maybe_value_did_exist%146#0: uint64) = (awst_tmp%35#1, tmp%149#0) - (assert maybe_value_did_exist%146#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#1: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#1) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + let (value%148#0: uint64, check%149#0: uint64) = (awst_tmp%33#1, tmp%147#0) + (assert check%149#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = (extract3 tmp%150#0 45u 8u) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = (extract3 tmp%152#0 53u 8u) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, maybe_value%105#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, maybe_value%145#0, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, value%109#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, value%148#0, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir index 1f2b56d02b..5c4c108c60 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir @@ -63,13 +63,13 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - (assert tmp%37#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + (assert tmp%35#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%35#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%33#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -170,11 +170,11 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - (assert tmp%110#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + (assert tmp%108#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -209,16 +209,16 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = ((extract 44 1) tmp%141#0) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#1: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#1) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - (assert tmp%149#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#1: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#1) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + (assert tmp%147#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = ((extract 45 8) tmp%150#0) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = ((extract 53 8) tmp%152#0) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%108#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%35#1, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%106#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%33#1, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir index f84305b125..38e2c9afd2 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir @@ -63,13 +63,13 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - (assert tmp%37#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + (assert tmp%35#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%35#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%33#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -170,11 +170,11 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - (assert tmp%110#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + (assert tmp%108#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -209,16 +209,16 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = ((extract 44 1) tmp%141#0) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#1: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#1) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - (assert tmp%149#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#1: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#1) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + (assert tmp%147#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = ((extract 45 8) tmp%150#0) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = ((extract 53 8) tmp%152#0) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%108#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%35#1, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%106#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%33#1, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir index 5b320b76ba..d9e3b7dd13 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir @@ -63,13 +63,13 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - (assert tmp%37#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + (assert tmp%35#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%35#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%33#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -170,11 +170,11 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - (assert tmp%110#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + (assert tmp%108#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -209,16 +209,16 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = ((extract 44 1) tmp%141#0) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#1: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#1) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - (assert tmp%149#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#1: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#1) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + (assert tmp%147#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = ((extract 45 8) tmp%150#0) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = ((extract 53 8) tmp%152#0) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%108#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%35#1, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%106#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%33#1, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir index 93c3f8a141..0ff96c13bb 100644 --- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir +++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir @@ -63,13 +63,13 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - (assert tmp%37#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + (assert tmp%35#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%35#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%33#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -170,11 +170,11 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - (assert tmp%110#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + (assert tmp%108#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -209,16 +209,16 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = ((extract 44 1) tmp%141#0) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#1: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#1) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - (assert tmp%149#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#1: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#1) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + (assert tmp%147#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = ((extract 45 8) tmp%150#0) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = ((extract 53 8) tmp%152#0) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%108#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%35#1, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%106#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%33#1, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/out_O2/Reference.destructured.ir b/test_cases/abi_routing/out_O2/Reference.destructured.ir index 68603a24bc..ee7749bb52 100644 --- a/test_cases/abi_routing/out_O2/Reference.destructured.ir +++ b/test_cases/abi_routing/out_O2/Reference.destructured.ir @@ -63,13 +63,13 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - (assert tmp%37#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + (assert tmp%35#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%35#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, awst_tmp%33#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -170,11 +170,11 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - (assert tmp%110#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + (assert tmp%108#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -209,16 +209,16 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = ((extract 44 1) tmp%141#0) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - (assert tmp%149#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + (assert tmp%147#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = ((extract 45 8) tmp%150#0) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = ((extract 53 8) tmp%152#0) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%108#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%35#0, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, awst_tmp%106#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, awst_tmp%33#0, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir index 22f09bcf77..b612113192 100644 --- a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir +++ b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir @@ -63,15 +63,15 @@ contract test_cases.abi_routing.contract.Reference: let tmp%29#0: uint64 = (btoi tmp%28#0) let tmp%30#0: uint64 = ((txnas Assets) tmp%29#0) let tmp%31#0: bytes = (txna ApplicationArgs 2) - let tmp%34#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%34#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%37#0: uint64 = (== tmp%36#0 pay) - let maybe_value%32#0: uint64 = awst_tmp%35#0 - let maybe_value_did_exist%33#0: uint64 = tmp%37#0 - (assert maybe_value_did_exist%33#0) // transaction type is pay + let tmp%32#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%32#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%35#0: uint64 = (== tmp%34#0 pay) + let value%36#0: uint64 = awst_tmp%33#0 + let check%37#0: uint64 = tmp%35#0 + (assert check%37#0) // transaction type is pay let tmp%38#0: bytes = (txna ApplicationArgs 3) - test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, maybe_value%32#0, tmp%38#0) + test_cases.abi_routing.contract.Reference.with_transactions(tmp%30#0, tmp%31#0, value%36#0, tmp%38#0) return 1u block@9: // compare_assets_route_L108 let tmp%39#0: uint64 = (txn OnCompletion) @@ -172,13 +172,13 @@ contract test_cases.abi_routing.contract.Reference: let tmp%102#0: uint64 = ((txnas Assets) tmp%101#0) let tmp%103#0: bytes = (txna ApplicationArgs 6) let tmp%104#0: bytes = (txna ApplicationArgs 7) - let tmp%107#0: uint64 = (txn GroupIndex) - let awst_tmp%108#0: uint64 = (- tmp%107#0 2u) - let tmp%109#0: uint64 = ((gtxns TypeEnum) awst_tmp%108#0) - let tmp%110#0: uint64 = (== tmp%109#0 pay) - let maybe_value%105#0: uint64 = awst_tmp%108#0 - let maybe_value_did_exist%106#0: uint64 = tmp%110#0 - (assert maybe_value_did_exist%106#0) // transaction type is pay + let tmp%105#0: uint64 = (txn GroupIndex) + let awst_tmp%106#0: uint64 = (- tmp%105#0 2u) + let tmp%107#0: uint64 = ((gtxns TypeEnum) awst_tmp%106#0) + let tmp%108#0: uint64 = (== tmp%107#0 pay) + let value%109#0: uint64 = awst_tmp%106#0 + let check%110#0: uint64 = tmp%108#0 + (assert check%110#0) // transaction type is pay let tmp%111#0: bytes = (txna ApplicationArgs 8) let tmp%112#0: bytes = (txna ApplicationArgs 9) let tmp%113#0: bytes = (txna ApplicationArgs 10) @@ -213,18 +213,18 @@ contract test_cases.abi_routing.contract.Reference: let tmp%142#0: bytes = (extract3 tmp%141#0 44u 1u) let tmp%143#0: uint64 = (btoi tmp%142#0) let tmp%144#0: uint64 = ((txnas Assets) tmp%143#0) - let tmp%147#0: uint64 = (txn GroupIndex) - let awst_tmp%35#0: uint64 = (- tmp%147#0 1u) - let tmp%148#0: uint64 = ((gtxns TypeEnum) awst_tmp%35#0) - let tmp%149#0: uint64 = (== tmp%148#0 pay) - let maybe_value%145#0: uint64 = awst_tmp%35#0 - let maybe_value_did_exist%146#0: uint64 = tmp%149#0 - (assert maybe_value_did_exist%146#0) // transaction type is pay + let tmp%145#0: uint64 = (txn GroupIndex) + let awst_tmp%33#0: uint64 = (- tmp%145#0 1u) + let tmp%146#0: uint64 = ((gtxns TypeEnum) awst_tmp%33#0) + let tmp%147#0: uint64 = (== tmp%146#0 pay) + let value%148#0: uint64 = awst_tmp%33#0 + let check%149#0: uint64 = tmp%147#0 + (assert check%149#0) // transaction type is pay let tmp%150#0: bytes = (txna ApplicationArgs 15) let tmp%151#0: bytes = (extract3 tmp%150#0 45u 8u) let tmp%152#0: bytes = (txna ApplicationArgs 15) let tmp%153#0: bytes = (extract3 tmp%152#0 53u 8u) - let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, maybe_value%105#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, maybe_value%145#0, tmp%151#0, tmp%153#0) + let tmp%154#0: bytes = test_cases.abi_routing.contract.Reference.method_with_more_than_15_args(tmp%95#0, tmp%96#0, tmp%97#0, tmp%99#0, tmp%102#0, tmp%103#0, tmp%104#0, value%109#0, tmp%111#0, tmp%112#0, tmp%113#0, tmp%114#0, tmp%115#0, tmp%116#0, tmp%117#0, tmp%119#0, tmp%121#0, tmp%124#0, tmp%126#0, tmp%128#0, tmp%134#0, tmp%140#0, tmp%144#0, value%148#0, tmp%151#0, tmp%153#0) let tmp%155#0: bytes = (concat 0x151f7c75 tmp%154#0) (log tmp%155#0) return 1u diff --git a/test_cases/abi_routing/puya.log b/test_cases/abi_routing/puya.log index 097550a697..02d6bea5d1 100644 --- a/test_cases/abi_routing/puya.log +++ b/test_cases/abi_routing/puya.log @@ -368,18 +368,18 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: awst_tmp%35#0, maybe_value%32#0 -debug: Replacing {maybe_value%32#0} with awst_tmp%35#0 made 1 modifications -debug: Found equivalence set: tmp%37#0, maybe_value_did_exist%33#0 -debug: Replacing {maybe_value_did_exist%33#0} with tmp%37#0 made 1 modifications -debug: Found equivalence set: awst_tmp%108#0, maybe_value%105#0 -debug: Replacing {maybe_value%105#0} with awst_tmp%108#0 made 1 modifications -debug: Found equivalence set: tmp%110#0, maybe_value_did_exist%106#0 -debug: Replacing {maybe_value_did_exist%106#0} with tmp%110#0 made 1 modifications -debug: Found equivalence set: awst_tmp%35#1, maybe_value%145#0 -debug: Replacing {maybe_value%145#0} with awst_tmp%35#1 made 1 modifications -debug: Found equivalence set: tmp%149#0, maybe_value_did_exist%146#0 -debug: Replacing {maybe_value_did_exist%146#0} with tmp%149#0 made 1 modifications +debug: Found equivalence set: awst_tmp%33#0, value%36#0 +debug: Replacing {value%36#0} with awst_tmp%33#0 made 1 modifications +debug: Found equivalence set: tmp%35#0, check%37#0 +debug: Replacing {check%37#0} with tmp%35#0 made 1 modifications +debug: Found equivalence set: awst_tmp%106#0, value%109#0 +debug: Replacing {value%109#0} with awst_tmp%106#0 made 1 modifications +debug: Found equivalence set: tmp%108#0, check%110#0 +debug: Replacing {check%110#0} with tmp%108#0 made 1 modifications +debug: Found equivalence set: awst_tmp%33#1, value%148#0 +debug: Replacing {value%148#0} with awst_tmp%33#1 made 1 modifications +debug: Found equivalence set: tmp%147#0, check%149#0 +debug: Replacing {check%149#0} with tmp%147#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops @@ -1320,7 +1320,7 @@ debug: Removing Phis from test_cases.abi_routing.contract.Reference.bare_abi_con debug: Removing Phis from test_cases.abi_routing.contract.Reference.__init__ debug: Removing Phis from test_cases.abi_routing.contract.Reference.clear_state_program debug: Coalescing local variables in test_cases.abi_routing.contract.Reference.approval_program using strategy RootOperandGrouping -debug: Coalescing awst_tmp%35#0 with [awst_tmp%35#1] +debug: Coalescing awst_tmp%33#0 with [awst_tmp%33#1] debug: Coalescing resulted in 3 replacement/s debug: Coalescing local variables in test_cases.abi_routing.contract.Reference.noop_with_uint64 using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -1430,18 +1430,18 @@ debug: Inserted main_with_transactions_route@8.ops[15]: 'store tmp%28#0 to l-sta debug: Replaced main_with_transactions_route@8.ops[17]: 'load tmp%28#0' with 'load tmp%28#0 from l-stack (no copy)' debug: Inserted main_with_transactions_route@8.ops[19]: 'store tmp%29#0 to l-stack (copy)' debug: Replaced main_with_transactions_route@8.ops[21]: 'load tmp%29#0' with 'load tmp%29#0 from l-stack (no copy)' -debug: Inserted main_with_transactions_route@8.ops[27]: 'store tmp%34#0 to l-stack (copy)' -debug: Replaced main_with_transactions_route@8.ops[29]: 'load tmp%34#0' with 'load tmp%34#0 from l-stack (no copy)' -debug: Inserted main_with_transactions_route@8.ops[32]: 'store awst_tmp%35#0 to l-stack (copy)' -debug: Replaced main_with_transactions_route@8.ops[34]: 'load awst_tmp%35#0' with 'load awst_tmp%35#0 from l-stack (no copy)' -debug: Inserted main_with_transactions_route@8.ops[36]: 'store tmp%36#0 to l-stack (copy)' -debug: Replaced main_with_transactions_route@8.ops[38]: 'load tmp%36#0' with 'load tmp%36#0 from l-stack (no copy)' -debug: Inserted main_with_transactions_route@8.ops[41]: 'store tmp%37#0 to l-stack (copy)' -debug: Replaced main_with_transactions_route@8.ops[43]: 'load tmp%37#0' with 'load tmp%37#0 from l-stack (no copy)' +debug: Inserted main_with_transactions_route@8.ops[27]: 'store tmp%32#0 to l-stack (copy)' +debug: Replaced main_with_transactions_route@8.ops[29]: 'load tmp%32#0' with 'load tmp%32#0 from l-stack (no copy)' +debug: Inserted main_with_transactions_route@8.ops[32]: 'store awst_tmp%33#0 to l-stack (copy)' +debug: Replaced main_with_transactions_route@8.ops[34]: 'load awst_tmp%33#0' with 'load awst_tmp%33#0 from l-stack (no copy)' +debug: Inserted main_with_transactions_route@8.ops[36]: 'store tmp%34#0 to l-stack (copy)' +debug: Replaced main_with_transactions_route@8.ops[38]: 'load tmp%34#0' with 'load tmp%34#0 from l-stack (no copy)' +debug: Inserted main_with_transactions_route@8.ops[41]: 'store tmp%35#0 to l-stack (copy)' +debug: Replaced main_with_transactions_route@8.ops[43]: 'load tmp%35#0' with 'load tmp%35#0 from l-stack (no copy)' debug: Inserted main_with_transactions_route@8.ops[46]: 'store tmp%38#0 to l-stack (copy)' debug: Replaced main_with_transactions_route@8.ops[51]: 'load tmp%38#0' with 'load tmp%38#0 from l-stack (no copy)' -debug: Inserted main_with_transactions_route@8.ops[35]: 'store awst_tmp%35#0 to l-stack (copy)' -debug: Replaced main_with_transactions_route@8.ops[51]: 'load awst_tmp%35#0' with 'load awst_tmp%35#0 from l-stack (no copy)' +debug: Inserted main_with_transactions_route@8.ops[35]: 'store awst_tmp%33#0 to l-stack (copy)' +debug: Replaced main_with_transactions_route@8.ops[51]: 'load awst_tmp%33#0' with 'load awst_tmp%33#0 from l-stack (no copy)' debug: Inserted main_with_transactions_route@8.ops[25]: 'store tmp%31#0 to l-stack (copy)' debug: Replaced main_with_transactions_route@8.ops[51]: 'load tmp%31#0' with 'load tmp%31#0 from l-stack (no copy)' debug: Inserted main_with_transactions_route@8.ops[23]: 'store tmp%30#0 to l-stack (copy)' @@ -1564,14 +1564,14 @@ debug: Inserted main_method_with_more_than_15_args_route@15.ops[27]: 'store tmp% debug: Replaced main_method_with_more_than_15_args_route@15.ops[29]: 'load tmp%100#0' with 'load tmp%100#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[31]: 'store tmp%101#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[33]: 'load tmp%101#0' with 'load tmp%101#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[41]: 'store tmp%107#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[43]: 'load tmp%107#0' with 'load tmp%107#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[46]: 'store awst_tmp%108#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[48]: 'load awst_tmp%108#0' with 'load awst_tmp%108#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[50]: 'store tmp%109#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[52]: 'load tmp%109#0' with 'load tmp%109#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[55]: 'store tmp%110#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[57]: 'load tmp%110#0' with 'load tmp%110#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[41]: 'store tmp%105#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[43]: 'load tmp%105#0' with 'load tmp%105#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[46]: 'store awst_tmp%106#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[48]: 'load awst_tmp%106#0' with 'load awst_tmp%106#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[50]: 'store tmp%107#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[52]: 'load tmp%107#0' with 'load tmp%107#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[55]: 'store tmp%108#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[57]: 'load tmp%108#0' with 'load tmp%108#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[74]: 'store tmp%118#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[76]: 'load tmp%118#0' with 'load tmp%118#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[80]: 'store tmp%120#0 to l-stack (copy)' @@ -1602,14 +1602,14 @@ debug: Inserted main_method_with_more_than_15_args_route@15.ops[162]: 'store tmp debug: Replaced main_method_with_more_than_15_args_route@15.ops[164]: 'load tmp%142#0' with 'load tmp%142#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[166]: 'store tmp%143#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[168]: 'load tmp%143#0' with 'load tmp%143#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[172]: 'store tmp%147#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[174]: 'load tmp%147#0' with 'load tmp%147#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[177]: 'store awst_tmp%35#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[179]: 'load awst_tmp%35#0' with 'load awst_tmp%35#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[181]: 'store tmp%148#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[183]: 'load tmp%148#0' with 'load tmp%148#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[186]: 'store tmp%149#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[188]: 'load tmp%149#0' with 'load tmp%149#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[172]: 'store tmp%145#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[174]: 'load tmp%145#0' with 'load tmp%145#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[177]: 'store awst_tmp%33#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[179]: 'load awst_tmp%33#0' with 'load awst_tmp%33#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[181]: 'store tmp%146#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[183]: 'load tmp%146#0' with 'load tmp%146#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[186]: 'store tmp%147#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[188]: 'load tmp%147#0' with 'load tmp%147#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[191]: 'store tmp%150#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[193]: 'load tmp%150#0' with 'load tmp%150#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[197]: 'store tmp%152#0 to l-stack (copy)' @@ -1642,8 +1642,8 @@ debug: Inserted main_method_with_more_than_15_args_route@15.ops[211]: 'store tmp debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load tmp%153#0' with 'load tmp%153#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[205]: 'store tmp%151#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load tmp%151#0' with 'load tmp%151#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[190]: 'store awst_tmp%35#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load awst_tmp%35#0' with 'load awst_tmp%35#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[190]: 'store awst_tmp%33#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load awst_tmp%33#0' with 'load awst_tmp%33#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[180]: 'store tmp%144#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load tmp%144#0' with 'load tmp%144#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[166]: 'store tmp%140#0 to l-stack (copy)' @@ -1674,8 +1674,8 @@ debug: Inserted main_method_with_more_than_15_args_route@15.ops[62]: 'store tmp% debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load tmp%112#0' with 'load tmp%112#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[60]: 'store tmp%111#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load tmp%111#0' with 'load tmp%111#0 from l-stack (no copy)' -debug: Inserted main_method_with_more_than_15_args_route@15.ops[49]: 'store awst_tmp%108#0 to l-stack (copy)' -debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load awst_tmp%108#0' with 'load awst_tmp%108#0 from l-stack (no copy)' +debug: Inserted main_method_with_more_than_15_args_route@15.ops[49]: 'store awst_tmp%106#0 to l-stack (copy)' +debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load awst_tmp%106#0' with 'load awst_tmp%106#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[39]: 'store tmp%104#0 to l-stack (copy)' debug: Replaced main_method_with_more_than_15_args_route@15.ops[238]: 'load tmp%104#0' with 'load tmp%104#0 from l-stack (no copy)' debug: Inserted main_method_with_more_than_15_args_route@15.ops[37]: 'store tmp%103#0 to l-stack (copy)' diff --git a/test_cases/application/out/Reference.approval.mir b/test_cases/application/out/Reference.approval.mir index 70220607d9..454a3ec7d2 100644 --- a/test_cases/application/out/Reference.approval.mir +++ b/test_cases/application/out/Reference.approval.mir @@ -1,12 +1,12 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.application.contract.Reference.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} - // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // // Implicit fall through to main_on_create@1 // @@ -15,163 +15,163 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txn NumAppArgs // {txn} op.Txn.num_app_args application/contract.py:26 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 op.Txn.num_app_args application/contract.py:26 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 op.Txn.num_app_args == 1: application/contract.py:26 - int 1 // tmp%1#0,1 1 application/contract.py:26 - == // {==} op.Txn.num_app_args == 1: application/contract.py:26 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 op.Txn.num_app_args == 1: application/contract.py:26 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 if op.Txn.num_app_args == 1: application/contract.py:26 - bz main_after_if_else@7 // if op.Txn.num_app_args == 1: application/contract.py:26 - // Implicit fall through to main_if_body@3 // if op.Txn.num_app_args == 1: application/contract.py:26 + txn NumAppArgs // {txn} op.Txn.num_app_args application/contract.py:26 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 op.Txn.num_app_args application/contract.py:26 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 op.Txn.num_app_args == 1: application/contract.py:26 + int 1 // tmp%1#0,1 1 application/contract.py:26 + == // {==} op.Txn.num_app_args == 1: application/contract.py:26 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 op.Txn.num_app_args == 1: application/contract.py:26 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 if op.Txn.num_app_args == 1: application/contract.py:26 + bz main_after_if_else@7 // if op.Txn.num_app_args == 1: application/contract.py:26 + // Implicit fall through to main_if_body@3 // if op.Txn.num_app_args == 1: application/contract.py:26 main_if_body@3: - txna ApplicationArgs 0 // {txna} op.Txn.application_args(0) application/contract.py:27 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 op.Txn.application_args(0) application/contract.py:27 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 op.Txn.application_args(0) == b"validate": application/contract.py:27 - byte "validate" // tmp%3#0,"validate" b"validate" application/contract.py:27 - == // {==} op.Txn.application_args(0) == b"validate": application/contract.py:27 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 op.Txn.application_args(0) == b"validate": application/contract.py:27 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 if op.Txn.application_args(0) == b"validate": application/contract.py:27 - assert // Expected validate // if op.Txn.application_args(0) == b"validate": application/contract.py:27 - global CurrentApplicationID // {global} op.Global.current_application_id application/contract.py:28 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 op.Global.current_application_id application/contract.py:28 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 self.validate_asset(Application(op.Global.current_application_id)) application/contract.py:28 - callsub validate_asset // self.validate_asset(Application(op.Global.current_application_id)) application/contract.py:28 + txna ApplicationArgs 0 // {txna} op.Txn.application_args(0) application/contract.py:27 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 op.Txn.application_args(0) application/contract.py:27 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 op.Txn.application_args(0) == b"validate": application/contract.py:27 + byte "validate" // tmp%3#0,"validate" b"validate" application/contract.py:27 + == // {==} op.Txn.application_args(0) == b"validate": application/contract.py:27 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 op.Txn.application_args(0) == b"validate": application/contract.py:27 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 if op.Txn.application_args(0) == b"validate": application/contract.py:27 + assert // Expected validate // if op.Txn.application_args(0) == b"validate": application/contract.py:27 + global CurrentApplicationID // {global} op.Global.current_application_id application/contract.py:28 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 op.Global.current_application_id application/contract.py:28 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 self.validate_asset(Application(op.Global.current_application_id)) application/contract.py:28 + callsub validate_asset // self.validate_asset(Application(op.Global.current_application_id)) application/contract.py:28 // Implicit fall through to main_after_if_else@7 // main_after_if_else@7: - int 1 // 1 True application/contract.py:31 - return // return True application/contract.py:31 + int 1 // 1 True application/contract.py:31 + return // return True application/contract.py:31 // test_cases.application.contract.Reference.validate_asset(app: uint64) -> void: validate_asset: - proto 1 0 // (𝕡) app#0 | @subroutine\ndef validate_asset(self, app: Application) -> None: application/contract.py:36-37 + proto 1 0 // (𝕡) app#0 | @subroutine\ndef validate_asset(self, app: Application) -> None: application/contract.py:36-37 validate_asset_block@0: - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.creator application/contract.py:38 - app_params_get AppCreator // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.creator application/contract.py:38 - // virtual: store maybe_value_did_exist%1#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%1#0,{app_params_get}.0 app.creator application/contract.py:38 - // virtual: store maybe_value%0#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%0#0,maybe_value_did_exist%1#0 app.creator application/contract.py:38 - // virtual: load maybe_value_did_exist%1#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%0#0,maybe_value_did_exist%1#0 app.creator application/contract.py:38 - assert // application exists // (𝕡) app#0 | maybe_value%0#0 app.creator application/contract.py:38 - global CreatorAddress // (𝕡) app#0 | maybe_value%0#0,{global} op.Global.creator_address application/contract.py:38 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%0#0,tmp%2#0 op.Global.creator_address application/contract.py:38 - // virtual: load maybe_value%0#0 from l-stack (no copy) (𝕡) app#0 | tmp%2#0,maybe_value%0#0 app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%0#0,tmp%2#0 app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 - == // (𝕡) app#0 | {==} app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) app#0 | tmp%3#0 app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 - // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) app#0 | tmp%3#0 assert app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 - assert // expected creator // (𝕡) app#0 | assert app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.global_num_uint application/contract.py:39 - app_params_get AppGlobalNumUint // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.global_num_uint application/contract.py:39 - // virtual: store maybe_value_did_exist%5#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%5#0,{app_params_get}.0 app.global_num_uint application/contract.py:39 - // virtual: store maybe_value%4#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%4#0,maybe_value_did_exist%5#0 app.global_num_uint application/contract.py:39 - // virtual: load maybe_value_did_exist%5#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%4#0,maybe_value_did_exist%5#0 app.global_num_uint application/contract.py:39 - assert // application exists // (𝕡) app#0 | maybe_value%4#0 app.global_num_uint application/contract.py:39 - // virtual: load maybe_value%4#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%4#0 app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 - int 1 // (𝕡) app#0 | maybe_value%4#0,1 1 application/contract.py:39 - == // (𝕡) app#0 | {==} app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) app#0 | tmp%6#0 app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) app#0 | tmp%6#0 assert app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 - assert // expected global_num_uint // (𝕡) app#0 | assert app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.global_num_byte_slice application/contract.py:40 - app_params_get AppGlobalNumByteSlice // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.global_num_byte_slice application/contract.py:40 - // virtual: store maybe_value_did_exist%8#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%8#0,{app_params_get}.0 app.global_num_byte_slice application/contract.py:40 - // virtual: store maybe_value%7#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%7#0,maybe_value_did_exist%8#0 app.global_num_byte_slice application/contract.py:40 - // virtual: load maybe_value_did_exist%8#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%7#0,maybe_value_did_exist%8#0 app.global_num_byte_slice application/contract.py:40 - assert // application exists // (𝕡) app#0 | maybe_value%7#0 app.global_num_byte_slice application/contract.py:40 - // virtual: load maybe_value%7#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%7#0 app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 - int 2 // (𝕡) app#0 | maybe_value%7#0,2 2 application/contract.py:40 - == // (𝕡) app#0 | {==} app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 - // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) app#0 | tmp%9#0 app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 - // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) app#0 | tmp%9#0 assert app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 - assert // expected global_num_byte_slice // (𝕡) app#0 | assert app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.local_num_uint application/contract.py:41 - app_params_get AppLocalNumUint // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.local_num_uint application/contract.py:41 - // virtual: store maybe_value_did_exist%11#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%11#0,{app_params_get}.0 app.local_num_uint application/contract.py:41 - // virtual: store maybe_value%10#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%10#0,maybe_value_did_exist%11#0 app.local_num_uint application/contract.py:41 - // virtual: load maybe_value_did_exist%11#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%10#0,maybe_value_did_exist%11#0 app.local_num_uint application/contract.py:41 - assert // application exists // (𝕡) app#0 | maybe_value%10#0 app.local_num_uint application/contract.py:41 - // virtual: load maybe_value%10#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%10#0 app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 - int 3 // (𝕡) app#0 | maybe_value%10#0,3 3 application/contract.py:41 - == // (𝕡) app#0 | {==} app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) app#0 | tmp%12#0 app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) app#0 | tmp%12#0 assert app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 - assert // expected local_num_uint // (𝕡) app#0 | assert app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.local_num_byte_slice application/contract.py:42 - app_params_get AppLocalNumByteSlice // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.local_num_byte_slice application/contract.py:42 - // virtual: store maybe_value_did_exist%14#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%14#0,{app_params_get}.0 app.local_num_byte_slice application/contract.py:42 - // virtual: store maybe_value%13#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%13#0,maybe_value_did_exist%14#0 app.local_num_byte_slice application/contract.py:42 - // virtual: load maybe_value_did_exist%14#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%13#0,maybe_value_did_exist%14#0 app.local_num_byte_slice application/contract.py:42 - assert // application exists // (𝕡) app#0 | maybe_value%13#0 app.local_num_byte_slice application/contract.py:42 - // virtual: load maybe_value%13#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%13#0 app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 - int 4 // (𝕡) app#0 | maybe_value%13#0,4 4 application/contract.py:42 - == // (𝕡) app#0 | {==} app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) app#0 | tmp%15#0 app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) app#0 | tmp%15#0 assert app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 - assert // expected local_num_byte_slice // (𝕡) app#0 | assert app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.approval_program application/contract.py:43 - app_params_get AppApprovalProgram // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.approval_program application/contract.py:43 - // virtual: store maybe_value_did_exist%17#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%17#0,{app_params_get}.0 app.approval_program application/contract.py:43 - // virtual: store maybe_value%16#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%16#0,maybe_value_did_exist%17#0 app.approval_program application/contract.py:43 - // virtual: load maybe_value_did_exist%17#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%16#0,maybe_value_did_exist%17#0 app.approval_program application/contract.py:43 - assert // application exists // (𝕡) app#0 | maybe_value%16#0 app.approval_program application/contract.py:43 - // virtual: load maybe_value%16#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%16#0 app.approval_program application/contract.py:43 - len // (𝕡) app#0 | {len} app.approval_program application/contract.py:43 - // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) app#0 | tmp%18#0 app.approval_program application/contract.py:43 - // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) app#0 | tmp%18#0 assert app.approval_program, "expected approval_program" application/contract.py:43 - assert // expected approval_program // (𝕡) app#0 | assert app.approval_program, "expected approval_program" application/contract.py:43 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.clear_state_program application/contract.py:44 - app_params_get AppClearStateProgram // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.clear_state_program application/contract.py:44 - // virtual: store maybe_value_did_exist%20#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%20#0,{app_params_get}.0 app.clear_state_program application/contract.py:44 - // virtual: store maybe_value%19#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%19#0,maybe_value_did_exist%20#0 app.clear_state_program application/contract.py:44 - // virtual: load maybe_value_did_exist%20#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%19#0,maybe_value_did_exist%20#0 app.clear_state_program application/contract.py:44 - assert // application exists // (𝕡) app#0 | maybe_value%19#0 app.clear_state_program application/contract.py:44 - // virtual: load maybe_value%19#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%19#0 app.clear_state_program application/contract.py:44 - len // (𝕡) app#0 | {len} app.clear_state_program application/contract.py:44 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) app#0 | tmp%21#0 app.clear_state_program application/contract.py:44 - // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) app#0 | tmp%21#0 assert app.clear_state_program, "expected clear_state_program" application/contract.py:44 - assert // expected clear_state_program // (𝕡) app#0 | assert app.clear_state_program, "expected clear_state_program" application/contract.py:44 - global CurrentApplicationID // (𝕡) app#0 | {global} op.Global.current_application_id application/contract.py:46 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) app#0 | tmp%22#0 op.Global.current_application_id application/contract.py:46 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | tmp%22#0,app#0 app.application_id == op.Global.current_application_id application/contract.py:46 - swap // load tmp%22#0 from l-stack (no copy) (𝕡) app#0 | app#0,tmp%22#0 app.application_id == op.Global.current_application_id application/contract.py:46 - == // (𝕡) app#0 | {==} app.application_id == op.Global.current_application_id application/contract.py:46 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) app#0 | tmp%23#0 app.application_id == op.Global.current_application_id application/contract.py:46 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) app#0 | tmp%23#0 assert (\napp.application_id == op.Global.current_application_id\n), "expected current_applicatio... application/contract.py:45-47 - assert // expected current_application_id // (𝕡) app#0 | assert (\napp.application_id == op.Global.current_application_id\n), "expected current_applicatio... application/contract.py:45-47 - frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.address application/contract.py:49 - app_params_get AppAddress // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.address application/contract.py:49 - // virtual: store maybe_value_did_exist%25#0 to l-stack (no copy) (𝕡) app#0 | maybe_value_did_exist%25#0,{app_params_get}.0 app.address application/contract.py:49 - // virtual: store maybe_value%24#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%24#0,maybe_value_did_exist%25#0 app.address application/contract.py:49 - // virtual: load maybe_value_did_exist%25#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%24#0,maybe_value_did_exist%25#0 app.address application/contract.py:49 - assert // application exists // (𝕡) app#0 | maybe_value%24#0 app.address application/contract.py:49 - global CurrentApplicationAddress // (𝕡) app#0 | maybe_value%24#0,{global} op.Global.current_application_address application/contract.py:49 - // virtual: store tmp%26#0 to l-stack (no copy) (𝕡) app#0 | maybe_value%24#0,tmp%26#0 op.Global.current_application_address application/contract.py:49 - // virtual: load maybe_value%24#0 from l-stack (no copy) (𝕡) app#0 | tmp%26#0,maybe_value%24#0 app.address == op.Global.current_application_address application/contract.py:49 - // virtual: load tmp%26#0 from l-stack (no copy) (𝕡) app#0 | maybe_value%24#0,tmp%26#0 app.address == op.Global.current_application_address application/contract.py:49 - == // (𝕡) app#0 | {==} app.address == op.Global.current_application_address application/contract.py:49 - // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) app#0 | tmp%27#0 app.address == op.Global.current_application_address application/contract.py:49 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) app#0 | tmp%27#0 assert (\napp.address == op.Global.current_application_address\n), "expected current_application_... application/contract.py:48-50 - assert // expected current_application_address // (𝕡) app#0 | assert (\napp.address == op.Global.current_application_address\n), "expected current_application_... application/contract.py:48-50 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.creator application/contract.py:38 + app_params_get AppCreator // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.creator application/contract.py:38 + // virtual: store check%1#0 to l-stack (no copy) (𝕡) app#0 | check%1#0,{app_params_get}.0 app.creator application/contract.py:38 + // virtual: store value%0#0 to l-stack (no copy) (𝕡) app#0 | value%0#0,check%1#0 app.creator application/contract.py:38 + // virtual: load check%1#0 from l-stack (no copy) (𝕡) app#0 | value%0#0,check%1#0 app.creator application/contract.py:38 + assert // application exists // (𝕡) app#0 | value%0#0 app.creator application/contract.py:38 + global CreatorAddress // (𝕡) app#0 | value%0#0,{global} op.Global.creator_address application/contract.py:38 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) app#0 | value%0#0,tmp%2#0 op.Global.creator_address application/contract.py:38 + // virtual: load value%0#0 from l-stack (no copy) (𝕡) app#0 | tmp%2#0,value%0#0 app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) app#0 | value%0#0,tmp%2#0 app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 + == // (𝕡) app#0 | {==} app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 + // virtual: store tmp%3#0 to l-stack (no copy) (𝕡) app#0 | tmp%3#0 app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 + // virtual: load tmp%3#0 from l-stack (no copy) (𝕡) app#0 | tmp%3#0 assert app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 + assert // expected creator // (𝕡) app#0 | assert app.creator == op.Global.creator_address, "expected creator" application/contract.py:38 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.global_num_uint application/contract.py:39 + app_params_get AppGlobalNumUint // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.global_num_uint application/contract.py:39 + // virtual: store check%5#0 to l-stack (no copy) (𝕡) app#0 | check%5#0,{app_params_get}.0 app.global_num_uint application/contract.py:39 + // virtual: store value%4#0 to l-stack (no copy) (𝕡) app#0 | value%4#0,check%5#0 app.global_num_uint application/contract.py:39 + // virtual: load check%5#0 from l-stack (no copy) (𝕡) app#0 | value%4#0,check%5#0 app.global_num_uint application/contract.py:39 + assert // application exists // (𝕡) app#0 | value%4#0 app.global_num_uint application/contract.py:39 + // virtual: load value%4#0 from l-stack (no copy) (𝕡) app#0 | value%4#0 app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 + int 1 // (𝕡) app#0 | value%4#0,1 1 application/contract.py:39 + == // (𝕡) app#0 | {==} app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) app#0 | tmp%6#0 app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) app#0 | tmp%6#0 assert app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 + assert // expected global_num_uint // (𝕡) app#0 | assert app.global_num_uint == 1, "expected global_num_uint" application/contract.py:39 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.global_num_byte_slice application/contract.py:40 + app_params_get AppGlobalNumByteSlice // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.global_num_byte_slice application/contract.py:40 + // virtual: store check%8#0 to l-stack (no copy) (𝕡) app#0 | check%8#0,{app_params_get}.0 app.global_num_byte_slice application/contract.py:40 + // virtual: store value%7#0 to l-stack (no copy) (𝕡) app#0 | value%7#0,check%8#0 app.global_num_byte_slice application/contract.py:40 + // virtual: load check%8#0 from l-stack (no copy) (𝕡) app#0 | value%7#0,check%8#0 app.global_num_byte_slice application/contract.py:40 + assert // application exists // (𝕡) app#0 | value%7#0 app.global_num_byte_slice application/contract.py:40 + // virtual: load value%7#0 from l-stack (no copy) (𝕡) app#0 | value%7#0 app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 + int 2 // (𝕡) app#0 | value%7#0,2 2 application/contract.py:40 + == // (𝕡) app#0 | {==} app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 + // virtual: store tmp%9#0 to l-stack (no copy) (𝕡) app#0 | tmp%9#0 app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 + // virtual: load tmp%9#0 from l-stack (no copy) (𝕡) app#0 | tmp%9#0 assert app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 + assert // expected global_num_byte_slice // (𝕡) app#0 | assert app.global_num_byte_slice == 2, "expected global_num_byte_slice" application/contract.py:40 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.local_num_uint application/contract.py:41 + app_params_get AppLocalNumUint // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.local_num_uint application/contract.py:41 + // virtual: store check%11#0 to l-stack (no copy) (𝕡) app#0 | check%11#0,{app_params_get}.0 app.local_num_uint application/contract.py:41 + // virtual: store value%10#0 to l-stack (no copy) (𝕡) app#0 | value%10#0,check%11#0 app.local_num_uint application/contract.py:41 + // virtual: load check%11#0 from l-stack (no copy) (𝕡) app#0 | value%10#0,check%11#0 app.local_num_uint application/contract.py:41 + assert // application exists // (𝕡) app#0 | value%10#0 app.local_num_uint application/contract.py:41 + // virtual: load value%10#0 from l-stack (no copy) (𝕡) app#0 | value%10#0 app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 + int 3 // (𝕡) app#0 | value%10#0,3 3 application/contract.py:41 + == // (𝕡) app#0 | {==} app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) app#0 | tmp%12#0 app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) app#0 | tmp%12#0 assert app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 + assert // expected local_num_uint // (𝕡) app#0 | assert app.local_num_uint == 3, "expected local_num_uint" application/contract.py:41 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.local_num_byte_slice application/contract.py:42 + app_params_get AppLocalNumByteSlice // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.local_num_byte_slice application/contract.py:42 + // virtual: store check%14#0 to l-stack (no copy) (𝕡) app#0 | check%14#0,{app_params_get}.0 app.local_num_byte_slice application/contract.py:42 + // virtual: store value%13#0 to l-stack (no copy) (𝕡) app#0 | value%13#0,check%14#0 app.local_num_byte_slice application/contract.py:42 + // virtual: load check%14#0 from l-stack (no copy) (𝕡) app#0 | value%13#0,check%14#0 app.local_num_byte_slice application/contract.py:42 + assert // application exists // (𝕡) app#0 | value%13#0 app.local_num_byte_slice application/contract.py:42 + // virtual: load value%13#0 from l-stack (no copy) (𝕡) app#0 | value%13#0 app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 + int 4 // (𝕡) app#0 | value%13#0,4 4 application/contract.py:42 + == // (𝕡) app#0 | {==} app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) app#0 | tmp%15#0 app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) app#0 | tmp%15#0 assert app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 + assert // expected local_num_byte_slice // (𝕡) app#0 | assert app.local_num_byte_slice == 4, "expected local_num_byte_slice" application/contract.py:42 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.approval_program application/contract.py:43 + app_params_get AppApprovalProgram // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.approval_program application/contract.py:43 + // virtual: store check%17#0 to l-stack (no copy) (𝕡) app#0 | check%17#0,{app_params_get}.0 app.approval_program application/contract.py:43 + // virtual: store value%16#0 to l-stack (no copy) (𝕡) app#0 | value%16#0,check%17#0 app.approval_program application/contract.py:43 + // virtual: load check%17#0 from l-stack (no copy) (𝕡) app#0 | value%16#0,check%17#0 app.approval_program application/contract.py:43 + assert // application exists // (𝕡) app#0 | value%16#0 app.approval_program application/contract.py:43 + // virtual: load value%16#0 from l-stack (no copy) (𝕡) app#0 | value%16#0 app.approval_program application/contract.py:43 + len // (𝕡) app#0 | {len} app.approval_program application/contract.py:43 + // virtual: store tmp%18#0 to l-stack (no copy) (𝕡) app#0 | tmp%18#0 app.approval_program application/contract.py:43 + // virtual: load tmp%18#0 from l-stack (no copy) (𝕡) app#0 | tmp%18#0 assert app.approval_program, "expected approval_program" application/contract.py:43 + assert // expected approval_program // (𝕡) app#0 | assert app.approval_program, "expected approval_program" application/contract.py:43 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.clear_state_program application/contract.py:44 + app_params_get AppClearStateProgram // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.clear_state_program application/contract.py:44 + // virtual: store check%20#0 to l-stack (no copy) (𝕡) app#0 | check%20#0,{app_params_get}.0 app.clear_state_program application/contract.py:44 + // virtual: store value%19#0 to l-stack (no copy) (𝕡) app#0 | value%19#0,check%20#0 app.clear_state_program application/contract.py:44 + // virtual: load check%20#0 from l-stack (no copy) (𝕡) app#0 | value%19#0,check%20#0 app.clear_state_program application/contract.py:44 + assert // application exists // (𝕡) app#0 | value%19#0 app.clear_state_program application/contract.py:44 + // virtual: load value%19#0 from l-stack (no copy) (𝕡) app#0 | value%19#0 app.clear_state_program application/contract.py:44 + len // (𝕡) app#0 | {len} app.clear_state_program application/contract.py:44 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) app#0 | tmp%21#0 app.clear_state_program application/contract.py:44 + // virtual: load tmp%21#0 from l-stack (no copy) (𝕡) app#0 | tmp%21#0 assert app.clear_state_program, "expected clear_state_program" application/contract.py:44 + assert // expected clear_state_program // (𝕡) app#0 | assert app.clear_state_program, "expected clear_state_program" application/contract.py:44 + global CurrentApplicationID // (𝕡) app#0 | {global} op.Global.current_application_id application/contract.py:46 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) app#0 | tmp%22#0 op.Global.current_application_id application/contract.py:46 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | tmp%22#0,app#0 app.application_id == op.Global.current_application_id application/contract.py:46 + swap // load tmp%22#0 from l-stack (no copy) (𝕡) app#0 | app#0,tmp%22#0 app.application_id == op.Global.current_application_id application/contract.py:46 + == // (𝕡) app#0 | {==} app.application_id == op.Global.current_application_id application/contract.py:46 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) app#0 | tmp%23#0 app.application_id == op.Global.current_application_id application/contract.py:46 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) app#0 | tmp%23#0 assert (\napp.application_id == op.Global.current_application_id\n), "expected current_applicatio... application/contract.py:45-47 + assert // expected current_application_id // (𝕡) app#0 | assert (\napp.application_id == op.Global.current_application_id\n), "expected current_applicatio... application/contract.py:45-47 + frame_dig -1 // load app#0 from parameters (𝕡) app#0 | app#0 app.address application/contract.py:49 + app_params_get AppAddress // (𝕡) app#0 | {app_params_get}.0,{app_params_get}.1 app.address application/contract.py:49 + // virtual: store check%25#0 to l-stack (no copy) (𝕡) app#0 | check%25#0,{app_params_get}.0 app.address application/contract.py:49 + // virtual: store value%24#0 to l-stack (no copy) (𝕡) app#0 | value%24#0,check%25#0 app.address application/contract.py:49 + // virtual: load check%25#0 from l-stack (no copy) (𝕡) app#0 | value%24#0,check%25#0 app.address application/contract.py:49 + assert // application exists // (𝕡) app#0 | value%24#0 app.address application/contract.py:49 + global CurrentApplicationAddress // (𝕡) app#0 | value%24#0,{global} op.Global.current_application_address application/contract.py:49 + // virtual: store tmp%26#0 to l-stack (no copy) (𝕡) app#0 | value%24#0,tmp%26#0 op.Global.current_application_address application/contract.py:49 + // virtual: load value%24#0 from l-stack (no copy) (𝕡) app#0 | tmp%26#0,value%24#0 app.address == op.Global.current_application_address application/contract.py:49 + // virtual: load tmp%26#0 from l-stack (no copy) (𝕡) app#0 | value%24#0,tmp%26#0 app.address == op.Global.current_application_address application/contract.py:49 + == // (𝕡) app#0 | {==} app.address == op.Global.current_application_address application/contract.py:49 + // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) app#0 | tmp%27#0 app.address == op.Global.current_application_address application/contract.py:49 + // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) app#0 | tmp%27#0 assert (\napp.address == op.Global.current_application_address\n), "expected current_application_... application/contract.py:48-50 + assert // expected current_application_address // (𝕡) app#0 | assert (\napp.address == op.Global.current_application_address\n), "expected current_application_... application/contract.py:48-50 retsub // // test_cases.application.contract.Reference.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: application/contract.py:13 + proto 0 0 // def __init__(self) -> None: application/contract.py:13 __init___block@0: - byte "int_1" // "int_1" self.int_1 application/contract.py:14 - int 0 // "int_1",0 0 application/contract.py:14 - app_global_put // self.int_1 = UInt64(0) application/contract.py:14 - byte "bytes_1" // "bytes_1" self.bytes_1 application/contract.py:15 - byte "" // "bytes_1","" b"" application/contract.py:15 - app_global_put // self.bytes_1 = Bytes(b"") application/contract.py:15 - byte "bytes_2" // "bytes_2" self.bytes_2 application/contract.py:16 - byte "" // "bytes_2","" b"" application/contract.py:16 - app_global_put // self.bytes_2 = Bytes(b"") application/contract.py:16 + byte "int_1" // "int_1" self.int_1 application/contract.py:14 + int 0 // "int_1",0 0 application/contract.py:14 + app_global_put // self.int_1 = UInt64(0) application/contract.py:14 + byte "bytes_1" // "bytes_1" self.bytes_1 application/contract.py:15 + byte "" // "bytes_1","" b"" application/contract.py:15 + app_global_put // self.bytes_1 = Bytes(b"") application/contract.py:15 + byte "bytes_2" // "bytes_2" self.bytes_2 application/contract.py:16 + byte "" // "bytes_2","" b"" application/contract.py:16 + app_global_put // self.bytes_2 = Bytes(b"") application/contract.py:16 retsub // diff --git a/test_cases/application/out/Reference.destructured.ir b/test_cases/application/out/Reference.destructured.ir index 14b83bdf56..6f16f1b85e 100644 --- a/test_cases/application/out/Reference.destructured.ir +++ b/test_cases/application/out/Reference.destructured.ir @@ -23,42 +23,42 @@ contract test_cases.application.contract.Reference: subroutine test_cases.application.contract.Reference.validate_asset(app: uint64) -> void: block@0: // L36 - let (maybe_value%0#0: bytes, maybe_value_did_exist%1#0: uint64) = ((app_params_get AppCreator) app#0) - (assert maybe_value_did_exist%1#0) // application exists + let (value%0#0: bytes, check%1#0: uint64) = ((app_params_get AppCreator) app#0) + (assert check%1#0) // application exists let tmp%2#0: bytes = (global CreatorAddress) - let tmp%3#0: uint64 = (== maybe_value%0#0 tmp%2#0) + let tmp%3#0: uint64 = (== value%0#0 tmp%2#0) (assert tmp%3#0) // expected creator - let (maybe_value%4#0: uint64, maybe_value_did_exist%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) - (assert maybe_value_did_exist%5#0) // application exists - let tmp%6#0: uint64 = (== maybe_value%4#0 1u) + let (value%4#0: uint64, check%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) + (assert check%5#0) // application exists + let tmp%6#0: uint64 = (== value%4#0 1u) (assert tmp%6#0) // expected global_num_uint - let (maybe_value%7#0: uint64, maybe_value_did_exist%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) - (assert maybe_value_did_exist%8#0) // application exists - let tmp%9#0: uint64 = (== maybe_value%7#0 2u) + let (value%7#0: uint64, check%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) + (assert check%8#0) // application exists + let tmp%9#0: uint64 = (== value%7#0 2u) (assert tmp%9#0) // expected global_num_byte_slice - let (maybe_value%10#0: uint64, maybe_value_did_exist%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) - (assert maybe_value_did_exist%11#0) // application exists - let tmp%12#0: uint64 = (== maybe_value%10#0 3u) + let (value%10#0: uint64, check%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) + (assert check%11#0) // application exists + let tmp%12#0: uint64 = (== value%10#0 3u) (assert tmp%12#0) // expected local_num_uint - let (maybe_value%13#0: uint64, maybe_value_did_exist%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) - (assert maybe_value_did_exist%14#0) // application exists - let tmp%15#0: uint64 = (== maybe_value%13#0 4u) + let (value%13#0: uint64, check%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) + (assert check%14#0) // application exists + let tmp%15#0: uint64 = (== value%13#0 4u) (assert tmp%15#0) // expected local_num_byte_slice - let (maybe_value%16#0: bytes, maybe_value_did_exist%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) - (assert maybe_value_did_exist%17#0) // application exists - let tmp%18#0: uint64 = (len maybe_value%16#0) + let (value%16#0: bytes, check%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) + (assert check%17#0) // application exists + let tmp%18#0: uint64 = (len value%16#0) (assert tmp%18#0) // expected approval_program - let (maybe_value%19#0: bytes, maybe_value_did_exist%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) - (assert maybe_value_did_exist%20#0) // application exists - let tmp%21#0: uint64 = (len maybe_value%19#0) + let (value%19#0: bytes, check%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) + (assert check%20#0) // application exists + let tmp%21#0: uint64 = (len value%19#0) (assert tmp%21#0) // expected clear_state_program let tmp%22#0: uint64 = (global CurrentApplicationID) let tmp%23#0: uint64 = (== app#0 tmp%22#0) (assert tmp%23#0) // expected current_application_id - let (maybe_value%24#0: bytes, maybe_value_did_exist%25#0: uint64) = ((app_params_get AppAddress) app#0) - (assert maybe_value_did_exist%25#0) // application exists + let (value%24#0: bytes, check%25#0: uint64) = ((app_params_get AppAddress) app#0) + (assert check%25#0) // application exists let tmp%26#0: bytes = (global CurrentApplicationAddress) - let tmp%27#0: uint64 = (== maybe_value%24#0 tmp%26#0) + let tmp%27#0: uint64 = (== value%24#0 tmp%26#0) (assert tmp%27#0) // expected current_application_address return diff --git a/test_cases/application/out/Reference.ssa.ir b/test_cases/application/out/Reference.ssa.ir index 6f43915f24..eb1e8acbe0 100644 --- a/test_cases/application/out/Reference.ssa.ir +++ b/test_cases/application/out/Reference.ssa.ir @@ -28,42 +28,42 @@ contract test_cases.application.contract.Reference: subroutine test_cases.application.contract.Reference.validate_asset(app: uint64) -> void: block@0: // L36 - let (maybe_value%0#0: bytes, maybe_value_did_exist%1#0: uint64) = ((app_params_get AppCreator) app#0) - (assert maybe_value_did_exist%1#0) // application exists + let (value%0#0: bytes, check%1#0: uint64) = ((app_params_get AppCreator) app#0) + (assert check%1#0) // application exists let tmp%2#0: bytes = (global CreatorAddress) - let tmp%3#0: uint64 = (== maybe_value%0#0 tmp%2#0) + let tmp%3#0: uint64 = (== value%0#0 tmp%2#0) (assert tmp%3#0) // expected creator - let (maybe_value%4#0: uint64, maybe_value_did_exist%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) - (assert maybe_value_did_exist%5#0) // application exists - let tmp%6#0: uint64 = (== maybe_value%4#0 1u) + let (value%4#0: uint64, check%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) + (assert check%5#0) // application exists + let tmp%6#0: uint64 = (== value%4#0 1u) (assert tmp%6#0) // expected global_num_uint - let (maybe_value%7#0: uint64, maybe_value_did_exist%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) - (assert maybe_value_did_exist%8#0) // application exists - let tmp%9#0: uint64 = (== maybe_value%7#0 2u) + let (value%7#0: uint64, check%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) + (assert check%8#0) // application exists + let tmp%9#0: uint64 = (== value%7#0 2u) (assert tmp%9#0) // expected global_num_byte_slice - let (maybe_value%10#0: uint64, maybe_value_did_exist%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) - (assert maybe_value_did_exist%11#0) // application exists - let tmp%12#0: uint64 = (== maybe_value%10#0 3u) + let (value%10#0: uint64, check%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) + (assert check%11#0) // application exists + let tmp%12#0: uint64 = (== value%10#0 3u) (assert tmp%12#0) // expected local_num_uint - let (maybe_value%13#0: uint64, maybe_value_did_exist%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) - (assert maybe_value_did_exist%14#0) // application exists - let tmp%15#0: uint64 = (== maybe_value%13#0 4u) + let (value%13#0: uint64, check%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) + (assert check%14#0) // application exists + let tmp%15#0: uint64 = (== value%13#0 4u) (assert tmp%15#0) // expected local_num_byte_slice - let (maybe_value%16#0: bytes, maybe_value_did_exist%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) - (assert maybe_value_did_exist%17#0) // application exists - let tmp%18#0: uint64 = (len maybe_value%16#0) + let (value%16#0: bytes, check%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) + (assert check%17#0) // application exists + let tmp%18#0: uint64 = (len value%16#0) (assert tmp%18#0) // expected approval_program - let (maybe_value%19#0: bytes, maybe_value_did_exist%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) - (assert maybe_value_did_exist%20#0) // application exists - let tmp%21#0: uint64 = (len maybe_value%19#0) + let (value%19#0: bytes, check%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) + (assert check%20#0) // application exists + let tmp%21#0: uint64 = (len value%19#0) (assert tmp%21#0) // expected clear_state_program let tmp%22#0: uint64 = (global CurrentApplicationID) let tmp%23#0: uint64 = (== app#0 tmp%22#0) (assert tmp%23#0) // expected current_application_id - let (maybe_value%24#0: bytes, maybe_value_did_exist%25#0: uint64) = ((app_params_get AppAddress) app#0) - (assert maybe_value_did_exist%25#0) // application exists + let (value%24#0: bytes, check%25#0: uint64) = ((app_params_get AppAddress) app#0) + (assert check%25#0) // application exists let tmp%26#0: bytes = (global CurrentApplicationAddress) - let tmp%27#0: uint64 = (== maybe_value%24#0 tmp%26#0) + let tmp%27#0: uint64 = (== value%24#0 tmp%26#0) (assert tmp%27#0) // expected current_application_address return diff --git a/test_cases/application/out/Reference.ssa.opt_pass_1.ir b/test_cases/application/out/Reference.ssa.opt_pass_1.ir index 14b83bdf56..6f16f1b85e 100644 --- a/test_cases/application/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/application/out/Reference.ssa.opt_pass_1.ir @@ -23,42 +23,42 @@ contract test_cases.application.contract.Reference: subroutine test_cases.application.contract.Reference.validate_asset(app: uint64) -> void: block@0: // L36 - let (maybe_value%0#0: bytes, maybe_value_did_exist%1#0: uint64) = ((app_params_get AppCreator) app#0) - (assert maybe_value_did_exist%1#0) // application exists + let (value%0#0: bytes, check%1#0: uint64) = ((app_params_get AppCreator) app#0) + (assert check%1#0) // application exists let tmp%2#0: bytes = (global CreatorAddress) - let tmp%3#0: uint64 = (== maybe_value%0#0 tmp%2#0) + let tmp%3#0: uint64 = (== value%0#0 tmp%2#0) (assert tmp%3#0) // expected creator - let (maybe_value%4#0: uint64, maybe_value_did_exist%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) - (assert maybe_value_did_exist%5#0) // application exists - let tmp%6#0: uint64 = (== maybe_value%4#0 1u) + let (value%4#0: uint64, check%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) + (assert check%5#0) // application exists + let tmp%6#0: uint64 = (== value%4#0 1u) (assert tmp%6#0) // expected global_num_uint - let (maybe_value%7#0: uint64, maybe_value_did_exist%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) - (assert maybe_value_did_exist%8#0) // application exists - let tmp%9#0: uint64 = (== maybe_value%7#0 2u) + let (value%7#0: uint64, check%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) + (assert check%8#0) // application exists + let tmp%9#0: uint64 = (== value%7#0 2u) (assert tmp%9#0) // expected global_num_byte_slice - let (maybe_value%10#0: uint64, maybe_value_did_exist%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) - (assert maybe_value_did_exist%11#0) // application exists - let tmp%12#0: uint64 = (== maybe_value%10#0 3u) + let (value%10#0: uint64, check%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) + (assert check%11#0) // application exists + let tmp%12#0: uint64 = (== value%10#0 3u) (assert tmp%12#0) // expected local_num_uint - let (maybe_value%13#0: uint64, maybe_value_did_exist%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) - (assert maybe_value_did_exist%14#0) // application exists - let tmp%15#0: uint64 = (== maybe_value%13#0 4u) + let (value%13#0: uint64, check%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) + (assert check%14#0) // application exists + let tmp%15#0: uint64 = (== value%13#0 4u) (assert tmp%15#0) // expected local_num_byte_slice - let (maybe_value%16#0: bytes, maybe_value_did_exist%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) - (assert maybe_value_did_exist%17#0) // application exists - let tmp%18#0: uint64 = (len maybe_value%16#0) + let (value%16#0: bytes, check%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) + (assert check%17#0) // application exists + let tmp%18#0: uint64 = (len value%16#0) (assert tmp%18#0) // expected approval_program - let (maybe_value%19#0: bytes, maybe_value_did_exist%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) - (assert maybe_value_did_exist%20#0) // application exists - let tmp%21#0: uint64 = (len maybe_value%19#0) + let (value%19#0: bytes, check%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) + (assert check%20#0) // application exists + let tmp%21#0: uint64 = (len value%19#0) (assert tmp%21#0) // expected clear_state_program let tmp%22#0: uint64 = (global CurrentApplicationID) let tmp%23#0: uint64 = (== app#0 tmp%22#0) (assert tmp%23#0) // expected current_application_id - let (maybe_value%24#0: bytes, maybe_value_did_exist%25#0: uint64) = ((app_params_get AppAddress) app#0) - (assert maybe_value_did_exist%25#0) // application exists + let (value%24#0: bytes, check%25#0: uint64) = ((app_params_get AppAddress) app#0) + (assert check%25#0) // application exists let tmp%26#0: bytes = (global CurrentApplicationAddress) - let tmp%27#0: uint64 = (== maybe_value%24#0 tmp%26#0) + let tmp%27#0: uint64 = (== value%24#0 tmp%26#0) (assert tmp%27#0) // expected current_application_address return diff --git a/test_cases/application/out_O2/Reference.destructured.ir b/test_cases/application/out_O2/Reference.destructured.ir index 14b83bdf56..6f16f1b85e 100644 --- a/test_cases/application/out_O2/Reference.destructured.ir +++ b/test_cases/application/out_O2/Reference.destructured.ir @@ -23,42 +23,42 @@ contract test_cases.application.contract.Reference: subroutine test_cases.application.contract.Reference.validate_asset(app: uint64) -> void: block@0: // L36 - let (maybe_value%0#0: bytes, maybe_value_did_exist%1#0: uint64) = ((app_params_get AppCreator) app#0) - (assert maybe_value_did_exist%1#0) // application exists + let (value%0#0: bytes, check%1#0: uint64) = ((app_params_get AppCreator) app#0) + (assert check%1#0) // application exists let tmp%2#0: bytes = (global CreatorAddress) - let tmp%3#0: uint64 = (== maybe_value%0#0 tmp%2#0) + let tmp%3#0: uint64 = (== value%0#0 tmp%2#0) (assert tmp%3#0) // expected creator - let (maybe_value%4#0: uint64, maybe_value_did_exist%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) - (assert maybe_value_did_exist%5#0) // application exists - let tmp%6#0: uint64 = (== maybe_value%4#0 1u) + let (value%4#0: uint64, check%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) + (assert check%5#0) // application exists + let tmp%6#0: uint64 = (== value%4#0 1u) (assert tmp%6#0) // expected global_num_uint - let (maybe_value%7#0: uint64, maybe_value_did_exist%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) - (assert maybe_value_did_exist%8#0) // application exists - let tmp%9#0: uint64 = (== maybe_value%7#0 2u) + let (value%7#0: uint64, check%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) + (assert check%8#0) // application exists + let tmp%9#0: uint64 = (== value%7#0 2u) (assert tmp%9#0) // expected global_num_byte_slice - let (maybe_value%10#0: uint64, maybe_value_did_exist%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) - (assert maybe_value_did_exist%11#0) // application exists - let tmp%12#0: uint64 = (== maybe_value%10#0 3u) + let (value%10#0: uint64, check%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) + (assert check%11#0) // application exists + let tmp%12#0: uint64 = (== value%10#0 3u) (assert tmp%12#0) // expected local_num_uint - let (maybe_value%13#0: uint64, maybe_value_did_exist%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) - (assert maybe_value_did_exist%14#0) // application exists - let tmp%15#0: uint64 = (== maybe_value%13#0 4u) + let (value%13#0: uint64, check%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) + (assert check%14#0) // application exists + let tmp%15#0: uint64 = (== value%13#0 4u) (assert tmp%15#0) // expected local_num_byte_slice - let (maybe_value%16#0: bytes, maybe_value_did_exist%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) - (assert maybe_value_did_exist%17#0) // application exists - let tmp%18#0: uint64 = (len maybe_value%16#0) + let (value%16#0: bytes, check%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) + (assert check%17#0) // application exists + let tmp%18#0: uint64 = (len value%16#0) (assert tmp%18#0) // expected approval_program - let (maybe_value%19#0: bytes, maybe_value_did_exist%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) - (assert maybe_value_did_exist%20#0) // application exists - let tmp%21#0: uint64 = (len maybe_value%19#0) + let (value%19#0: bytes, check%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) + (assert check%20#0) // application exists + let tmp%21#0: uint64 = (len value%19#0) (assert tmp%21#0) // expected clear_state_program let tmp%22#0: uint64 = (global CurrentApplicationID) let tmp%23#0: uint64 = (== app#0 tmp%22#0) (assert tmp%23#0) // expected current_application_id - let (maybe_value%24#0: bytes, maybe_value_did_exist%25#0: uint64) = ((app_params_get AppAddress) app#0) - (assert maybe_value_did_exist%25#0) // application exists + let (value%24#0: bytes, check%25#0: uint64) = ((app_params_get AppAddress) app#0) + (assert check%25#0) // application exists let tmp%26#0: bytes = (global CurrentApplicationAddress) - let tmp%27#0: uint64 = (== maybe_value%24#0 tmp%26#0) + let tmp%27#0: uint64 = (== value%24#0 tmp%26#0) (assert tmp%27#0) // expected current_application_address return diff --git a/test_cases/application/out_unoptimized/Reference.destructured.ir b/test_cases/application/out_unoptimized/Reference.destructured.ir index 6f43915f24..eb1e8acbe0 100644 --- a/test_cases/application/out_unoptimized/Reference.destructured.ir +++ b/test_cases/application/out_unoptimized/Reference.destructured.ir @@ -28,42 +28,42 @@ contract test_cases.application.contract.Reference: subroutine test_cases.application.contract.Reference.validate_asset(app: uint64) -> void: block@0: // L36 - let (maybe_value%0#0: bytes, maybe_value_did_exist%1#0: uint64) = ((app_params_get AppCreator) app#0) - (assert maybe_value_did_exist%1#0) // application exists + let (value%0#0: bytes, check%1#0: uint64) = ((app_params_get AppCreator) app#0) + (assert check%1#0) // application exists let tmp%2#0: bytes = (global CreatorAddress) - let tmp%3#0: uint64 = (== maybe_value%0#0 tmp%2#0) + let tmp%3#0: uint64 = (== value%0#0 tmp%2#0) (assert tmp%3#0) // expected creator - let (maybe_value%4#0: uint64, maybe_value_did_exist%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) - (assert maybe_value_did_exist%5#0) // application exists - let tmp%6#0: uint64 = (== maybe_value%4#0 1u) + let (value%4#0: uint64, check%5#0: uint64) = ((app_params_get AppGlobalNumUint) app#0) + (assert check%5#0) // application exists + let tmp%6#0: uint64 = (== value%4#0 1u) (assert tmp%6#0) // expected global_num_uint - let (maybe_value%7#0: uint64, maybe_value_did_exist%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) - (assert maybe_value_did_exist%8#0) // application exists - let tmp%9#0: uint64 = (== maybe_value%7#0 2u) + let (value%7#0: uint64, check%8#0: uint64) = ((app_params_get AppGlobalNumByteSlice) app#0) + (assert check%8#0) // application exists + let tmp%9#0: uint64 = (== value%7#0 2u) (assert tmp%9#0) // expected global_num_byte_slice - let (maybe_value%10#0: uint64, maybe_value_did_exist%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) - (assert maybe_value_did_exist%11#0) // application exists - let tmp%12#0: uint64 = (== maybe_value%10#0 3u) + let (value%10#0: uint64, check%11#0: uint64) = ((app_params_get AppLocalNumUint) app#0) + (assert check%11#0) // application exists + let tmp%12#0: uint64 = (== value%10#0 3u) (assert tmp%12#0) // expected local_num_uint - let (maybe_value%13#0: uint64, maybe_value_did_exist%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) - (assert maybe_value_did_exist%14#0) // application exists - let tmp%15#0: uint64 = (== maybe_value%13#0 4u) + let (value%13#0: uint64, check%14#0: uint64) = ((app_params_get AppLocalNumByteSlice) app#0) + (assert check%14#0) // application exists + let tmp%15#0: uint64 = (== value%13#0 4u) (assert tmp%15#0) // expected local_num_byte_slice - let (maybe_value%16#0: bytes, maybe_value_did_exist%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) - (assert maybe_value_did_exist%17#0) // application exists - let tmp%18#0: uint64 = (len maybe_value%16#0) + let (value%16#0: bytes, check%17#0: uint64) = ((app_params_get AppApprovalProgram) app#0) + (assert check%17#0) // application exists + let tmp%18#0: uint64 = (len value%16#0) (assert tmp%18#0) // expected approval_program - let (maybe_value%19#0: bytes, maybe_value_did_exist%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) - (assert maybe_value_did_exist%20#0) // application exists - let tmp%21#0: uint64 = (len maybe_value%19#0) + let (value%19#0: bytes, check%20#0: uint64) = ((app_params_get AppClearStateProgram) app#0) + (assert check%20#0) // application exists + let tmp%21#0: uint64 = (len value%19#0) (assert tmp%21#0) // expected clear_state_program let tmp%22#0: uint64 = (global CurrentApplicationID) let tmp%23#0: uint64 = (== app#0 tmp%22#0) (assert tmp%23#0) // expected current_application_id - let (maybe_value%24#0: bytes, maybe_value_did_exist%25#0: uint64) = ((app_params_get AppAddress) app#0) - (assert maybe_value_did_exist%25#0) // application exists + let (value%24#0: bytes, check%25#0: uint64) = ((app_params_get AppAddress) app#0) + (assert check%25#0) // application exists let tmp%26#0: bytes = (global CurrentApplicationAddress) - let tmp%27#0: uint64 = (== maybe_value%24#0 tmp%26#0) + let tmp%27#0: uint64 = (== value%24#0 tmp%26#0) (assert tmp%27#0) // expected current_application_address return diff --git a/test_cases/application/puya.log b/test_cases/application/puya.log index c09d2136d5..02fecc2c65 100644 --- a/test_cases/application/puya.log +++ b/test_cases/application/puya.log @@ -462,43 +462,43 @@ debug: Inserted validate_asset_block@0.ops[96]: 'store tmp%23#0 to l-stack (copy debug: Replaced validate_asset_block@0.ops[98]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' debug: Inserted validate_asset_block@0.ops[111]: 'store tmp%27#0 to l-stack (copy)' debug: Replaced validate_asset_block@0.ops[113]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[2]: 'store maybe_value_did_exist%1#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[5]: 'load maybe_value_did_exist%1#0' with 'load maybe_value_did_exist%1#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[2]: 'store check%1#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[5]: 'load check%1#0' with 'load check%1#0 from l-stack (no copy)' debug: Inserted validate_asset_block@0.ops[8]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced validate_asset_block@0.ops[11]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[19]: 'store maybe_value_did_exist%5#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[22]: 'load maybe_value_did_exist%5#0' with 'load maybe_value_did_exist%5#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[33]: 'store maybe_value_did_exist%8#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[36]: 'load maybe_value_did_exist%8#0' with 'load maybe_value_did_exist%8#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[47]: 'store maybe_value_did_exist%11#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[50]: 'load maybe_value_did_exist%11#0' with 'load maybe_value_did_exist%11#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[61]: 'store maybe_value_did_exist%14#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[64]: 'load maybe_value_did_exist%14#0' with 'load maybe_value_did_exist%14#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[75]: 'store maybe_value_did_exist%17#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[78]: 'load maybe_value_did_exist%17#0' with 'load maybe_value_did_exist%17#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[88]: 'store maybe_value_did_exist%20#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[91]: 'load maybe_value_did_exist%20#0' with 'load maybe_value_did_exist%20#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[19]: 'store check%5#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[22]: 'load check%5#0' with 'load check%5#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[33]: 'store check%8#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[36]: 'load check%8#0' with 'load check%8#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[47]: 'store check%11#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[50]: 'load check%11#0' with 'load check%11#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[61]: 'store check%14#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[64]: 'load check%14#0' with 'load check%14#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[75]: 'store check%17#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[78]: 'load check%17#0' with 'load check%17#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[88]: 'store check%20#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[91]: 'load check%20#0' with 'load check%20#0 from l-stack (no copy)' debug: Inserted validate_asset_block@0.ops[100]: 'store tmp%22#0 to l-stack (copy)' debug: Replaced validate_asset_block@0.ops[103]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[111]: 'store maybe_value_did_exist%25#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[114]: 'load maybe_value_did_exist%25#0' with 'load maybe_value_did_exist%25#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[111]: 'store check%25#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[114]: 'load check%25#0' with 'load check%25#0 from l-stack (no copy)' debug: Inserted validate_asset_block@0.ops[117]: 'store tmp%26#0 to l-stack (copy)' debug: Replaced validate_asset_block@0.ops[120]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[21]: 'store maybe_value%4#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[25]: 'load maybe_value%4#0' with 'load maybe_value%4#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[36]: 'store maybe_value%7#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[40]: 'load maybe_value%7#0' with 'load maybe_value%7#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[51]: 'store maybe_value%10#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[55]: 'load maybe_value%10#0' with 'load maybe_value%10#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[66]: 'store maybe_value%13#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[70]: 'load maybe_value%13#0' with 'load maybe_value%13#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[81]: 'store maybe_value%16#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[85]: 'load maybe_value%16#0' with 'load maybe_value%16#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[95]: 'store maybe_value%19#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[99]: 'load maybe_value%19#0' with 'load maybe_value%19#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[4]: 'store maybe_value%0#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[11]: 'load maybe_value%0#0' with 'load maybe_value%0#0 from l-stack (no copy)' -debug: Inserted validate_asset_block@0.ops[120]: 'store maybe_value%24#0 to l-stack (copy)' -debug: Replaced validate_asset_block@0.ops[127]: 'load maybe_value%24#0' with 'load maybe_value%24#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[21]: 'store value%4#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[25]: 'load value%4#0' with 'load value%4#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[36]: 'store value%7#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[40]: 'load value%7#0' with 'load value%7#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[51]: 'store value%10#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[55]: 'load value%10#0' with 'load value%10#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[66]: 'store value%13#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[70]: 'load value%13#0' with 'load value%13#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[81]: 'store value%16#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[85]: 'load value%16#0' with 'load value%16#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[95]: 'store value%19#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[99]: 'load value%19#0' with 'load value%19#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[4]: 'store value%0#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[11]: 'load value%0#0' with 'load value%0#0 from l-stack (no copy)' +debug: Inserted validate_asset_block@0.ops[120]: 'store value%24#0 to l-stack (copy)' +debug: Replaced validate_asset_block@0.ops[127]: 'load value%24#0' with 'load value%24#0 from l-stack (no copy)' info: Writing application/out/Reference.approval.teal info: Writing application/out/Reference.clear.teal \ No newline at end of file diff --git a/test_cases/arc4_types/out/Arc4RefTypesContract.approval.mir b/test_cases/arc4_types/out/Arc4RefTypesContract.approval.mir index c10ec70790..8b58c8abdb 100644 --- a/test_cases/arc4_types/out/Arc4RefTypesContract.approval.mir +++ b/test_cases/arc4_types/out/Arc4RefTypesContract.approval.mir @@ -11,12 +11,12 @@ main_block@0: cover 2 // store checked_address#0 to f-stack (𝕗) checked_address#0 | sender_address#0,checked_address#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 dup // load checked_address#0 from l-stack (copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,checked_address#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 len // (𝕗) checked_address#0 | sender_address#0,checked_address#0,{len} address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 - // virtual: store tmp%3#0 to l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%3#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 - int 32 // (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%3#0,32 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 - swap // load tmp%3#0 from l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,32,tmp%3#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%1#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 + int 32 // (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%1#0,32 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 + swap // load tmp%1#0 from l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,32,tmp%1#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 == // (𝕗) checked_address#0 | sender_address#0,checked_address#0,{==} address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 - // virtual: store tmp%4#0 to l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%4#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 - // virtual: load tmp%4#0 from l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%4#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%2#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕗) checked_address#0 | sender_address#0,checked_address#0,tmp%2#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 assert // Address length is 32 bytes // (𝕗) checked_address#0 | sender_address#0,checked_address#0 address from bytes, we check the length is 32 as we don't know the\n# source of the bytes\nchecke... arc4_types/reference_types.py:9-11 txn Sender // (𝕗) checked_address#0 | sender_address#0,checked_address#0,{txn} rformed as per all implementations of\n# from_bytes\nunchecked_address = arc4.Address.from_bytes(... arc4_types/reference_types.py:12-14 cover 2 // store unchecked_address#0 to f-stack (𝕗) checked_address#0,unchecked_address#0 | sender_address#0,checked_address#0 # When using from_bytes, no validation is performed as per all implementations of\n# from_bytes\n... arc4_types/reference_types.py:12-14 diff --git a/test_cases/arc4_types/out/Arc4RefTypesContract.destructured.ir b/test_cases/arc4_types/out/Arc4RefTypesContract.destructured.ir index 21a8b82898..c9e7e0738b 100644 --- a/test_cases/arc4_types/out/Arc4RefTypesContract.destructured.ir +++ b/test_cases/arc4_types/out/Arc4RefTypesContract.destructured.ir @@ -4,9 +4,9 @@ contract test_cases.arc4_types.reference_types.Arc4RefTypesContract: block@0: // L5 let sender_address#0: bytes = (txn Sender) let checked_address#0: bytes = (txn Sender) - let tmp%3#0: uint64 = (len checked_address#0) - let tmp%4#0: uint64 = (== 32u tmp%3#0) - (assert tmp%4#0) // Address length is 32 bytes + let tmp%1#0: uint64 = (len checked_address#0) + let tmp%2#0: uint64 = (== 32u tmp%1#0) + (assert tmp%2#0) // Address length is 32 bytes let unchecked_address#0: bytes = (txn Sender) let tmp%5#0: uint64 = (== sender_address#0 checked_address#0) goto tmp%5#0 ? block@1 : block@3 diff --git a/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.ir b/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.ir index e5cf2536b0..d54136bdc0 100644 --- a/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.ir +++ b/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.ir @@ -3,12 +3,12 @@ contract test_cases.arc4_types.reference_types.Arc4RefTypesContract: subroutine test_cases.arc4_types.reference_types.Arc4RefTypesContract.approval_program() -> uint64: block@0: // L5 let sender_address#0: bytes = (txn Sender) - let awst_tmp%2#0: bytes = (txn Sender) - let tmp%3#0: uint64 = (len awst_tmp%2#0) - let tmp%4#0: uint64 = (== 32u tmp%3#0) - let (maybe_value%0#0: bytes, maybe_value_did_exist%1#0: uint64) = (awst_tmp%2#0, tmp%4#0) - (assert maybe_value_did_exist%1#0) // Address length is 32 bytes - let checked_address#0: bytes = maybe_value%0#0 + let awst_tmp%0#0: bytes = (txn Sender) + let tmp%1#0: uint64 = (len awst_tmp%0#0) + let tmp%2#0: uint64 = (== 32u tmp%1#0) + let (value%3#0: bytes, check%4#0: uint64) = (awst_tmp%0#0, tmp%2#0) + (assert check%4#0) // Address length is 32 bytes + let checked_address#0: bytes = value%3#0 let unchecked_address#0: bytes = (txn Sender) let tmp%5#0: uint64 = (== sender_address#0 checked_address#0) goto tmp%5#0 ? block@1 : block@3 diff --git a/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.opt_pass_1.ir b/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.opt_pass_1.ir index ab410b0992..c979f9d494 100644 --- a/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.opt_pass_1.ir +++ b/test_cases/arc4_types/out/Arc4RefTypesContract.ssa.opt_pass_1.ir @@ -4,9 +4,9 @@ contract test_cases.arc4_types.reference_types.Arc4RefTypesContract: block@0: // L5 let sender_address#0: bytes = (txn Sender) let checked_address#0: bytes = (txn Sender) - let tmp%3#0: uint64 = (len checked_address#0) - let tmp%4#0: uint64 = (== 32u tmp%3#0) - (assert tmp%4#0) // Address length is 32 bytes + let tmp%1#0: uint64 = (len checked_address#0) + let tmp%2#0: uint64 = (== 32u tmp%1#0) + (assert tmp%2#0) // Address length is 32 bytes let unchecked_address#0: bytes = (txn Sender) let tmp%5#0: uint64 = (== sender_address#0 checked_address#0) goto tmp%5#0 ? block@1 : block@3 diff --git a/test_cases/arc4_types/out_O2/Arc4RefTypesContract.destructured.ir b/test_cases/arc4_types/out_O2/Arc4RefTypesContract.destructured.ir index 21a8b82898..c9e7e0738b 100644 --- a/test_cases/arc4_types/out_O2/Arc4RefTypesContract.destructured.ir +++ b/test_cases/arc4_types/out_O2/Arc4RefTypesContract.destructured.ir @@ -4,9 +4,9 @@ contract test_cases.arc4_types.reference_types.Arc4RefTypesContract: block@0: // L5 let sender_address#0: bytes = (txn Sender) let checked_address#0: bytes = (txn Sender) - let tmp%3#0: uint64 = (len checked_address#0) - let tmp%4#0: uint64 = (== 32u tmp%3#0) - (assert tmp%4#0) // Address length is 32 bytes + let tmp%1#0: uint64 = (len checked_address#0) + let tmp%2#0: uint64 = (== 32u tmp%1#0) + (assert tmp%2#0) // Address length is 32 bytes let unchecked_address#0: bytes = (txn Sender) let tmp%5#0: uint64 = (== sender_address#0 checked_address#0) goto tmp%5#0 ? block@1 : block@3 diff --git a/test_cases/arc4_types/out_unoptimized/Arc4RefTypesContract.destructured.ir b/test_cases/arc4_types/out_unoptimized/Arc4RefTypesContract.destructured.ir index 17d9767bfc..bc98d98ce7 100644 --- a/test_cases/arc4_types/out_unoptimized/Arc4RefTypesContract.destructured.ir +++ b/test_cases/arc4_types/out_unoptimized/Arc4RefTypesContract.destructured.ir @@ -3,13 +3,13 @@ contract test_cases.arc4_types.reference_types.Arc4RefTypesContract: subroutine test_cases.arc4_types.reference_types.Arc4RefTypesContract.approval_program() -> uint64: block@0: // L5 let sender_address#0: bytes = (txn Sender) - let awst_tmp%2#0: bytes = (txn Sender) - let tmp%3#0: uint64 = (len awst_tmp%2#0) - let tmp%4#0: uint64 = (== 32u tmp%3#0) - let maybe_value%0#0: bytes = awst_tmp%2#0 - let maybe_value_did_exist%1#0: uint64 = tmp%4#0 - (assert maybe_value_did_exist%1#0) // Address length is 32 bytes - let checked_address#0: bytes = maybe_value%0#0 + let awst_tmp%0#0: bytes = (txn Sender) + let tmp%1#0: uint64 = (len awst_tmp%0#0) + let tmp%2#0: uint64 = (== 32u tmp%1#0) + let value%3#0: bytes = awst_tmp%0#0 + let check%4#0: uint64 = tmp%2#0 + (assert check%4#0) // Address length is 32 bytes + let checked_address#0: bytes = value%3#0 let unchecked_address#0: bytes = (txn Sender) let tmp%5#0: uint64 = (== sender_address#0 checked_address#0) goto tmp%5#0 ? block@1 : block@3 diff --git a/test_cases/arc4_types/puya.log b/test_cases/arc4_types/puya.log index d767c3e409..d856056bab 100644 --- a/test_cases/arc4_types/puya.log +++ b/test_cases/arc4_types/puya.log @@ -6978,10 +6978,10 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: awst_tmp%2#0, maybe_value%0#0, checked_address#0 -debug: Replacing {awst_tmp%2#0, maybe_value%0#0} with checked_address#0 made 2 modifications -debug: Found equivalence set: tmp%4#0, maybe_value_did_exist%1#0 -debug: Replacing {maybe_value_did_exist%1#0} with tmp%4#0 made 1 modifications +debug: Found equivalence set: awst_tmp%0#0, value%3#0, checked_address#0 +debug: Replacing {awst_tmp%0#0, value%3#0} with checked_address#0 made 2 modifications +debug: Found equivalence set: tmp%2#0, check%4#0 +debug: Replacing {check%4#0} with tmp%2#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops @@ -7039,12 +7039,12 @@ debug: Performing post-SSA optimizations debug: Output IR to arc4_types/out/Arc4RefTypesContract.destructured.ir debug: Inserted main_block@0.ops[3]: 'store checked_address#0 to l-stack (copy)' debug: Replaced main_block@0.ops[5]: 'load checked_address#0' with 'load checked_address#0 from l-stack (no copy)' -debug: Inserted main_block@0.ops[11]: 'store tmp%4#0 to l-stack (copy)' -debug: Replaced main_block@0.ops[13]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' +debug: Inserted main_block@0.ops[11]: 'store tmp%2#0 to l-stack (copy)' +debug: Replaced main_block@0.ops[13]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' debug: Inserted main_block@0.ops[20]: 'store tmp%5#0 to l-stack (copy)' debug: Replaced main_block@0.ops[22]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' -debug: Inserted main_block@0.ops[7]: 'store tmp%3#0 to l-stack (copy)' -debug: Replaced main_block@0.ops[10]: 'load tmp%3#0' with 'load tmp%3#0 from l-stack (no copy)' +debug: Inserted main_block@0.ops[7]: 'store tmp%1#0 to l-stack (copy)' +debug: Replaced main_block@0.ops[10]: 'load tmp%1#0' with 'load tmp%1#0 from l-stack (no copy)' debug: Inserted main_block@0.ops[6]: 'store checked_address#0 to l-stack (copy)' debug: Replaced main_block@0.ops[20]: 'load checked_address#0' with 'load checked_address#0 from l-stack (no copy)' debug: Inserted main_block@0.ops[1]: 'store sender_address#0 to l-stack (copy)' diff --git a/test_cases/asset/out/Reference.approval.mir b/test_cases/asset/out/Reference.approval.mir index becd604e25..4d337c9c17 100644 --- a/test_cases/asset/out/Reference.approval.mir +++ b/test_cases/asset/out/Reference.approval.mir @@ -1,12 +1,12 @@ -// Op // Op Description Stack (out) X stack Source code Source line +// Op // Op Description Stack (out) X stack Source code Source line #pragma version 10 // test_cases.asset.contract.Reference.approval_program() -> uint64: main_block@0: - txn ApplicationID // {txn} - // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 - // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 + txn ApplicationID // {txn} + // virtual: store app_id%0#0 to l-stack (no copy) app_id%0#0 + // virtual: load app_id%0#0 from l-stack (no copy) app_id%0#0 bnz main_entrypoint@2 // // Implicit fall through to main_on_create@1 // @@ -15,282 +15,282 @@ main_on_create@1: // Implicit fall through to main_entrypoint@2 // main_entrypoint@2: - txn NumAppArgs // {txn} Txn.num_app_args asset/contract.py:21 - // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 Txn.num_app_args asset/contract.py:21 - // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 Txn.num_app_args == 1: asset/contract.py:21 - int 1 // tmp%1#0,1 1 asset/contract.py:21 - == // {==} Txn.num_app_args == 1: asset/contract.py:21 - // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Txn.num_app_args == 1: asset/contract.py:21 - // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 if Txn.num_app_args == 1: asset/contract.py:21 - bz main_after_if_else@10 // if Txn.num_app_args == 1: asset/contract.py:21 - // Implicit fall through to main_if_body@3 // if Txn.num_app_args == 1: asset/contract.py:21 + txn NumAppArgs // {txn} Txn.num_app_args asset/contract.py:21 + // virtual: store tmp%1#0 to l-stack (no copy) tmp%1#0 Txn.num_app_args asset/contract.py:21 + // virtual: load tmp%1#0 from l-stack (no copy) tmp%1#0 Txn.num_app_args == 1: asset/contract.py:21 + int 1 // tmp%1#0,1 1 asset/contract.py:21 + == // {==} Txn.num_app_args == 1: asset/contract.py:21 + // virtual: store tmp%2#0 to l-stack (no copy) tmp%2#0 Txn.num_app_args == 1: asset/contract.py:21 + // virtual: load tmp%2#0 from l-stack (no copy) tmp%2#0 if Txn.num_app_args == 1: asset/contract.py:21 + bz main_after_if_else@10 // if Txn.num_app_args == 1: asset/contract.py:21 + // Implicit fall through to main_if_body@3 // if Txn.num_app_args == 1: asset/contract.py:21 main_if_body@3: - txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:22 - // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 Txn.application_args(0) asset/contract.py:22 - // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 - byte "opt_in" // tmp%3#0,"opt_in" b"opt_in" asset/contract.py:22 - == // {==} Txn.application_args(0) == b"opt_in": asset/contract.py:22 - // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 - // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 if Txn.application_args(0) == b"opt_in": asset/contract.py:22 - bz main_else_body@5 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 - // Implicit fall through to main_if_body@4 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 + txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:22 + // virtual: store tmp%3#0 to l-stack (no copy) tmp%3#0 Txn.application_args(0) asset/contract.py:22 + // virtual: load tmp%3#0 from l-stack (no copy) tmp%3#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 + byte "opt_in" // tmp%3#0,"opt_in" b"opt_in" asset/contract.py:22 + == // {==} Txn.application_args(0) == b"opt_in": asset/contract.py:22 + // virtual: store tmp%4#0 to l-stack (no copy) tmp%4#0 Txn.application_args(0) == b"opt_in": asset/contract.py:22 + // virtual: load tmp%4#0 from l-stack (no copy) tmp%4#0 if Txn.application_args(0) == b"opt_in": asset/contract.py:22 + bz main_else_body@5 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 + // Implicit fall through to main_if_body@4 // if Txn.application_args(0) == b"opt_in": asset/contract.py:22 main_if_body@4: - txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:23 - // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:23 - // virtual: load asset#0 from l-stack (no copy) asset#0 self.opt_into_asset(asset) asset/contract.py:24 - callsub opt_into_asset // self.opt_into_asset(asset) asset/contract.py:24 + txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:23 + // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:23 + // virtual: load asset#0 from l-stack (no copy) asset#0 self.opt_into_asset(asset) asset/contract.py:24 + callsub opt_into_asset // self.opt_into_asset(asset) asset/contract.py:24 b main_after_if_else@10 // main_else_body@5: - txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:25 - // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 Txn.application_args(0) asset/contract.py:25 - // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - byte "is_opted_in" // tmp%5#0,"is_opted_in" b"is_opted_in" asset/contract.py:25 - == // {==} Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - assert // Expected opt_in or is_opted_in // elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 - txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:26 - // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:26 - // virtual: load asset#0 from l-stack (no copy) asset#0 self.is_opted_asset(asset) asset/contract.py:27 - callsub is_opted_asset // self.is_opted_asset(asset) asset/contract.py:27 + txna ApplicationArgs 0 // {txna} Txn.application_args(0) asset/contract.py:25 + // virtual: store tmp%5#0 to l-stack (no copy) tmp%5#0 Txn.application_args(0) asset/contract.py:25 + // virtual: load tmp%5#0 from l-stack (no copy) tmp%5#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + byte "is_opted_in" // tmp%5#0,"is_opted_in" b"is_opted_in" asset/contract.py:25 + == // {==} Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + // virtual: store tmp%6#0 to l-stack (no copy) tmp%6#0 Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + // virtual: load tmp%6#0 from l-stack (no copy) tmp%6#0 elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + assert // Expected opt_in or is_opted_in // elif Txn.application_args(0) == b"is_opted_in": asset/contract.py:25 + txna Assets 0 // {txna} Txn.assets(0) asset/contract.py:26 + // virtual: store asset#0 to l-stack (no copy) asset#0 asset = Asset(Txn.assets(0)) asset/contract.py:26 + // virtual: load asset#0 from l-stack (no copy) asset#0 self.is_opted_asset(asset) asset/contract.py:27 + callsub is_opted_asset // self.is_opted_asset(asset) asset/contract.py:27 // Implicit fall through to main_after_if_else@10 // main_after_if_else@10: - int 1 // 1 True asset/contract.py:30 - return // return True asset/contract.py:30 + int 1 // 1 True asset/contract.py:30 + return // return True asset/contract.py:30 // test_cases.asset.contract.Reference.opt_into_asset(asset: uint64) -> void: opt_into_asset: - proto 1 0 // (𝕡) asset#0 | @subroutine\ndef opt_into_asset(self, asset: Asset) -> None: asset/contract.py:35-36 + proto 1 0 // (𝕡) asset#0 | @subroutine\ndef opt_into_asset(self, asset: Asset) -> None: asset/contract.py:35-36 opt_into_asset_block@0: - txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 - // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 - global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 - assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 - int 0 // (𝕡) asset#0 | 0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - byte "asa" // (𝕡) asset#0 | 0,"asa" ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: store asa_exists%4#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: store asa_value%3#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: load asa_exists%4#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - assert // check asa exists // (𝕡) asset#0 | asa_value%3#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: load asa_value%3#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 - assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 - byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa asset/contract.py:41-42 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 - app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 - itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nITxnCreate.begin() asset/contract.py:44-45 - int axfer // (𝕡) asset#0 | axfer TransactionType.AssetTransfer asset/contract.py:46 - itxn_field TypeEnum // (𝕡) asset#0 | ITxnCreate.set_type_enum(TransactionType.AssetTransfer) asset/contract.py:46 - int 0 // (𝕡) asset#0 | 0 0 asset/contract.py:47 - itxn_field Fee // (𝕡) asset#0 | ITxnCreate.set_fee(UInt64(0)) asset/contract.py:47 - global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address asset/contract.py:48 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0 | tmp%6#0 Global.current_application_address asset/contract.py:48 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0 | tmp%6#0 ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 - itxn_field AssetReceiver // (𝕡) asset#0 | ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 - itxn_field XferAsset // (𝕡) asset#0 | ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 - itxn_submit // (𝕡) asset#0 | ITxnCreate.submit() asset/contract.py:50 + txn Sender // (𝕡) asset#0 | {txn} allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 + // virtual: store tmp%0#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender asset/contract.py:37-38 + global CreatorAddress // (𝕡) asset#0 | tmp%0#0,{global} tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 tor to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) asset#0 | tmp%1#0,tmp%0#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) asset#0 | tmp%0#0,tmp%1#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + == // (𝕡) asset#0 | {==} allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_address asset/contract.py:37-38 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 + assert // Only creator can opt in to ASA // (𝕡) asset#0 | # Only allow app creator to opt the app account into a ASA\nassert Txn.sender == Global.creator_a... asset/contract.py:37-38 + int 0 // (𝕡) asset#0 | 0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + byte "asa" // (𝕡) asset#0 | 0,"asa" ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: store asa_exists%4#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%4#0,{app_global_get_ex}.0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: store asa_value%3#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: load asa_exists%4#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0,asa_exists%4#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + assert // check asa exists // (𝕡) asset#0 | asa_value%3#0 ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: load asa_value%3#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%3#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + ! // (𝕡) asset#0 | {!} y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 y a ASA hasn't already been opted into\nassert not self.asa asset/contract.py:39-40 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 + assert // ASA already opted in // (𝕡) asset#0 | # Verify a ASA hasn't already been opted into\nassert not self.asa, "ASA already opted in" asset/contract.py:39-40 + byte "asa" // (𝕡) asset#0 | "asa" # Save ASA ID in global state\nself.asa asset/contract.py:41-42 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | "asa",asset#0 # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 + app_global_put // (𝕡) asset#0 | # Save ASA ID in global state\nself.asa = asset asset/contract.py:41-42 + itxn_begin // (𝕡) asset#0 | # Submit opt-in transaction: 0 asset transfer to self\nITxnCreate.begin() asset/contract.py:44-45 + int axfer // (𝕡) asset#0 | axfer TransactionType.AssetTransfer asset/contract.py:46 + itxn_field TypeEnum // (𝕡) asset#0 | ITxnCreate.set_type_enum(TransactionType.AssetTransfer) asset/contract.py:46 + int 0 // (𝕡) asset#0 | 0 0 asset/contract.py:47 + itxn_field Fee // (𝕡) asset#0 | ITxnCreate.set_fee(UInt64(0)) asset/contract.py:47 + global CurrentApplicationAddress // (𝕡) asset#0 | {global} Global.current_application_address asset/contract.py:48 + // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) asset#0 | tmp%6#0 Global.current_application_address asset/contract.py:48 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) asset#0 | tmp%6#0 ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 + itxn_field AssetReceiver // (𝕡) asset#0 | ITxnCreate.set_asset_receiver(Global.current_application_address) asset/contract.py:48 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 + itxn_field XferAsset // (𝕡) asset#0 | ITxnCreate.set_xfer_asset(asset.asset_id) asset/contract.py:49 + itxn_submit // (𝕡) asset#0 | ITxnCreate.submit() asset/contract.py:50 retsub // // test_cases.asset.contract.Reference.is_opted_asset(asset: uint64) -> void: is_opted_asset: - proto 1 0 // (𝕡) asset#0 | @subroutine\ndef is_opted_asset(self, asset: Asset) -> None: asset/contract.py:52-53 + proto 1 0 // (𝕡) asset#0 | @subroutine\ndef is_opted_asset(self, asset: Asset) -> None: asset/contract.py:52-53 is_opted_asset_block@0: - int 0 // (𝕡) asset#0 | 0 self.asa asset/contract.py:54 - byte "asa" // (𝕡) asset#0 | 0,"asa" self.asa asset/contract.py:54 - app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa asset/contract.py:54 - // virtual: store asa_exists%1#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%1#0,{app_global_get_ex}.0 self.asa asset/contract.py:54 - // virtual: store asa_value%0#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%0#0,asa_exists%1#0 self.asa asset/contract.py:54 - // virtual: load asa_exists%1#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%0#0,asa_exists%1#0 self.asa asset/contract.py:54 - assert // check asa exists // (𝕡) asset#0 | asa_value%0#0 self.asa asset/contract.py:54 - // virtual: load asa_value%0#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%0#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asa_value%0#0,asset#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - == // (𝕡) asset#0 | {==} self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - assert // asset self.asa == asset // (𝕡) asset#0 | assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.total asset/contract.py:55 - asset_params_get AssetTotal // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.total asset/contract.py:55 - // virtual: store maybe_value_did_exist%4#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%4#0,{asset_params_get}.0 asset.total asset/contract.py:55 - // virtual: store maybe_value%3#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0,maybe_value_did_exist%4#0 asset.total asset/contract.py:55 - // virtual: load maybe_value_did_exist%4#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0,maybe_value_did_exist%4#0 asset.total asset/contract.py:55 - assert // asset exists // (𝕡) asset#0 | maybe_value%3#0 asset.total asset/contract.py:55 - // virtual: load maybe_value%3#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%3#0 asset.total == 10000000, "total" asset/contract.py:55 - int 10000000 // (𝕡) asset#0 | maybe_value%3#0,10000000 10000000 asset/contract.py:55 - == // (𝕡) asset#0 | {==} asset.total == 10000000, "total" asset/contract.py:55 - // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 asset.total == 10000000, "total" asset/contract.py:55 - // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 assert asset.total == 10000000, "total" asset/contract.py:55 - assert // total // (𝕡) asset#0 | assert asset.total == 10000000, "total" asset/contract.py:55 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.decimals asset/contract.py:56 - asset_params_get AssetDecimals // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.decimals asset/contract.py:56 - // virtual: store maybe_value_did_exist%7#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%7#0,{asset_params_get}.0 asset.decimals asset/contract.py:56 - // virtual: store maybe_value%6#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0,maybe_value_did_exist%7#0 asset.decimals asset/contract.py:56 - // virtual: load maybe_value_did_exist%7#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0,maybe_value_did_exist%7#0 asset.decimals asset/contract.py:56 - assert // asset exists // (𝕡) asset#0 | maybe_value%6#0 asset.decimals asset/contract.py:56 - // virtual: load maybe_value%6#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%6#0 asset.decimals == 0, "decimals" asset/contract.py:56 - ! // (𝕡) asset#0 | {!} asset.decimals == 0, "decimals" asset/contract.py:56 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) asset#0 | tmp%8#0 asset.decimals == 0, "decimals" asset/contract.py:56 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) asset#0 | tmp%8#0 assert asset.decimals == 0, "decimals" asset/contract.py:56 - assert // decimals // (𝕡) asset#0 | assert asset.decimals == 0, "decimals" asset/contract.py:56 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.default_frozen asset/contract.py:57 - asset_params_get AssetDefaultFrozen // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.default_frozen asset/contract.py:57 - // virtual: store maybe_value_did_exist%10#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%10#0,{asset_params_get}.0 asset.default_frozen asset/contract.py:57 - // virtual: store maybe_value%9#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0,maybe_value_did_exist%10#0 asset.default_frozen asset/contract.py:57 - // virtual: load maybe_value_did_exist%10#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0,maybe_value_did_exist%10#0 asset.default_frozen asset/contract.py:57 - assert // asset exists // (𝕡) asset#0 | maybe_value%9#0 asset.default_frozen asset/contract.py:57 - // virtual: load maybe_value%9#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%9#0 not asset.default_frozen asset/contract.py:57 - ! // (𝕡) asset#0 | {!} not asset.default_frozen asset/contract.py:57 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) asset#0 | tmp%11#0 not asset.default_frozen asset/contract.py:57 - // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) asset#0 | tmp%11#0 assert not asset.default_frozen, "default frozen" asset/contract.py:57 - assert // default frozen // (𝕡) asset#0 | assert not asset.default_frozen, "default frozen" asset/contract.py:57 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.unit_name asset/contract.py:58 - asset_params_get AssetUnitName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.unit_name asset/contract.py:58 - // virtual: store maybe_value_did_exist%13#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%13#0,{asset_params_get}.0 asset.unit_name asset/contract.py:58 - // virtual: store maybe_value%12#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0,maybe_value_did_exist%13#0 asset.unit_name asset/contract.py:58 - // virtual: load maybe_value_did_exist%13#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0,maybe_value_did_exist%13#0 asset.unit_name asset/contract.py:58 - assert // asset exists // (𝕡) asset#0 | maybe_value%12#0 asset.unit_name asset/contract.py:58 - // virtual: load maybe_value%12#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%12#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 - byte "a" // (𝕡) asset#0 | maybe_value%12#0,"a" b"a" asset/contract.py:58 - == // (𝕡) asset#0 | {==} asset.unit_name == b"a", "unit_name" asset/contract.py:58 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) asset#0 | tmp%14#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) asset#0 | tmp%14#0 assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 - assert // unit_name // (𝕡) asset#0 | assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.name asset/contract.py:59 - asset_params_get AssetName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.name asset/contract.py:59 - // virtual: store maybe_value_did_exist%16#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%16#0,{asset_params_get}.0 asset.name asset/contract.py:59 - // virtual: store maybe_value%15#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0,maybe_value_did_exist%16#0 asset.name asset/contract.py:59 - // virtual: load maybe_value_did_exist%16#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0,maybe_value_did_exist%16#0 asset.name asset/contract.py:59 - assert // asset exists // (𝕡) asset#0 | maybe_value%15#0 asset.name asset/contract.py:59 - // virtual: load maybe_value%15#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%15#0 asset.name == b"asset a", "name" asset/contract.py:59 - byte "asset a" // (𝕡) asset#0 | maybe_value%15#0,"asset a" b"asset a" asset/contract.py:59 - == // (𝕡) asset#0 | {==} asset.name == b"asset a", "name" asset/contract.py:59 - // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) asset#0 | tmp%17#0 asset.name == b"asset a", "name" asset/contract.py:59 - // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) asset#0 | tmp%17#0 assert asset.name == b"asset a", "name" asset/contract.py:59 - assert // name // (𝕡) asset#0 | assert asset.name == b"asset a", "name" asset/contract.py:59 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.url asset/contract.py:60 - asset_params_get AssetURL // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.url asset/contract.py:60 - // virtual: store maybe_value_did_exist%19#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%19#0,{asset_params_get}.0 asset.url asset/contract.py:60 - // virtual: store maybe_value%18#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0,maybe_value_did_exist%19#0 asset.url asset/contract.py:60 - // virtual: load maybe_value_did_exist%19#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0,maybe_value_did_exist%19#0 asset.url asset/contract.py:60 - assert // asset exists // (𝕡) asset#0 | maybe_value%18#0 asset.url asset/contract.py:60 - // virtual: load maybe_value%18#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%18#0 asset.url == b"", "URL" asset/contract.py:60 - byte "" // (𝕡) asset#0 | maybe_value%18#0,"" b"" asset/contract.py:60 - == // (𝕡) asset#0 | {==} asset.url == b"", "URL" asset/contract.py:60 - // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) asset#0 | tmp%20#0 asset.url == b"", "URL" asset/contract.py:60 - // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) asset#0 | tmp%20#0 assert asset.url == b"", "URL" asset/contract.py:60 - assert // URL // (𝕡) asset#0 | assert asset.url == b"", "URL" asset/contract.py:60 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.metadata_hash asset/contract.py:61 - asset_params_get AssetMetadataHash // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.metadata_hash asset/contract.py:61 - // virtual: store maybe_value_did_exist%22#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%22#0,{asset_params_get}.0 asset.metadata_hash asset/contract.py:61 - // virtual: store maybe_value%21#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,maybe_value_did_exist%22#0 asset.metadata_hash asset/contract.py:61 - // virtual: load maybe_value_did_exist%22#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,maybe_value_did_exist%22#0 asset.metadata_hash asset/contract.py:61 - assert // asset exists // (𝕡) asset#0 | maybe_value%21#0 asset.metadata_hash asset/contract.py:61 - int 32 // (𝕡) asset#0 | maybe_value%21#0,32 32 asset/contract.py:61 - bzero // (𝕡) asset#0 | maybe_value%21#0,{bzero} bzero(32) asset/contract.py:61 - // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,tmp%23#0 bzero(32) asset/contract.py:61 - // virtual: load maybe_value%21#0 from l-stack (no copy) (𝕡) asset#0 | tmp%23#0,maybe_value%21#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%21#0,tmp%23#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - == // (𝕡) asset#0 | {==} asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) asset#0 | tmp%24#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) asset#0 | tmp%24#0 assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - assert // hash // (𝕡) asset#0 | assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.manager asset/contract.py:62 - asset_params_get AssetManager // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.manager asset/contract.py:62 - // virtual: store maybe_value_did_exist%26#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%26#0,{asset_params_get}.0 asset.manager asset/contract.py:62 - // virtual: store maybe_value%25#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,maybe_value_did_exist%26#0 asset.manager asset/contract.py:62 - // virtual: load maybe_value_did_exist%26#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,maybe_value_did_exist%26#0 asset.manager asset/contract.py:62 - assert // asset exists // (𝕡) asset#0 | maybe_value%25#0 asset.manager asset/contract.py:62 - global ZeroAddress // (𝕡) asset#0 | maybe_value%25#0,{global} Global.zero_address asset/contract.py:62 - // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,tmp%27#0 Global.zero_address asset/contract.py:62 - // virtual: load maybe_value%25#0 from l-stack (no copy) (𝕡) asset#0 | tmp%27#0,maybe_value%25#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 - // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%25#0,tmp%27#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 - == // (𝕡) asset#0 | {==} asset.manager == Global.zero_address, "manager" asset/contract.py:62 - // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) asset#0 | tmp%28#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 - // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) asset#0 | tmp%28#0 assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 - assert // manager // (𝕡) asset#0 | assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.reserve asset/contract.py:63 - asset_params_get AssetReserve // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.reserve asset/contract.py:63 - // virtual: store maybe_value_did_exist%30#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%30#0,{asset_params_get}.0 asset.reserve asset/contract.py:63 - // virtual: store maybe_value%29#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,maybe_value_did_exist%30#0 asset.reserve asset/contract.py:63 - // virtual: load maybe_value_did_exist%30#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,maybe_value_did_exist%30#0 asset.reserve asset/contract.py:63 - assert // asset exists // (𝕡) asset#0 | maybe_value%29#0 asset.reserve asset/contract.py:63 - global ZeroAddress // (𝕡) asset#0 | maybe_value%29#0,{global} Global.zero_address asset/contract.py:63 - // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,tmp%31#0 Global.zero_address asset/contract.py:63 - // virtual: load maybe_value%29#0 from l-stack (no copy) (𝕡) asset#0 | tmp%31#0,maybe_value%29#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%29#0,tmp%31#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - == // (𝕡) asset#0 | {==} asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) asset#0 | tmp%32#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) asset#0 | tmp%32#0 assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - assert // reserve // (𝕡) asset#0 | assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.freeze asset/contract.py:64 - asset_params_get AssetFreeze // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.freeze asset/contract.py:64 - // virtual: store maybe_value_did_exist%34#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%34#0,{asset_params_get}.0 asset.freeze asset/contract.py:64 - // virtual: store maybe_value%33#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,maybe_value_did_exist%34#0 asset.freeze asset/contract.py:64 - // virtual: load maybe_value_did_exist%34#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,maybe_value_did_exist%34#0 asset.freeze asset/contract.py:64 - assert // asset exists // (𝕡) asset#0 | maybe_value%33#0 asset.freeze asset/contract.py:64 - global ZeroAddress // (𝕡) asset#0 | maybe_value%33#0,{global} Global.zero_address asset/contract.py:64 - // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,tmp%35#0 Global.zero_address asset/contract.py:64 - // virtual: load maybe_value%33#0 from l-stack (no copy) (𝕡) asset#0 | tmp%35#0,maybe_value%33#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%33#0,tmp%35#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - == // (𝕡) asset#0 | {==} asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - // virtual: store tmp%36#0 to l-stack (no copy) (𝕡) asset#0 | tmp%36#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - // virtual: load tmp%36#0 from l-stack (no copy) (𝕡) asset#0 | tmp%36#0 assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - assert // freeze // (𝕡) asset#0 | assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.clawback asset/contract.py:65 - asset_params_get AssetClawback // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.clawback asset/contract.py:65 - // virtual: store maybe_value_did_exist%38#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%38#0,{asset_params_get}.0 asset.clawback asset/contract.py:65 - // virtual: store maybe_value%37#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,maybe_value_did_exist%38#0 asset.clawback asset/contract.py:65 - // virtual: load maybe_value_did_exist%38#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,maybe_value_did_exist%38#0 asset.clawback asset/contract.py:65 - assert // asset exists // (𝕡) asset#0 | maybe_value%37#0 asset.clawback asset/contract.py:65 - global ZeroAddress // (𝕡) asset#0 | maybe_value%37#0,{global} Global.zero_address asset/contract.py:65 - // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,tmp%39#0 Global.zero_address asset/contract.py:65 - // virtual: load maybe_value%37#0 from l-stack (no copy) (𝕡) asset#0 | tmp%39#0,maybe_value%37#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%37#0,tmp%39#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - == // (𝕡) asset#0 | {==} asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - // virtual: store tmp%40#0 to l-stack (no copy) (𝕡) asset#0 | tmp%40#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - // virtual: load tmp%40#0 from l-stack (no copy) (𝕡) asset#0 | tmp%40#0 assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - assert // clawback // (𝕡) asset#0 | assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 - frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.creator asset/contract.py:66 - asset_params_get AssetCreator // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.creator asset/contract.py:66 - // virtual: store maybe_value_did_exist%42#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value_did_exist%42#0,{asset_params_get}.0 asset.creator asset/contract.py:66 - // virtual: store maybe_value%41#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,maybe_value_did_exist%42#0 asset.creator asset/contract.py:66 - // virtual: load maybe_value_did_exist%42#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,maybe_value_did_exist%42#0 asset.creator asset/contract.py:66 - assert // asset exists // (𝕡) asset#0 | maybe_value%41#0 asset.creator asset/contract.py:66 - global CreatorAddress // (𝕡) asset#0 | maybe_value%41#0,{global} Global.creator_address asset/contract.py:66 - // virtual: store tmp%43#0 to l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,tmp%43#0 Global.creator_address asset/contract.py:66 - // virtual: load maybe_value%41#0 from l-stack (no copy) (𝕡) asset#0 | tmp%43#0,maybe_value%41#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 - // virtual: load tmp%43#0 from l-stack (no copy) (𝕡) asset#0 | maybe_value%41#0,tmp%43#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 - == // (𝕡) asset#0 | {==} asset.creator == Global.creator_address, "creator" asset/contract.py:66 - // virtual: store tmp%44#0 to l-stack (no copy) (𝕡) asset#0 | tmp%44#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 - // virtual: load tmp%44#0 from l-stack (no copy) (𝕡) asset#0 | tmp%44#0 assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 - assert // creator // (𝕡) asset#0 | assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 + int 0 // (𝕡) asset#0 | 0 self.asa asset/contract.py:54 + byte "asa" // (𝕡) asset#0 | 0,"asa" self.asa asset/contract.py:54 + app_global_get_ex // (𝕡) asset#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.asa asset/contract.py:54 + // virtual: store asa_exists%1#0 to l-stack (no copy) (𝕡) asset#0 | asa_exists%1#0,{app_global_get_ex}.0 self.asa asset/contract.py:54 + // virtual: store asa_value%0#0 to l-stack (no copy) (𝕡) asset#0 | asa_value%0#0,asa_exists%1#0 self.asa asset/contract.py:54 + // virtual: load asa_exists%1#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%0#0,asa_exists%1#0 self.asa asset/contract.py:54 + assert // check asa exists // (𝕡) asset#0 | asa_value%0#0 self.asa asset/contract.py:54 + // virtual: load asa_value%0#0 from l-stack (no copy) (𝕡) asset#0 | asa_value%0#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asa_value%0#0,asset#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + == // (𝕡) asset#0 | {==} self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + // virtual: store tmp%2#0 to l-stack (no copy) (𝕡) asset#0 | tmp%2#0 self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + // virtual: load tmp%2#0 from l-stack (no copy) (𝕡) asset#0 | tmp%2#0 assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + assert // asset self.asa == asset // (𝕡) asset#0 | assert self.asa == asset, "asset self.asa == asset" asset/contract.py:54 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.total asset/contract.py:55 + asset_params_get AssetTotal // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.total asset/contract.py:55 + // virtual: store check%4#0 to l-stack (no copy) (𝕡) asset#0 | check%4#0,{asset_params_get}.0 asset.total asset/contract.py:55 + // virtual: store value%3#0 to l-stack (no copy) (𝕡) asset#0 | value%3#0,check%4#0 asset.total asset/contract.py:55 + // virtual: load check%4#0 from l-stack (no copy) (𝕡) asset#0 | value%3#0,check%4#0 asset.total asset/contract.py:55 + assert // asset exists // (𝕡) asset#0 | value%3#0 asset.total asset/contract.py:55 + // virtual: load value%3#0 from l-stack (no copy) (𝕡) asset#0 | value%3#0 asset.total == 10000000, "total" asset/contract.py:55 + int 10000000 // (𝕡) asset#0 | value%3#0,10000000 10000000 asset/contract.py:55 + == // (𝕡) asset#0 | {==} asset.total == 10000000, "total" asset/contract.py:55 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) asset#0 | tmp%5#0 asset.total == 10000000, "total" asset/contract.py:55 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) asset#0 | tmp%5#0 assert asset.total == 10000000, "total" asset/contract.py:55 + assert // total // (𝕡) asset#0 | assert asset.total == 10000000, "total" asset/contract.py:55 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.decimals asset/contract.py:56 + asset_params_get AssetDecimals // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.decimals asset/contract.py:56 + // virtual: store check%7#0 to l-stack (no copy) (𝕡) asset#0 | check%7#0,{asset_params_get}.0 asset.decimals asset/contract.py:56 + // virtual: store value%6#0 to l-stack (no copy) (𝕡) asset#0 | value%6#0,check%7#0 asset.decimals asset/contract.py:56 + // virtual: load check%7#0 from l-stack (no copy) (𝕡) asset#0 | value%6#0,check%7#0 asset.decimals asset/contract.py:56 + assert // asset exists // (𝕡) asset#0 | value%6#0 asset.decimals asset/contract.py:56 + // virtual: load value%6#0 from l-stack (no copy) (𝕡) asset#0 | value%6#0 asset.decimals == 0, "decimals" asset/contract.py:56 + ! // (𝕡) asset#0 | {!} asset.decimals == 0, "decimals" asset/contract.py:56 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) asset#0 | tmp%8#0 asset.decimals == 0, "decimals" asset/contract.py:56 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) asset#0 | tmp%8#0 assert asset.decimals == 0, "decimals" asset/contract.py:56 + assert // decimals // (𝕡) asset#0 | assert asset.decimals == 0, "decimals" asset/contract.py:56 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.default_frozen asset/contract.py:57 + asset_params_get AssetDefaultFrozen // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.default_frozen asset/contract.py:57 + // virtual: store check%10#0 to l-stack (no copy) (𝕡) asset#0 | check%10#0,{asset_params_get}.0 asset.default_frozen asset/contract.py:57 + // virtual: store value%9#0 to l-stack (no copy) (𝕡) asset#0 | value%9#0,check%10#0 asset.default_frozen asset/contract.py:57 + // virtual: load check%10#0 from l-stack (no copy) (𝕡) asset#0 | value%9#0,check%10#0 asset.default_frozen asset/contract.py:57 + assert // asset exists // (𝕡) asset#0 | value%9#0 asset.default_frozen asset/contract.py:57 + // virtual: load value%9#0 from l-stack (no copy) (𝕡) asset#0 | value%9#0 not asset.default_frozen asset/contract.py:57 + ! // (𝕡) asset#0 | {!} not asset.default_frozen asset/contract.py:57 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) asset#0 | tmp%11#0 not asset.default_frozen asset/contract.py:57 + // virtual: load tmp%11#0 from l-stack (no copy) (𝕡) asset#0 | tmp%11#0 assert not asset.default_frozen, "default frozen" asset/contract.py:57 + assert // default frozen // (𝕡) asset#0 | assert not asset.default_frozen, "default frozen" asset/contract.py:57 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.unit_name asset/contract.py:58 + asset_params_get AssetUnitName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.unit_name asset/contract.py:58 + // virtual: store check%13#0 to l-stack (no copy) (𝕡) asset#0 | check%13#0,{asset_params_get}.0 asset.unit_name asset/contract.py:58 + // virtual: store value%12#0 to l-stack (no copy) (𝕡) asset#0 | value%12#0,check%13#0 asset.unit_name asset/contract.py:58 + // virtual: load check%13#0 from l-stack (no copy) (𝕡) asset#0 | value%12#0,check%13#0 asset.unit_name asset/contract.py:58 + assert // asset exists // (𝕡) asset#0 | value%12#0 asset.unit_name asset/contract.py:58 + // virtual: load value%12#0 from l-stack (no copy) (𝕡) asset#0 | value%12#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 + byte "a" // (𝕡) asset#0 | value%12#0,"a" b"a" asset/contract.py:58 + == // (𝕡) asset#0 | {==} asset.unit_name == b"a", "unit_name" asset/contract.py:58 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) asset#0 | tmp%14#0 asset.unit_name == b"a", "unit_name" asset/contract.py:58 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) asset#0 | tmp%14#0 assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 + assert // unit_name // (𝕡) asset#0 | assert asset.unit_name == b"a", "unit_name" asset/contract.py:58 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.name asset/contract.py:59 + asset_params_get AssetName // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.name asset/contract.py:59 + // virtual: store check%16#0 to l-stack (no copy) (𝕡) asset#0 | check%16#0,{asset_params_get}.0 asset.name asset/contract.py:59 + // virtual: store value%15#0 to l-stack (no copy) (𝕡) asset#0 | value%15#0,check%16#0 asset.name asset/contract.py:59 + // virtual: load check%16#0 from l-stack (no copy) (𝕡) asset#0 | value%15#0,check%16#0 asset.name asset/contract.py:59 + assert // asset exists // (𝕡) asset#0 | value%15#0 asset.name asset/contract.py:59 + // virtual: load value%15#0 from l-stack (no copy) (𝕡) asset#0 | value%15#0 asset.name == b"asset a", "name" asset/contract.py:59 + byte "asset a" // (𝕡) asset#0 | value%15#0,"asset a" b"asset a" asset/contract.py:59 + == // (𝕡) asset#0 | {==} asset.name == b"asset a", "name" asset/contract.py:59 + // virtual: store tmp%17#0 to l-stack (no copy) (𝕡) asset#0 | tmp%17#0 asset.name == b"asset a", "name" asset/contract.py:59 + // virtual: load tmp%17#0 from l-stack (no copy) (𝕡) asset#0 | tmp%17#0 assert asset.name == b"asset a", "name" asset/contract.py:59 + assert // name // (𝕡) asset#0 | assert asset.name == b"asset a", "name" asset/contract.py:59 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.url asset/contract.py:60 + asset_params_get AssetURL // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.url asset/contract.py:60 + // virtual: store check%19#0 to l-stack (no copy) (𝕡) asset#0 | check%19#0,{asset_params_get}.0 asset.url asset/contract.py:60 + // virtual: store value%18#0 to l-stack (no copy) (𝕡) asset#0 | value%18#0,check%19#0 asset.url asset/contract.py:60 + // virtual: load check%19#0 from l-stack (no copy) (𝕡) asset#0 | value%18#0,check%19#0 asset.url asset/contract.py:60 + assert // asset exists // (𝕡) asset#0 | value%18#0 asset.url asset/contract.py:60 + // virtual: load value%18#0 from l-stack (no copy) (𝕡) asset#0 | value%18#0 asset.url == b"", "URL" asset/contract.py:60 + byte "" // (𝕡) asset#0 | value%18#0,"" b"" asset/contract.py:60 + == // (𝕡) asset#0 | {==} asset.url == b"", "URL" asset/contract.py:60 + // virtual: store tmp%20#0 to l-stack (no copy) (𝕡) asset#0 | tmp%20#0 asset.url == b"", "URL" asset/contract.py:60 + // virtual: load tmp%20#0 from l-stack (no copy) (𝕡) asset#0 | tmp%20#0 assert asset.url == b"", "URL" asset/contract.py:60 + assert // URL // (𝕡) asset#0 | assert asset.url == b"", "URL" asset/contract.py:60 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.metadata_hash asset/contract.py:61 + asset_params_get AssetMetadataHash // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.metadata_hash asset/contract.py:61 + // virtual: store check%22#0 to l-stack (no copy) (𝕡) asset#0 | check%22#0,{asset_params_get}.0 asset.metadata_hash asset/contract.py:61 + // virtual: store value%21#0 to l-stack (no copy) (𝕡) asset#0 | value%21#0,check%22#0 asset.metadata_hash asset/contract.py:61 + // virtual: load check%22#0 from l-stack (no copy) (𝕡) asset#0 | value%21#0,check%22#0 asset.metadata_hash asset/contract.py:61 + assert // asset exists // (𝕡) asset#0 | value%21#0 asset.metadata_hash asset/contract.py:61 + int 32 // (𝕡) asset#0 | value%21#0,32 32 asset/contract.py:61 + bzero // (𝕡) asset#0 | value%21#0,{bzero} bzero(32) asset/contract.py:61 + // virtual: store tmp%23#0 to l-stack (no copy) (𝕡) asset#0 | value%21#0,tmp%23#0 bzero(32) asset/contract.py:61 + // virtual: load value%21#0 from l-stack (no copy) (𝕡) asset#0 | tmp%23#0,value%21#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + // virtual: load tmp%23#0 from l-stack (no copy) (𝕡) asset#0 | value%21#0,tmp%23#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + == // (𝕡) asset#0 | {==} asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + // virtual: store tmp%24#0 to l-stack (no copy) (𝕡) asset#0 | tmp%24#0 asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) asset#0 | tmp%24#0 assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + assert // hash // (𝕡) asset#0 | assert asset.metadata_hash == bzero(32), "hash" asset/contract.py:61 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.manager asset/contract.py:62 + asset_params_get AssetManager // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.manager asset/contract.py:62 + // virtual: store check%26#0 to l-stack (no copy) (𝕡) asset#0 | check%26#0,{asset_params_get}.0 asset.manager asset/contract.py:62 + // virtual: store value%25#0 to l-stack (no copy) (𝕡) asset#0 | value%25#0,check%26#0 asset.manager asset/contract.py:62 + // virtual: load check%26#0 from l-stack (no copy) (𝕡) asset#0 | value%25#0,check%26#0 asset.manager asset/contract.py:62 + assert // asset exists // (𝕡) asset#0 | value%25#0 asset.manager asset/contract.py:62 + global ZeroAddress // (𝕡) asset#0 | value%25#0,{global} Global.zero_address asset/contract.py:62 + // virtual: store tmp%27#0 to l-stack (no copy) (𝕡) asset#0 | value%25#0,tmp%27#0 Global.zero_address asset/contract.py:62 + // virtual: load value%25#0 from l-stack (no copy) (𝕡) asset#0 | tmp%27#0,value%25#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 + // virtual: load tmp%27#0 from l-stack (no copy) (𝕡) asset#0 | value%25#0,tmp%27#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 + == // (𝕡) asset#0 | {==} asset.manager == Global.zero_address, "manager" asset/contract.py:62 + // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) asset#0 | tmp%28#0 asset.manager == Global.zero_address, "manager" asset/contract.py:62 + // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) asset#0 | tmp%28#0 assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 + assert // manager // (𝕡) asset#0 | assert asset.manager == Global.zero_address, "manager" asset/contract.py:62 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.reserve asset/contract.py:63 + asset_params_get AssetReserve // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.reserve asset/contract.py:63 + // virtual: store check%30#0 to l-stack (no copy) (𝕡) asset#0 | check%30#0,{asset_params_get}.0 asset.reserve asset/contract.py:63 + // virtual: store value%29#0 to l-stack (no copy) (𝕡) asset#0 | value%29#0,check%30#0 asset.reserve asset/contract.py:63 + // virtual: load check%30#0 from l-stack (no copy) (𝕡) asset#0 | value%29#0,check%30#0 asset.reserve asset/contract.py:63 + assert // asset exists // (𝕡) asset#0 | value%29#0 asset.reserve asset/contract.py:63 + global ZeroAddress // (𝕡) asset#0 | value%29#0,{global} Global.zero_address asset/contract.py:63 + // virtual: store tmp%31#0 to l-stack (no copy) (𝕡) asset#0 | value%29#0,tmp%31#0 Global.zero_address asset/contract.py:63 + // virtual: load value%29#0 from l-stack (no copy) (𝕡) asset#0 | tmp%31#0,value%29#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + // virtual: load tmp%31#0 from l-stack (no copy) (𝕡) asset#0 | value%29#0,tmp%31#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + == // (𝕡) asset#0 | {==} asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + // virtual: store tmp%32#0 to l-stack (no copy) (𝕡) asset#0 | tmp%32#0 asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + // virtual: load tmp%32#0 from l-stack (no copy) (𝕡) asset#0 | tmp%32#0 assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + assert // reserve // (𝕡) asset#0 | assert asset.reserve == Global.zero_address, "reserve" asset/contract.py:63 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.freeze asset/contract.py:64 + asset_params_get AssetFreeze // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.freeze asset/contract.py:64 + // virtual: store check%34#0 to l-stack (no copy) (𝕡) asset#0 | check%34#0,{asset_params_get}.0 asset.freeze asset/contract.py:64 + // virtual: store value%33#0 to l-stack (no copy) (𝕡) asset#0 | value%33#0,check%34#0 asset.freeze asset/contract.py:64 + // virtual: load check%34#0 from l-stack (no copy) (𝕡) asset#0 | value%33#0,check%34#0 asset.freeze asset/contract.py:64 + assert // asset exists // (𝕡) asset#0 | value%33#0 asset.freeze asset/contract.py:64 + global ZeroAddress // (𝕡) asset#0 | value%33#0,{global} Global.zero_address asset/contract.py:64 + // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) asset#0 | value%33#0,tmp%35#0 Global.zero_address asset/contract.py:64 + // virtual: load value%33#0 from l-stack (no copy) (𝕡) asset#0 | tmp%35#0,value%33#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) asset#0 | value%33#0,tmp%35#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + == // (𝕡) asset#0 | {==} asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + // virtual: store tmp%36#0 to l-stack (no copy) (𝕡) asset#0 | tmp%36#0 asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + // virtual: load tmp%36#0 from l-stack (no copy) (𝕡) asset#0 | tmp%36#0 assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + assert // freeze // (𝕡) asset#0 | assert asset.freeze == Global.zero_address, "freeze" asset/contract.py:64 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.clawback asset/contract.py:65 + asset_params_get AssetClawback // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.clawback asset/contract.py:65 + // virtual: store check%38#0 to l-stack (no copy) (𝕡) asset#0 | check%38#0,{asset_params_get}.0 asset.clawback asset/contract.py:65 + // virtual: store value%37#0 to l-stack (no copy) (𝕡) asset#0 | value%37#0,check%38#0 asset.clawback asset/contract.py:65 + // virtual: load check%38#0 from l-stack (no copy) (𝕡) asset#0 | value%37#0,check%38#0 asset.clawback asset/contract.py:65 + assert // asset exists // (𝕡) asset#0 | value%37#0 asset.clawback asset/contract.py:65 + global ZeroAddress // (𝕡) asset#0 | value%37#0,{global} Global.zero_address asset/contract.py:65 + // virtual: store tmp%39#0 to l-stack (no copy) (𝕡) asset#0 | value%37#0,tmp%39#0 Global.zero_address asset/contract.py:65 + // virtual: load value%37#0 from l-stack (no copy) (𝕡) asset#0 | tmp%39#0,value%37#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + // virtual: load tmp%39#0 from l-stack (no copy) (𝕡) asset#0 | value%37#0,tmp%39#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + == // (𝕡) asset#0 | {==} asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + // virtual: store tmp%40#0 to l-stack (no copy) (𝕡) asset#0 | tmp%40#0 asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + // virtual: load tmp%40#0 from l-stack (no copy) (𝕡) asset#0 | tmp%40#0 assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + assert // clawback // (𝕡) asset#0 | assert asset.clawback == Global.zero_address, "clawback" asset/contract.py:65 + frame_dig -1 // load asset#0 from parameters (𝕡) asset#0 | asset#0 asset.creator asset/contract.py:66 + asset_params_get AssetCreator // (𝕡) asset#0 | {asset_params_get}.0,{asset_params_get}.1 asset.creator asset/contract.py:66 + // virtual: store check%42#0 to l-stack (no copy) (𝕡) asset#0 | check%42#0,{asset_params_get}.0 asset.creator asset/contract.py:66 + // virtual: store value%41#0 to l-stack (no copy) (𝕡) asset#0 | value%41#0,check%42#0 asset.creator asset/contract.py:66 + // virtual: load check%42#0 from l-stack (no copy) (𝕡) asset#0 | value%41#0,check%42#0 asset.creator asset/contract.py:66 + assert // asset exists // (𝕡) asset#0 | value%41#0 asset.creator asset/contract.py:66 + global CreatorAddress // (𝕡) asset#0 | value%41#0,{global} Global.creator_address asset/contract.py:66 + // virtual: store tmp%43#0 to l-stack (no copy) (𝕡) asset#0 | value%41#0,tmp%43#0 Global.creator_address asset/contract.py:66 + // virtual: load value%41#0 from l-stack (no copy) (𝕡) asset#0 | tmp%43#0,value%41#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 + // virtual: load tmp%43#0 from l-stack (no copy) (𝕡) asset#0 | value%41#0,tmp%43#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 + == // (𝕡) asset#0 | {==} asset.creator == Global.creator_address, "creator" asset/contract.py:66 + // virtual: store tmp%44#0 to l-stack (no copy) (𝕡) asset#0 | tmp%44#0 asset.creator == Global.creator_address, "creator" asset/contract.py:66 + // virtual: load tmp%44#0 from l-stack (no copy) (𝕡) asset#0 | tmp%44#0 assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 + assert // creator // (𝕡) asset#0 | assert asset.creator == Global.creator_address, "creator" asset/contract.py:66 retsub // // test_cases.asset.contract.Reference.__init__() -> void: __init__: - proto 0 0 // def __init__(self) -> None: asset/contract.py:17 + proto 0 0 // def __init__(self) -> None: asset/contract.py:17 __init___block@0: - byte "asa" // "asa" self.asa asset/contract.py:18 - int 0 // "asa",0 0 asset/contract.py:18 - app_global_put // self.asa = Asset(0) asset/contract.py:18 + byte "asa" // "asa" self.asa asset/contract.py:18 + int 0 // "asa",0 0 asset/contract.py:18 + app_global_put // self.asa = Asset(0) asset/contract.py:18 retsub // diff --git a/test_cases/asset/out/Reference.destructured.ir b/test_cases/asset/out/Reference.destructured.ir index 546818da9a..070d96b332 100644 --- a/test_cases/asset/out/Reference.destructured.ir +++ b/test_cases/asset/out/Reference.destructured.ir @@ -55,59 +55,59 @@ contract test_cases.asset.contract.Reference: (assert asa_exists%1#0) // check asa exists let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset - let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) - (assert maybe_value_did_exist%4#0) // asset exists - let tmp%5#0: uint64 = (== maybe_value%3#0 10000000u) + let (value%3#0: uint64, check%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) + (assert check%4#0) // asset exists + let tmp%5#0: uint64 = (== value%3#0 10000000u) (assert tmp%5#0) // total - let (maybe_value%6#0: uint64, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (! maybe_value%6#0) + let (value%6#0: uint64, check%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (! value%6#0) (assert tmp%8#0) // decimals - let (maybe_value%9#0: uint64, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (! maybe_value%9#0) + let (value%9#0: uint64, check%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (! value%9#0) (assert tmp%11#0) // default frozen - let (maybe_value%12#0: bytes, maybe_value_did_exist%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) - (assert maybe_value_did_exist%13#0) // asset exists - let tmp%14#0: uint64 = (== maybe_value%12#0 "a") + let (value%12#0: bytes, check%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) + (assert check%13#0) // asset exists + let tmp%14#0: uint64 = (== value%12#0 "a") (assert tmp%14#0) // unit_name - let (maybe_value%15#0: bytes, maybe_value_did_exist%16#0: uint64) = ((asset_params_get AssetName) asset#0) - (assert maybe_value_did_exist%16#0) // asset exists - let tmp%17#0: uint64 = (== maybe_value%15#0 "asset a") + let (value%15#0: bytes, check%16#0: uint64) = ((asset_params_get AssetName) asset#0) + (assert check%16#0) // asset exists + let tmp%17#0: uint64 = (== value%15#0 "asset a") (assert tmp%17#0) // name - let (maybe_value%18#0: bytes, maybe_value_did_exist%19#0: uint64) = ((asset_params_get AssetURL) asset#0) - (assert maybe_value_did_exist%19#0) // asset exists - let tmp%20#0: uint64 = (== maybe_value%18#0 "") + let (value%18#0: bytes, check%19#0: uint64) = ((asset_params_get AssetURL) asset#0) + (assert check%19#0) // asset exists + let tmp%20#0: uint64 = (== value%18#0 "") (assert tmp%20#0) // URL - let (maybe_value%21#0: bytes, maybe_value_did_exist%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) - (assert maybe_value_did_exist%22#0) // asset exists + let (value%21#0: bytes, check%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) + (assert check%22#0) // asset exists let tmp%23#0: bytes = (bzero 32u) - let tmp%24#0: uint64 = (== maybe_value%21#0 tmp%23#0) + let tmp%24#0: uint64 = (== value%21#0 tmp%23#0) (assert tmp%24#0) // hash - let (maybe_value%25#0: bytes, maybe_value_did_exist%26#0: uint64) = ((asset_params_get AssetManager) asset#0) - (assert maybe_value_did_exist%26#0) // asset exists + let (value%25#0: bytes, check%26#0: uint64) = ((asset_params_get AssetManager) asset#0) + (assert check%26#0) // asset exists let tmp%27#0: bytes = (global ZeroAddress) - let tmp%28#0: uint64 = (== maybe_value%25#0 tmp%27#0) + let tmp%28#0: uint64 = (== value%25#0 tmp%27#0) (assert tmp%28#0) // manager - let (maybe_value%29#0: bytes, maybe_value_did_exist%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) - (assert maybe_value_did_exist%30#0) // asset exists + let (value%29#0: bytes, check%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) + (assert check%30#0) // asset exists let tmp%31#0: bytes = (global ZeroAddress) - let tmp%32#0: uint64 = (== maybe_value%29#0 tmp%31#0) + let tmp%32#0: uint64 = (== value%29#0 tmp%31#0) (assert tmp%32#0) // reserve - let (maybe_value%33#0: bytes, maybe_value_did_exist%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) - (assert maybe_value_did_exist%34#0) // asset exists + let (value%33#0: bytes, check%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) + (assert check%34#0) // asset exists let tmp%35#0: bytes = (global ZeroAddress) - let tmp%36#0: uint64 = (== maybe_value%33#0 tmp%35#0) + let tmp%36#0: uint64 = (== value%33#0 tmp%35#0) (assert tmp%36#0) // freeze - let (maybe_value%37#0: bytes, maybe_value_did_exist%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) - (assert maybe_value_did_exist%38#0) // asset exists + let (value%37#0: bytes, check%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) + (assert check%38#0) // asset exists let tmp%39#0: bytes = (global ZeroAddress) - let tmp%40#0: uint64 = (== maybe_value%37#0 tmp%39#0) + let tmp%40#0: uint64 = (== value%37#0 tmp%39#0) (assert tmp%40#0) // clawback - let (maybe_value%41#0: bytes, maybe_value_did_exist%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) - (assert maybe_value_did_exist%42#0) // asset exists + let (value%41#0: bytes, check%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) + (assert check%42#0) // asset exists let tmp%43#0: bytes = (global CreatorAddress) - let tmp%44#0: uint64 = (== maybe_value%41#0 tmp%43#0) + let tmp%44#0: uint64 = (== value%41#0 tmp%43#0) (assert tmp%44#0) // creator return diff --git a/test_cases/asset/out/Reference.ssa.ir b/test_cases/asset/out/Reference.ssa.ir index 5014c98dd7..6ed685d7ab 100644 --- a/test_cases/asset/out/Reference.ssa.ir +++ b/test_cases/asset/out/Reference.ssa.ir @@ -62,59 +62,59 @@ contract test_cases.asset.contract.Reference: (assert asa_exists%1#0) // check asa exists let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset - let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) - (assert maybe_value_did_exist%4#0) // asset exists - let tmp%5#0: uint64 = (== maybe_value%3#0 10000000u) + let (value%3#0: uint64, check%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) + (assert check%4#0) // asset exists + let tmp%5#0: uint64 = (== value%3#0 10000000u) (assert tmp%5#0) // total - let (maybe_value%6#0: uint64, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 0u) + let (value%6#0: uint64, check%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 0u) (assert tmp%8#0) // decimals - let (maybe_value%9#0: uint64, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (! maybe_value%9#0) + let (value%9#0: uint64, check%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (! value%9#0) (assert tmp%11#0) // default frozen - let (maybe_value%12#0: bytes, maybe_value_did_exist%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) - (assert maybe_value_did_exist%13#0) // asset exists - let tmp%14#0: uint64 = (== maybe_value%12#0 "a") + let (value%12#0: bytes, check%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) + (assert check%13#0) // asset exists + let tmp%14#0: uint64 = (== value%12#0 "a") (assert tmp%14#0) // unit_name - let (maybe_value%15#0: bytes, maybe_value_did_exist%16#0: uint64) = ((asset_params_get AssetName) asset#0) - (assert maybe_value_did_exist%16#0) // asset exists - let tmp%17#0: uint64 = (== maybe_value%15#0 "asset a") + let (value%15#0: bytes, check%16#0: uint64) = ((asset_params_get AssetName) asset#0) + (assert check%16#0) // asset exists + let tmp%17#0: uint64 = (== value%15#0 "asset a") (assert tmp%17#0) // name - let (maybe_value%18#0: bytes, maybe_value_did_exist%19#0: uint64) = ((asset_params_get AssetURL) asset#0) - (assert maybe_value_did_exist%19#0) // asset exists - let tmp%20#0: uint64 = (== maybe_value%18#0 "") + let (value%18#0: bytes, check%19#0: uint64) = ((asset_params_get AssetURL) asset#0) + (assert check%19#0) // asset exists + let tmp%20#0: uint64 = (== value%18#0 "") (assert tmp%20#0) // URL - let (maybe_value%21#0: bytes, maybe_value_did_exist%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) - (assert maybe_value_did_exist%22#0) // asset exists + let (value%21#0: bytes, check%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) + (assert check%22#0) // asset exists let tmp%23#0: bytes = (bzero 32u) - let tmp%24#0: uint64 = (== maybe_value%21#0 tmp%23#0) + let tmp%24#0: uint64 = (== value%21#0 tmp%23#0) (assert tmp%24#0) // hash - let (maybe_value%25#0: bytes, maybe_value_did_exist%26#0: uint64) = ((asset_params_get AssetManager) asset#0) - (assert maybe_value_did_exist%26#0) // asset exists + let (value%25#0: bytes, check%26#0: uint64) = ((asset_params_get AssetManager) asset#0) + (assert check%26#0) // asset exists let tmp%27#0: bytes = (global ZeroAddress) - let tmp%28#0: uint64 = (== maybe_value%25#0 tmp%27#0) + let tmp%28#0: uint64 = (== value%25#0 tmp%27#0) (assert tmp%28#0) // manager - let (maybe_value%29#0: bytes, maybe_value_did_exist%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) - (assert maybe_value_did_exist%30#0) // asset exists + let (value%29#0: bytes, check%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) + (assert check%30#0) // asset exists let tmp%31#0: bytes = (global ZeroAddress) - let tmp%32#0: uint64 = (== maybe_value%29#0 tmp%31#0) + let tmp%32#0: uint64 = (== value%29#0 tmp%31#0) (assert tmp%32#0) // reserve - let (maybe_value%33#0: bytes, maybe_value_did_exist%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) - (assert maybe_value_did_exist%34#0) // asset exists + let (value%33#0: bytes, check%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) + (assert check%34#0) // asset exists let tmp%35#0: bytes = (global ZeroAddress) - let tmp%36#0: uint64 = (== maybe_value%33#0 tmp%35#0) + let tmp%36#0: uint64 = (== value%33#0 tmp%35#0) (assert tmp%36#0) // freeze - let (maybe_value%37#0: bytes, maybe_value_did_exist%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) - (assert maybe_value_did_exist%38#0) // asset exists + let (value%37#0: bytes, check%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) + (assert check%38#0) // asset exists let tmp%39#0: bytes = (global ZeroAddress) - let tmp%40#0: uint64 = (== maybe_value%37#0 tmp%39#0) + let tmp%40#0: uint64 = (== value%37#0 tmp%39#0) (assert tmp%40#0) // clawback - let (maybe_value%41#0: bytes, maybe_value_did_exist%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) - (assert maybe_value_did_exist%42#0) // asset exists + let (value%41#0: bytes, check%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) + (assert check%42#0) // asset exists let tmp%43#0: bytes = (global CreatorAddress) - let tmp%44#0: uint64 = (== maybe_value%41#0 tmp%43#0) + let tmp%44#0: uint64 = (== value%41#0 tmp%43#0) (assert tmp%44#0) // creator return diff --git a/test_cases/asset/out/Reference.ssa.opt_pass_1.ir b/test_cases/asset/out/Reference.ssa.opt_pass_1.ir index a1f0480564..e486a07d89 100644 --- a/test_cases/asset/out/Reference.ssa.opt_pass_1.ir +++ b/test_cases/asset/out/Reference.ssa.opt_pass_1.ir @@ -55,59 +55,59 @@ contract test_cases.asset.contract.Reference: (assert asa_exists%1#0) // check asa exists let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset - let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) - (assert maybe_value_did_exist%4#0) // asset exists - let tmp%5#0: uint64 = (== maybe_value%3#0 10000000u) + let (value%3#0: uint64, check%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) + (assert check%4#0) // asset exists + let tmp%5#0: uint64 = (== value%3#0 10000000u) (assert tmp%5#0) // total - let (maybe_value%6#0: uint64, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (! maybe_value%6#0) + let (value%6#0: uint64, check%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (! value%6#0) (assert tmp%8#0) // decimals - let (maybe_value%9#0: uint64, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (! maybe_value%9#0) + let (value%9#0: uint64, check%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (! value%9#0) (assert tmp%11#0) // default frozen - let (maybe_value%12#0: bytes, maybe_value_did_exist%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) - (assert maybe_value_did_exist%13#0) // asset exists - let tmp%14#0: uint64 = (== maybe_value%12#0 "a") + let (value%12#0: bytes, check%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) + (assert check%13#0) // asset exists + let tmp%14#0: uint64 = (== value%12#0 "a") (assert tmp%14#0) // unit_name - let (maybe_value%15#0: bytes, maybe_value_did_exist%16#0: uint64) = ((asset_params_get AssetName) asset#0) - (assert maybe_value_did_exist%16#0) // asset exists - let tmp%17#0: uint64 = (== maybe_value%15#0 "asset a") + let (value%15#0: bytes, check%16#0: uint64) = ((asset_params_get AssetName) asset#0) + (assert check%16#0) // asset exists + let tmp%17#0: uint64 = (== value%15#0 "asset a") (assert tmp%17#0) // name - let (maybe_value%18#0: bytes, maybe_value_did_exist%19#0: uint64) = ((asset_params_get AssetURL) asset#0) - (assert maybe_value_did_exist%19#0) // asset exists - let tmp%20#0: uint64 = (== maybe_value%18#0 "") + let (value%18#0: bytes, check%19#0: uint64) = ((asset_params_get AssetURL) asset#0) + (assert check%19#0) // asset exists + let tmp%20#0: uint64 = (== value%18#0 "") (assert tmp%20#0) // URL - let (maybe_value%21#0: bytes, maybe_value_did_exist%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) - (assert maybe_value_did_exist%22#0) // asset exists + let (value%21#0: bytes, check%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) + (assert check%22#0) // asset exists let tmp%23#0: bytes = (bzero 32u) - let tmp%24#0: uint64 = (== maybe_value%21#0 tmp%23#0) + let tmp%24#0: uint64 = (== value%21#0 tmp%23#0) (assert tmp%24#0) // hash - let (maybe_value%25#0: bytes, maybe_value_did_exist%26#0: uint64) = ((asset_params_get AssetManager) asset#0) - (assert maybe_value_did_exist%26#0) // asset exists + let (value%25#0: bytes, check%26#0: uint64) = ((asset_params_get AssetManager) asset#0) + (assert check%26#0) // asset exists let tmp%27#0: bytes = (global ZeroAddress) - let tmp%28#0: uint64 = (== maybe_value%25#0 tmp%27#0) + let tmp%28#0: uint64 = (== value%25#0 tmp%27#0) (assert tmp%28#0) // manager - let (maybe_value%29#0: bytes, maybe_value_did_exist%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) - (assert maybe_value_did_exist%30#0) // asset exists + let (value%29#0: bytes, check%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) + (assert check%30#0) // asset exists let tmp%31#0: bytes = (global ZeroAddress) - let tmp%32#0: uint64 = (== maybe_value%29#0 tmp%31#0) + let tmp%32#0: uint64 = (== value%29#0 tmp%31#0) (assert tmp%32#0) // reserve - let (maybe_value%33#0: bytes, maybe_value_did_exist%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) - (assert maybe_value_did_exist%34#0) // asset exists + let (value%33#0: bytes, check%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) + (assert check%34#0) // asset exists let tmp%35#0: bytes = (global ZeroAddress) - let tmp%36#0: uint64 = (== maybe_value%33#0 tmp%35#0) + let tmp%36#0: uint64 = (== value%33#0 tmp%35#0) (assert tmp%36#0) // freeze - let (maybe_value%37#0: bytes, maybe_value_did_exist%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) - (assert maybe_value_did_exist%38#0) // asset exists + let (value%37#0: bytes, check%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) + (assert check%38#0) // asset exists let tmp%39#0: bytes = (global ZeroAddress) - let tmp%40#0: uint64 = (== maybe_value%37#0 tmp%39#0) + let tmp%40#0: uint64 = (== value%37#0 tmp%39#0) (assert tmp%40#0) // clawback - let (maybe_value%41#0: bytes, maybe_value_did_exist%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) - (assert maybe_value_did_exist%42#0) // asset exists + let (value%41#0: bytes, check%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) + (assert check%42#0) // asset exists let tmp%43#0: bytes = (global CreatorAddress) - let tmp%44#0: uint64 = (== maybe_value%41#0 tmp%43#0) + let tmp%44#0: uint64 = (== value%41#0 tmp%43#0) (assert tmp%44#0) // creator return diff --git a/test_cases/asset/out_O2/Reference.destructured.ir b/test_cases/asset/out_O2/Reference.destructured.ir index 546818da9a..070d96b332 100644 --- a/test_cases/asset/out_O2/Reference.destructured.ir +++ b/test_cases/asset/out_O2/Reference.destructured.ir @@ -55,59 +55,59 @@ contract test_cases.asset.contract.Reference: (assert asa_exists%1#0) // check asa exists let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset - let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) - (assert maybe_value_did_exist%4#0) // asset exists - let tmp%5#0: uint64 = (== maybe_value%3#0 10000000u) + let (value%3#0: uint64, check%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) + (assert check%4#0) // asset exists + let tmp%5#0: uint64 = (== value%3#0 10000000u) (assert tmp%5#0) // total - let (maybe_value%6#0: uint64, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (! maybe_value%6#0) + let (value%6#0: uint64, check%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (! value%6#0) (assert tmp%8#0) // decimals - let (maybe_value%9#0: uint64, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (! maybe_value%9#0) + let (value%9#0: uint64, check%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (! value%9#0) (assert tmp%11#0) // default frozen - let (maybe_value%12#0: bytes, maybe_value_did_exist%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) - (assert maybe_value_did_exist%13#0) // asset exists - let tmp%14#0: uint64 = (== maybe_value%12#0 "a") + let (value%12#0: bytes, check%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) + (assert check%13#0) // asset exists + let tmp%14#0: uint64 = (== value%12#0 "a") (assert tmp%14#0) // unit_name - let (maybe_value%15#0: bytes, maybe_value_did_exist%16#0: uint64) = ((asset_params_get AssetName) asset#0) - (assert maybe_value_did_exist%16#0) // asset exists - let tmp%17#0: uint64 = (== maybe_value%15#0 "asset a") + let (value%15#0: bytes, check%16#0: uint64) = ((asset_params_get AssetName) asset#0) + (assert check%16#0) // asset exists + let tmp%17#0: uint64 = (== value%15#0 "asset a") (assert tmp%17#0) // name - let (maybe_value%18#0: bytes, maybe_value_did_exist%19#0: uint64) = ((asset_params_get AssetURL) asset#0) - (assert maybe_value_did_exist%19#0) // asset exists - let tmp%20#0: uint64 = (== maybe_value%18#0 "") + let (value%18#0: bytes, check%19#0: uint64) = ((asset_params_get AssetURL) asset#0) + (assert check%19#0) // asset exists + let tmp%20#0: uint64 = (== value%18#0 "") (assert tmp%20#0) // URL - let (maybe_value%21#0: bytes, maybe_value_did_exist%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) - (assert maybe_value_did_exist%22#0) // asset exists + let (value%21#0: bytes, check%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) + (assert check%22#0) // asset exists let tmp%23#0: bytes = (bzero 32u) - let tmp%24#0: uint64 = (== maybe_value%21#0 tmp%23#0) + let tmp%24#0: uint64 = (== value%21#0 tmp%23#0) (assert tmp%24#0) // hash - let (maybe_value%25#0: bytes, maybe_value_did_exist%26#0: uint64) = ((asset_params_get AssetManager) asset#0) - (assert maybe_value_did_exist%26#0) // asset exists + let (value%25#0: bytes, check%26#0: uint64) = ((asset_params_get AssetManager) asset#0) + (assert check%26#0) // asset exists let tmp%27#0: bytes = (global ZeroAddress) - let tmp%28#0: uint64 = (== maybe_value%25#0 tmp%27#0) + let tmp%28#0: uint64 = (== value%25#0 tmp%27#0) (assert tmp%28#0) // manager - let (maybe_value%29#0: bytes, maybe_value_did_exist%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) - (assert maybe_value_did_exist%30#0) // asset exists + let (value%29#0: bytes, check%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) + (assert check%30#0) // asset exists let tmp%31#0: bytes = (global ZeroAddress) - let tmp%32#0: uint64 = (== maybe_value%29#0 tmp%31#0) + let tmp%32#0: uint64 = (== value%29#0 tmp%31#0) (assert tmp%32#0) // reserve - let (maybe_value%33#0: bytes, maybe_value_did_exist%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) - (assert maybe_value_did_exist%34#0) // asset exists + let (value%33#0: bytes, check%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) + (assert check%34#0) // asset exists let tmp%35#0: bytes = (global ZeroAddress) - let tmp%36#0: uint64 = (== maybe_value%33#0 tmp%35#0) + let tmp%36#0: uint64 = (== value%33#0 tmp%35#0) (assert tmp%36#0) // freeze - let (maybe_value%37#0: bytes, maybe_value_did_exist%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) - (assert maybe_value_did_exist%38#0) // asset exists + let (value%37#0: bytes, check%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) + (assert check%38#0) // asset exists let tmp%39#0: bytes = (global ZeroAddress) - let tmp%40#0: uint64 = (== maybe_value%37#0 tmp%39#0) + let tmp%40#0: uint64 = (== value%37#0 tmp%39#0) (assert tmp%40#0) // clawback - let (maybe_value%41#0: bytes, maybe_value_did_exist%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) - (assert maybe_value_did_exist%42#0) // asset exists + let (value%41#0: bytes, check%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) + (assert check%42#0) // asset exists let tmp%43#0: bytes = (global CreatorAddress) - let tmp%44#0: uint64 = (== maybe_value%41#0 tmp%43#0) + let tmp%44#0: uint64 = (== value%41#0 tmp%43#0) (assert tmp%44#0) // creator return diff --git a/test_cases/asset/out_unoptimized/Reference.destructured.ir b/test_cases/asset/out_unoptimized/Reference.destructured.ir index 2fc9e0a0e2..941e8c4bc0 100644 --- a/test_cases/asset/out_unoptimized/Reference.destructured.ir +++ b/test_cases/asset/out_unoptimized/Reference.destructured.ir @@ -62,59 +62,59 @@ contract test_cases.asset.contract.Reference: (assert asa_exists%1#0) // check asa exists let tmp%2#0: uint64 = (== asa_value%0#0 asset#0) (assert tmp%2#0) // asset self.asa == asset - let (maybe_value%3#0: uint64, maybe_value_did_exist%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) - (assert maybe_value_did_exist%4#0) // asset exists - let tmp%5#0: uint64 = (== maybe_value%3#0 10000000u) + let (value%3#0: uint64, check%4#0: uint64) = ((asset_params_get AssetTotal) asset#0) + (assert check%4#0) // asset exists + let tmp%5#0: uint64 = (== value%3#0 10000000u) (assert tmp%5#0) // total - let (maybe_value%6#0: uint64, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 0u) + let (value%6#0: uint64, check%7#0: uint64) = ((asset_params_get AssetDecimals) asset#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 0u) (assert tmp%8#0) // decimals - let (maybe_value%9#0: uint64, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (! maybe_value%9#0) + let (value%9#0: uint64, check%10#0: uint64) = ((asset_params_get AssetDefaultFrozen) asset#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (! value%9#0) (assert tmp%11#0) // default frozen - let (maybe_value%12#0: bytes, maybe_value_did_exist%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) - (assert maybe_value_did_exist%13#0) // asset exists - let tmp%14#0: uint64 = (== maybe_value%12#0 "a") + let (value%12#0: bytes, check%13#0: uint64) = ((asset_params_get AssetUnitName) asset#0) + (assert check%13#0) // asset exists + let tmp%14#0: uint64 = (== value%12#0 "a") (assert tmp%14#0) // unit_name - let (maybe_value%15#0: bytes, maybe_value_did_exist%16#0: uint64) = ((asset_params_get AssetName) asset#0) - (assert maybe_value_did_exist%16#0) // asset exists - let tmp%17#0: uint64 = (== maybe_value%15#0 "asset a") + let (value%15#0: bytes, check%16#0: uint64) = ((asset_params_get AssetName) asset#0) + (assert check%16#0) // asset exists + let tmp%17#0: uint64 = (== value%15#0 "asset a") (assert tmp%17#0) // name - let (maybe_value%18#0: bytes, maybe_value_did_exist%19#0: uint64) = ((asset_params_get AssetURL) asset#0) - (assert maybe_value_did_exist%19#0) // asset exists - let tmp%20#0: uint64 = (== maybe_value%18#0 "") + let (value%18#0: bytes, check%19#0: uint64) = ((asset_params_get AssetURL) asset#0) + (assert check%19#0) // asset exists + let tmp%20#0: uint64 = (== value%18#0 "") (assert tmp%20#0) // URL - let (maybe_value%21#0: bytes, maybe_value_did_exist%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) - (assert maybe_value_did_exist%22#0) // asset exists + let (value%21#0: bytes, check%22#0: uint64) = ((asset_params_get AssetMetadataHash) asset#0) + (assert check%22#0) // asset exists let tmp%23#0: bytes = (bzero 32u) - let tmp%24#0: uint64 = (== maybe_value%21#0 tmp%23#0) + let tmp%24#0: uint64 = (== value%21#0 tmp%23#0) (assert tmp%24#0) // hash - let (maybe_value%25#0: bytes, maybe_value_did_exist%26#0: uint64) = ((asset_params_get AssetManager) asset#0) - (assert maybe_value_did_exist%26#0) // asset exists + let (value%25#0: bytes, check%26#0: uint64) = ((asset_params_get AssetManager) asset#0) + (assert check%26#0) // asset exists let tmp%27#0: bytes = (global ZeroAddress) - let tmp%28#0: uint64 = (== maybe_value%25#0 tmp%27#0) + let tmp%28#0: uint64 = (== value%25#0 tmp%27#0) (assert tmp%28#0) // manager - let (maybe_value%29#0: bytes, maybe_value_did_exist%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) - (assert maybe_value_did_exist%30#0) // asset exists + let (value%29#0: bytes, check%30#0: uint64) = ((asset_params_get AssetReserve) asset#0) + (assert check%30#0) // asset exists let tmp%31#0: bytes = (global ZeroAddress) - let tmp%32#0: uint64 = (== maybe_value%29#0 tmp%31#0) + let tmp%32#0: uint64 = (== value%29#0 tmp%31#0) (assert tmp%32#0) // reserve - let (maybe_value%33#0: bytes, maybe_value_did_exist%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) - (assert maybe_value_did_exist%34#0) // asset exists + let (value%33#0: bytes, check%34#0: uint64) = ((asset_params_get AssetFreeze) asset#0) + (assert check%34#0) // asset exists let tmp%35#0: bytes = (global ZeroAddress) - let tmp%36#0: uint64 = (== maybe_value%33#0 tmp%35#0) + let tmp%36#0: uint64 = (== value%33#0 tmp%35#0) (assert tmp%36#0) // freeze - let (maybe_value%37#0: bytes, maybe_value_did_exist%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) - (assert maybe_value_did_exist%38#0) // asset exists + let (value%37#0: bytes, check%38#0: uint64) = ((asset_params_get AssetClawback) asset#0) + (assert check%38#0) // asset exists let tmp%39#0: bytes = (global ZeroAddress) - let tmp%40#0: uint64 = (== maybe_value%37#0 tmp%39#0) + let tmp%40#0: uint64 = (== value%37#0 tmp%39#0) (assert tmp%40#0) // clawback - let (maybe_value%41#0: bytes, maybe_value_did_exist%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) - (assert maybe_value_did_exist%42#0) // asset exists + let (value%41#0: bytes, check%42#0: uint64) = ((asset_params_get AssetCreator) asset#0) + (assert check%42#0) // asset exists let tmp%43#0: bytes = (global CreatorAddress) - let tmp%44#0: uint64 = (== maybe_value%41#0 tmp%43#0) + let tmp%44#0: uint64 = (== value%41#0 tmp%43#0) (assert tmp%44#0) // creator return diff --git a/test_cases/asset/puya.log b/test_cases/asset/puya.log index dc0730224d..58adcb35fb 100644 --- a/test_cases/asset/puya.log +++ b/test_cases/asset/puya.log @@ -529,67 +529,67 @@ debug: Inserted is_opted_asset_block@0.ops[177]: 'store tmp%44#0 to l-stack (cop debug: Replaced is_opted_asset_block@0.ops[179]: 'load tmp%44#0' with 'load tmp%44#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[3]: 'store asa_exists%1#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[6]: 'load asa_exists%1#0' with 'load asa_exists%1#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[17]: 'store maybe_value_did_exist%4#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[20]: 'load maybe_value_did_exist%4#0' with 'load maybe_value_did_exist%4#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[31]: 'store maybe_value_did_exist%7#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[34]: 'load maybe_value_did_exist%7#0' with 'load maybe_value_did_exist%7#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[44]: 'store maybe_value_did_exist%10#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[47]: 'load maybe_value_did_exist%10#0' with 'load maybe_value_did_exist%10#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[57]: 'store maybe_value_did_exist%13#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[60]: 'load maybe_value_did_exist%13#0' with 'load maybe_value_did_exist%13#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[71]: 'store maybe_value_did_exist%16#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[74]: 'load maybe_value_did_exist%16#0' with 'load maybe_value_did_exist%16#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[85]: 'store maybe_value_did_exist%19#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[88]: 'load maybe_value_did_exist%19#0' with 'load maybe_value_did_exist%19#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[99]: 'store maybe_value_did_exist%22#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[102]: 'load maybe_value_did_exist%22#0' with 'load maybe_value_did_exist%22#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[17]: 'store check%4#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[20]: 'load check%4#0' with 'load check%4#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[31]: 'store check%7#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[34]: 'load check%7#0' with 'load check%7#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[44]: 'store check%10#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[47]: 'load check%10#0' with 'load check%10#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[57]: 'store check%13#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[60]: 'load check%13#0' with 'load check%13#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[71]: 'store check%16#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[74]: 'load check%16#0' with 'load check%16#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[85]: 'store check%19#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[88]: 'load check%19#0' with 'load check%19#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[99]: 'store check%22#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[102]: 'load check%22#0' with 'load check%22#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[106]: 'store tmp%23#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[109]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[117]: 'store maybe_value_did_exist%26#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[120]: 'load maybe_value_did_exist%26#0' with 'load maybe_value_did_exist%26#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[117]: 'store check%26#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[120]: 'load check%26#0' with 'load check%26#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[123]: 'store tmp%27#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[126]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[134]: 'store maybe_value_did_exist%30#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[137]: 'load maybe_value_did_exist%30#0' with 'load maybe_value_did_exist%30#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[134]: 'store check%30#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[137]: 'load check%30#0' with 'load check%30#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[140]: 'store tmp%31#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[143]: 'load tmp%31#0' with 'load tmp%31#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[151]: 'store maybe_value_did_exist%34#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[154]: 'load maybe_value_did_exist%34#0' with 'load maybe_value_did_exist%34#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[151]: 'store check%34#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[154]: 'load check%34#0' with 'load check%34#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[157]: 'store tmp%35#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[160]: 'load tmp%35#0' with 'load tmp%35#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[168]: 'store maybe_value_did_exist%38#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[171]: 'load maybe_value_did_exist%38#0' with 'load maybe_value_did_exist%38#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[168]: 'store check%38#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[171]: 'load check%38#0' with 'load check%38#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[174]: 'store tmp%39#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[177]: 'load tmp%39#0' with 'load tmp%39#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[185]: 'store maybe_value_did_exist%42#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[188]: 'load maybe_value_did_exist%42#0' with 'load maybe_value_did_exist%42#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[185]: 'store check%42#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[188]: 'load check%42#0' with 'load check%42#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[191]: 'store tmp%43#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[194]: 'load tmp%43#0' with 'load tmp%43#0 from l-stack (no copy)' debug: Inserted is_opted_asset_block@0.ops[5]: 'store asa_value%0#0 to l-stack (copy)' debug: Replaced is_opted_asset_block@0.ops[9]: 'load asa_value%0#0' with 'load asa_value%0#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[20]: 'store maybe_value%3#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[24]: 'load maybe_value%3#0' with 'load maybe_value%3#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[35]: 'store maybe_value%6#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[39]: 'load maybe_value%6#0' with 'load maybe_value%6#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[49]: 'store maybe_value%9#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[53]: 'load maybe_value%9#0' with 'load maybe_value%9#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[63]: 'store maybe_value%12#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[67]: 'load maybe_value%12#0' with 'load maybe_value%12#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[78]: 'store maybe_value%15#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[82]: 'load maybe_value%15#0' with 'load maybe_value%15#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[93]: 'store maybe_value%18#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[97]: 'load maybe_value%18#0' with 'load maybe_value%18#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[126]: 'store maybe_value%25#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[133]: 'load maybe_value%25#0' with 'load maybe_value%25#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[144]: 'store maybe_value%29#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[151]: 'load maybe_value%29#0' with 'load maybe_value%29#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[162]: 'store maybe_value%33#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[169]: 'load maybe_value%33#0' with 'load maybe_value%33#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[180]: 'store maybe_value%37#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[187]: 'load maybe_value%37#0' with 'load maybe_value%37#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[198]: 'store maybe_value%41#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[205]: 'load maybe_value%41#0' with 'load maybe_value%41#0 from l-stack (no copy)' -debug: Inserted is_opted_asset_block@0.ops[108]: 'store maybe_value%21#0 to l-stack (copy)' -debug: Replaced is_opted_asset_block@0.ops[116]: 'load maybe_value%21#0' with 'load maybe_value%21#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[20]: 'store value%3#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[24]: 'load value%3#0' with 'load value%3#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[35]: 'store value%6#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[39]: 'load value%6#0' with 'load value%6#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[49]: 'store value%9#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[53]: 'load value%9#0' with 'load value%9#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[63]: 'store value%12#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[67]: 'load value%12#0' with 'load value%12#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[78]: 'store value%15#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[82]: 'load value%15#0' with 'load value%15#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[93]: 'store value%18#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[97]: 'load value%18#0' with 'load value%18#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[126]: 'store value%25#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[133]: 'load value%25#0' with 'load value%25#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[144]: 'store value%29#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[151]: 'load value%29#0' with 'load value%29#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[162]: 'store value%33#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[169]: 'load value%33#0' with 'load value%33#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[180]: 'store value%37#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[187]: 'load value%37#0' with 'load value%37#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[198]: 'store value%41#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[205]: 'load value%41#0' with 'load value%41#0 from l-stack (no copy)' +debug: Inserted is_opted_asset_block@0.ops[108]: 'store value%21#0 to l-stack (copy)' +debug: Replaced is_opted_asset_block@0.ops[116]: 'load value%21#0' with 'load value%21#0 from l-stack (no copy)' info: Writing asset/out/Reference.approval.teal info: Writing asset/out/Reference.clear.teal \ No newline at end of file diff --git a/test_cases/inner_transactions/out/Greeter.approval.mir b/test_cases/inner_transactions/out/Greeter.approval.mir index 13ab6f53ab..b561d6b17f 100644 --- a/test_cases/inner_transactions/out/Greeter.approval.mir +++ b/test_cases/inner_transactions/out/Greeter.approval.mir @@ -166,12 +166,12 @@ log_greetings_block@0: swap // store greeting#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 // virtual: load hello_call%%LastLog#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,hello_call%%LastLog#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 extract 0 4 // (𝕡) name#0 | greeting#0,{extract} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: store tmp%6#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%6#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%6#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - byte 0x151f7c75 // (𝕡) name#0 | greeting#0,tmp%6#0,0x151f7c75 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: store tmp%4#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%4#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: load tmp%4#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%4#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + byte 0x151f7c75 // (𝕡) name#0 | greeting#0,tmp%4#0,0x151f7c75 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 == // (𝕡) name#0 | greeting#0,{==} arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: store tmp%7#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%7#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 - // virtual: load tmp%7#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%7#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: store tmp%5#0 to l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%5#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 + // virtual: load tmp%5#0 from l-stack (no copy) (𝕡) name#0 | greeting#0,tmp%5#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 assert // ARC4 prefix is valid // (𝕡) name#0 | greeting#0 arc4.String.from_log(hello_call.last_log) inner_transactions/c2c.py:30 // virtual: load greeting#0 from l-stack (no copy) (𝕡) name#0 | greeting#0 greeting.decode() inner_transactions/c2c.py:31 extract 2 0 // (𝕡) name#0 | {extract} greeting.decode() inner_transactions/c2c.py:31 diff --git a/test_cases/inner_transactions/out/Greeter.destructured.ir b/test_cases/inner_transactions/out/Greeter.destructured.ir index 9d9d68d467..05909d7ee9 100644 --- a/test_cases/inner_transactions/out/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out/Greeter.destructured.ir @@ -72,9 +72,9 @@ contract test_cases.inner_transactions.c2c.Greeter: itxn_submit let hello_call%%LastLog#0: bytes = (itxn LastLog) let greeting#0: bytes = ((extract 4 0) hello_call%%LastLog#0) - let tmp%6#0: bytes = ((extract 0 4) hello_call%%LastLog#0) - let tmp%7#0: uint64 = (== tmp%6#0 0x151f7c75) - (assert tmp%7#0) // ARC4 prefix is valid + let tmp%4#0: bytes = ((extract 0 4) hello_call%%LastLog#0) + let tmp%5#0: uint64 = (== tmp%4#0 0x151f7c75) + (assert tmp%5#0) // ARC4 prefix is valid let tmp%9#0: bytes = ((extract 2 0) greeting#0) let tmp%10#0: bytes = (concat "HelloWorld returned: " tmp%9#0) (log tmp%10#0) diff --git a/test_cases/inner_transactions/out/Greeter.ssa.ir b/test_cases/inner_transactions/out/Greeter.ssa.ir index a168599ff7..fe6050f4c5 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.ir @@ -315,12 +315,12 @@ contract test_cases.inner_transactions.c2c.Greeter: let hello_call%%VoteKeyDilution#0: uint64 = (itxn VoteKeyDilution) let hello_call%%VoteLast#0: uint64 = (itxn VoteLast) let hello_call%%XferAsset#0: uint64 = (itxn XferAsset) - let tmp%5#0: bytes = ((extract 4 0) hello_call%%LastLog#0) - let tmp%6#0: bytes = ((extract 0 4) hello_call%%LastLog#0) - let tmp%7#0: uint64 = (== tmp%6#0 0x151f7c75) - let (maybe_value%3#0: bytes, maybe_value_did_exist%4#0: uint64) = (tmp%5#0, tmp%7#0) - (assert maybe_value_did_exist%4#0) // ARC4 prefix is valid - let greeting#0: bytes = maybe_value%3#0 + let tmp%3#0: bytes = ((extract 4 0) hello_call%%LastLog#0) + let tmp%4#0: bytes = ((extract 0 4) hello_call%%LastLog#0) + let tmp%5#0: uint64 = (== tmp%4#0 0x151f7c75) + let (value%6#0: bytes, check%7#0: uint64) = (tmp%3#0, tmp%5#0) + (assert check%7#0) // ARC4 prefix is valid + let greeting#0: bytes = value%6#0 let tmp%8#0: bytes = (concat "HelloWorld returned: " "") let tmp%9#0: bytes = ((extract 2 0) greeting#0) let tmp%10#0: bytes = (concat tmp%8#0 tmp%9#0) diff --git a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir index 9d9d68d467..05909d7ee9 100644 --- a/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/Greeter.ssa.opt_pass_1.ir @@ -72,9 +72,9 @@ contract test_cases.inner_transactions.c2c.Greeter: itxn_submit let hello_call%%LastLog#0: bytes = (itxn LastLog) let greeting#0: bytes = ((extract 4 0) hello_call%%LastLog#0) - let tmp%6#0: bytes = ((extract 0 4) hello_call%%LastLog#0) - let tmp%7#0: uint64 = (== tmp%6#0 0x151f7c75) - (assert tmp%7#0) // ARC4 prefix is valid + let tmp%4#0: bytes = ((extract 0 4) hello_call%%LastLog#0) + let tmp%5#0: uint64 = (== tmp%4#0 0x151f7c75) + (assert tmp%5#0) // ARC4 prefix is valid let tmp%9#0: bytes = ((extract 2 0) greeting#0) let tmp%10#0: bytes = (concat "HelloWorld returned: " tmp%9#0) (log tmp%10#0) diff --git a/test_cases/inner_transactions/out/MyContract.approval.mir b/test_cases/inner_transactions/out/MyContract.approval.mir index e3c4ab0bbd..a6729b4437 100644 --- a/test_cases/inner_transactions/out/MyContract.approval.mir +++ b/test_cases/inner_transactions/out/MyContract.approval.mir @@ -141,24 +141,24 @@ test1_block@0: assert // asset2_txn is correct // asset1_txn%%CreatedAssetID#0,asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0 assert asset2_txn.asset_name == b"AST2", "asset2_txn is correct" inner_transactions/contract.py:64 uncover 3 // load asset1_txn%%CreatedAssetID#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,asset1_txn%%CreatedAssetID#0 asset1_txn.created_asset.name inner_transactions/contract.py:66 asset_params_get AssetName // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,{asset_params_get}.0,{asset_params_get}.1 asset1_txn.created_asset.name inner_transactions/contract.py:66 - // virtual: store maybe_value_did_exist%7#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,maybe_value_did_exist%7#0,{asset_params_get}.0 asset1_txn.created_asset.name inner_transactions/contract.py:66 - // virtual: store maybe_value%6#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,maybe_value%6#0,maybe_value_did_exist%7#0 asset1_txn.created_asset.name inner_transactions/contract.py:66 - // virtual: load maybe_value_did_exist%7#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,maybe_value%6#0,maybe_value_did_exist%7#0 asset1_txn.created_asset.name inner_transactions/contract.py:66 - assert // asset exists // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,maybe_value%6#0 asset1_txn.created_asset.name inner_transactions/contract.py:66 - // virtual: load maybe_value%6#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,maybe_value%6#0 asset1_txn.created_asset.name == b"AST1", "created asset 1 is correct" inner_transactions/contract.py:66 - byte "AST1" // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,maybe_value%6#0,"AST1" b"AST1" inner_transactions/contract.py:66 + // virtual: store check%7#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,check%7#0,{asset_params_get}.0 asset1_txn.created_asset.name inner_transactions/contract.py:66 + // virtual: store value%6#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,value%6#0,check%7#0 asset1_txn.created_asset.name inner_transactions/contract.py:66 + // virtual: load check%7#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,value%6#0,check%7#0 asset1_txn.created_asset.name inner_transactions/contract.py:66 + assert // asset exists // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,value%6#0 asset1_txn.created_asset.name inner_transactions/contract.py:66 + // virtual: load value%6#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,value%6#0 asset1_txn.created_asset.name == b"AST1", "created asset 1 is correct" inner_transactions/contract.py:66 + byte "AST1" // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,value%6#0,"AST1" b"AST1" inner_transactions/contract.py:66 == // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,{==} asset1_txn.created_asset.name == b"AST1", "created asset 1 is correct" inner_transactions/contract.py:66 // virtual: store tmp%8#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,tmp%8#0 asset1_txn.created_asset.name == b"AST1", "created asset 1 is correct" inner_transactions/contract.py:66 // virtual: load tmp%8#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0,tmp%8#0 assert asset1_txn.created_asset.name == b"AST1", "created asset 1 is correct" inner_transactions/contract.py:66 assert // created asset 1 is correct // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0 assert asset1_txn.created_asset.name == b"AST1", "created asset 1 is correct" inner_transactions/contract.py:66 // virtual: load asset2_txn%%CreatedAssetID#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,asset2_txn%%CreatedAssetID#0 asset2_txn.created_asset.name inner_transactions/contract.py:67 asset_params_get AssetName // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,{asset_params_get}.0,{asset_params_get}.1 asset2_txn.created_asset.name inner_transactions/contract.py:67 - // virtual: store maybe_value_did_exist%10#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,maybe_value_did_exist%10#0,{asset_params_get}.0 asset2_txn.created_asset.name inner_transactions/contract.py:67 - // virtual: store maybe_value%9#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,maybe_value%9#0,maybe_value_did_exist%10#0 asset2_txn.created_asset.name inner_transactions/contract.py:67 - // virtual: load maybe_value_did_exist%10#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,maybe_value%9#0,maybe_value_did_exist%10#0 asset2_txn.created_asset.name inner_transactions/contract.py:67 - assert // asset exists // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,maybe_value%9#0 asset2_txn.created_asset.name inner_transactions/contract.py:67 - // virtual: load maybe_value%9#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,maybe_value%9#0 asset2_txn.created_asset.name == b"AST2", "created asset 2 is correct" inner_transactions/contract.py:67 - byte "AST2" // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,maybe_value%9#0,"AST2" b"AST2" inner_transactions/contract.py:67 + // virtual: store check%10#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,check%10#0,{asset_params_get}.0 asset2_txn.created_asset.name inner_transactions/contract.py:67 + // virtual: store value%9#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,value%9#0,check%10#0 asset2_txn.created_asset.name inner_transactions/contract.py:67 + // virtual: load check%10#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,value%9#0,check%10#0 asset2_txn.created_asset.name inner_transactions/contract.py:67 + assert // asset exists // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,value%9#0 asset2_txn.created_asset.name inner_transactions/contract.py:67 + // virtual: load value%9#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,value%9#0 asset2_txn.created_asset.name == b"AST2", "created asset 2 is correct" inner_transactions/contract.py:67 + byte "AST2" // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,value%9#0,"AST2" b"AST2" inner_transactions/contract.py:67 == // asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,{==} asset2_txn.created_asset.name == b"AST2", "created asset 2 is correct" inner_transactions/contract.py:67 // virtual: store tmp%11#0 to l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,tmp%11#0 asset2_txn.created_asset.name == b"AST2", "created asset 2 is correct" inner_transactions/contract.py:67 // virtual: load tmp%11#0 from l-stack (no copy) asset_params%%param_ConfigAssetManager_idx_0#0,asset_params%%param_ConfigAssetReserve_idx_0#0,tmp%11#0 assert asset2_txn.created_asset.name == b"AST2", "created asset 2 is correct" inner_transactions/contract.py:67 diff --git a/test_cases/inner_transactions/out/MyContract.destructured.ir b/test_cases/inner_transactions/out/MyContract.destructured.ir index 930f80af5e..6fdf84f596 100644 --- a/test_cases/inner_transactions/out/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out/MyContract.destructured.ir @@ -66,13 +66,13 @@ contract test_cases.inner_transactions.contract.MyContract: (assert tmp%4#0) // asset1_txn is correct let tmp%5#0: uint64 = (== asset2_txn%%ConfigAssetName#0 "AST2") (assert tmp%5#0) // asset2_txn is correct - let (maybe_value%6#0: bytes, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 "AST1") + let (value%6#0: bytes, check%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 "AST1") (assert tmp%8#0) // created asset 1 is correct - let (maybe_value%9#0: bytes, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (== maybe_value%9#0 "AST2") + let (value%9#0: bytes, check%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (== value%9#0 "AST2") (assert tmp%11#0) // created asset 2 is correct itxn_begin ((itxn_field TypeEnum) appl) diff --git a/test_cases/inner_transactions/out/MyContract.ssa.ir b/test_cases/inner_transactions/out/MyContract.ssa.ir index dd0dd3c249..a293a25f6c 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.ir @@ -253,13 +253,13 @@ contract test_cases.inner_transactions.contract.MyContract: (assert tmp%4#0) // asset1_txn is correct let tmp%5#0: uint64 = (== asset2_txn%%ConfigAssetName#0 "AST2") (assert tmp%5#0) // asset2_txn is correct - let (maybe_value%6#0: bytes, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 "AST1") + let (value%6#0: bytes, check%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 "AST1") (assert tmp%8#0) // created asset 1 is correct - let (maybe_value%9#0: bytes, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (== maybe_value%9#0 "AST2") + let (value%9#0: bytes, check%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (== value%9#0 "AST2") (assert tmp%11#0) // created asset 2 is correct let app_create_params%%Accounts_length#0: uint64 = 0u let app_create_params%%Amount_length#0: uint64 = 0u diff --git a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir index fd5c0d1496..a172503573 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_1.ir @@ -66,13 +66,13 @@ contract test_cases.inner_transactions.contract.MyContract: (assert tmp%4#0) // asset1_txn is correct let tmp%5#0: uint64 = (== asset2_txn%%ConfigAssetName#0 "AST2") (assert tmp%5#0) // asset2_txn is correct - let (maybe_value%6#0: bytes, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 "AST1") + let (value%6#0: bytes, check%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 "AST1") (assert tmp%8#0) // created asset 1 is correct - let (maybe_value%9#0: bytes, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (== maybe_value%9#0 "AST2") + let (value%9#0: bytes, check%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (== value%9#0 "AST2") (assert tmp%11#0) // created asset 2 is correct itxn_begin ((itxn_field TypeEnum) appl) diff --git a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir index 77ac4df66a..602822cc6c 100644 --- a/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir +++ b/test_cases/inner_transactions/out/MyContract.ssa.opt_pass_2.ir @@ -66,13 +66,13 @@ contract test_cases.inner_transactions.contract.MyContract: (assert tmp%4#0) // asset1_txn is correct let tmp%5#0: uint64 = (== asset2_txn%%ConfigAssetName#0 "AST2") (assert tmp%5#0) // asset2_txn is correct - let (maybe_value%6#0: bytes, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 "AST1") + let (value%6#0: bytes, check%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 "AST1") (assert tmp%8#0) // created asset 1 is correct - let (maybe_value%9#0: bytes, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (== maybe_value%9#0 "AST2") + let (value%9#0: bytes, check%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (== value%9#0 "AST2") (assert tmp%11#0) // created asset 2 is correct itxn_begin ((itxn_field TypeEnum) appl) diff --git a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir index 9d9d68d467..05909d7ee9 100644 --- a/test_cases/inner_transactions/out_O2/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_O2/Greeter.destructured.ir @@ -72,9 +72,9 @@ contract test_cases.inner_transactions.c2c.Greeter: itxn_submit let hello_call%%LastLog#0: bytes = (itxn LastLog) let greeting#0: bytes = ((extract 4 0) hello_call%%LastLog#0) - let tmp%6#0: bytes = ((extract 0 4) hello_call%%LastLog#0) - let tmp%7#0: uint64 = (== tmp%6#0 0x151f7c75) - (assert tmp%7#0) // ARC4 prefix is valid + let tmp%4#0: bytes = ((extract 0 4) hello_call%%LastLog#0) + let tmp%5#0: uint64 = (== tmp%4#0 0x151f7c75) + (assert tmp%5#0) // ARC4 prefix is valid let tmp%9#0: bytes = ((extract 2 0) greeting#0) let tmp%10#0: bytes = (concat "HelloWorld returned: " tmp%9#0) (log tmp%10#0) diff --git a/test_cases/inner_transactions/out_O2/MyContract.destructured.ir b/test_cases/inner_transactions/out_O2/MyContract.destructured.ir index 930f80af5e..6fdf84f596 100644 --- a/test_cases/inner_transactions/out_O2/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out_O2/MyContract.destructured.ir @@ -66,13 +66,13 @@ contract test_cases.inner_transactions.contract.MyContract: (assert tmp%4#0) // asset1_txn is correct let tmp%5#0: uint64 = (== asset2_txn%%ConfigAssetName#0 "AST2") (assert tmp%5#0) // asset2_txn is correct - let (maybe_value%6#0: bytes, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 "AST1") + let (value%6#0: bytes, check%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 "AST1") (assert tmp%8#0) // created asset 1 is correct - let (maybe_value%9#0: bytes, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (== maybe_value%9#0 "AST2") + let (value%9#0: bytes, check%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (== value%9#0 "AST2") (assert tmp%11#0) // created asset 2 is correct itxn_begin ((itxn_field TypeEnum) appl) diff --git a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir index 5e190cdc1f..6fe4f6c7b5 100644 --- a/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/Greeter.destructured.ir @@ -91,13 +91,13 @@ contract test_cases.inner_transactions.c2c.Greeter: block@1: // next_txn_L26 itxn_submit let hello_call%%LastLog#0: bytes = (itxn LastLog) - let tmp%5#0: bytes = ((extract 4 0) hello_call%%LastLog#0) - let tmp%6#0: bytes = ((extract 0 4) hello_call%%LastLog#0) - let tmp%7#0: uint64 = (== tmp%6#0 0x151f7c75) - let maybe_value%3#0: bytes = tmp%5#0 - let maybe_value_did_exist%4#0: uint64 = tmp%7#0 - (assert maybe_value_did_exist%4#0) // ARC4 prefix is valid - let greeting#0: bytes = maybe_value%3#0 + let tmp%3#0: bytes = ((extract 4 0) hello_call%%LastLog#0) + let tmp%4#0: bytes = ((extract 0 4) hello_call%%LastLog#0) + let tmp%5#0: uint64 = (== tmp%4#0 0x151f7c75) + let value%6#0: bytes = tmp%3#0 + let check%7#0: uint64 = tmp%5#0 + (assert check%7#0) // ARC4 prefix is valid + let greeting#0: bytes = value%6#0 let tmp%8#0: bytes = (concat "HelloWorld returned: " "") let tmp%9#0: bytes = ((extract 2 0) greeting#0) let tmp%10#0: bytes = (concat tmp%8#0 tmp%9#0) diff --git a/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir b/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir index 151c66b9f9..ec6adf6801 100644 --- a/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir +++ b/test_cases/inner_transactions/out_unoptimized/MyContract.destructured.ir @@ -81,13 +81,13 @@ contract test_cases.inner_transactions.contract.MyContract: (assert tmp%4#0) // asset1_txn is correct let tmp%5#0: uint64 = (== asset2_txn%%ConfigAssetName#0 "AST2") (assert tmp%5#0) // asset2_txn is correct - let (maybe_value%6#0: bytes, maybe_value_did_exist%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%7#0) // asset exists - let tmp%8#0: uint64 = (== maybe_value%6#0 "AST1") + let (value%6#0: bytes, check%7#0: uint64) = ((asset_params_get AssetName) asset1_txn%%CreatedAssetID#0) + (assert check%7#0) // asset exists + let tmp%8#0: uint64 = (== value%6#0 "AST1") (assert tmp%8#0) // created asset 1 is correct - let (maybe_value%9#0: bytes, maybe_value_did_exist%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) - (assert maybe_value_did_exist%10#0) // asset exists - let tmp%11#0: uint64 = (== maybe_value%9#0 "AST2") + let (value%9#0: bytes, check%10#0: uint64) = ((asset_params_get AssetName) asset2_txn%%CreatedAssetID#0) + (assert check%10#0) // asset exists + let tmp%11#0: uint64 = (== value%9#0 "AST2") (assert tmp%11#0) // created asset 2 is correct let app_create_params%%param_ApprovalProgramPages_idx_0#0: bytes = 0x098101 let app_create_params%%param_ClearStateProgramPages_idx_0#0: bytes = 0x098101 diff --git a/test_cases/inner_transactions/puya.log b/test_cases/inner_transactions/puya.log index c7b4106a2e..a5a5a71cc8 100644 --- a/test_cases/inner_transactions/puya.log +++ b/test_cases/inner_transactions/puya.log @@ -1180,10 +1180,10 @@ debug: Found equivalence set: name#0, inner_txn_params%0%%param_ApplicationArgs_ debug: Replacing {inner_txn_params%0%%param_ApplicationArgs_idx_1#0} with name#0 made 1 modifications debug: Found equivalence set: hello_app_value%1#0, inner_txn_params%0%%param_ApplicationID_idx_0#0 debug: Replacing {inner_txn_params%0%%param_ApplicationID_idx_0#0} with hello_app_value%1#0 made 1 modifications -debug: Found equivalence set: tmp%5#0, maybe_value%3#0, greeting#0 -debug: Replacing {tmp%5#0, maybe_value%3#0} with greeting#0 made 1 modifications -debug: Found equivalence set: tmp%7#0, maybe_value_did_exist%4#0 -debug: Replacing {maybe_value_did_exist%4#0} with tmp%7#0 made 1 modifications +debug: Found equivalence set: tmp%3#0, value%6#0, greeting#0 +debug: Replacing {tmp%3#0, value%6#0} with greeting#0 made 1 modifications +debug: Found equivalence set: tmp%5#0, check%7#0 +debug: Replacing {check%7#0} with tmp%5#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Removing unused variable inner_txn_params%0%%Accounts_length#0 @@ -1460,10 +1460,10 @@ debug: Inserted bootstrap_block@0.ops[36]: 'store hello_app_value%5#0 to l-stack debug: Replaced bootstrap_block@0.ops[40]: 'load hello_app_value%5#0' with 'load hello_app_value%5#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[18]: 'store hello_call%%LastLog#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[20]: 'load hello_call%%LastLog#0' with 'load hello_call%%LastLog#0 from l-stack (no copy)' -debug: Inserted log_greetings_block@0.ops[25]: 'store tmp%6#0 to l-stack (copy)' -debug: Replaced log_greetings_block@0.ops[27]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' -debug: Inserted log_greetings_block@0.ops[30]: 'store tmp%7#0 to l-stack (copy)' -debug: Replaced log_greetings_block@0.ops[32]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' +debug: Inserted log_greetings_block@0.ops[25]: 'store tmp%4#0 to l-stack (copy)' +debug: Replaced log_greetings_block@0.ops[27]: 'load tmp%4#0' with 'load tmp%4#0 from l-stack (no copy)' +debug: Inserted log_greetings_block@0.ops[30]: 'store tmp%5#0 to l-stack (copy)' +debug: Replaced log_greetings_block@0.ops[32]: 'load tmp%5#0' with 'load tmp%5#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[40]: 'store tmp%10#0 to l-stack (copy)' debug: Replaced log_greetings_block@0.ops[42]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' debug: Inserted log_greetings_block@0.ops[4]: 'store hello_app_exists%2#0 to l-stack (copy)' @@ -4765,14 +4765,14 @@ debug: Inserted test1_block@0.ops[6]: 'store name_exists%1#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[9]: 'load name_exists%1#0' with 'load name_exists%1#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[43]: 'store name_exists%3#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[46]: 'load name_exists%3#0' with 'load name_exists%3#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[86]: 'store maybe_value_did_exist%7#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[89]: 'load maybe_value_did_exist%7#0' with 'load maybe_value_did_exist%7#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[100]: 'store maybe_value_did_exist%10#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[103]: 'load maybe_value_did_exist%10#0' with 'load maybe_value_did_exist%10#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[88]: 'store maybe_value%6#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[92]: 'load maybe_value%6#0' with 'load maybe_value%6#0 from l-stack (no copy)' -debug: Inserted test1_block@0.ops[103]: 'store maybe_value%9#0 to l-stack (copy)' -debug: Replaced test1_block@0.ops[107]: 'load maybe_value%9#0' with 'load maybe_value%9#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[86]: 'store check%7#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[89]: 'load check%7#0' with 'load check%7#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[100]: 'store check%10#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[103]: 'load check%10#0' with 'load check%10#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[88]: 'store value%6#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[92]: 'load value%6#0' with 'load value%6#0 from l-stack (no copy)' +debug: Inserted test1_block@0.ops[103]: 'store value%9#0 to l-stack (copy)' +debug: Replaced test1_block@0.ops[107]: 'load value%9#0' with 'load value%9#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[142]: 'store app_create_txn%%CreatedApplicationID#0 to l-stack (copy)' debug: Replaced test1_block@0.ops[146]: 'load app_create_txn%%CreatedApplicationID#0' with 'load app_create_txn%%CreatedApplicationID#0 from l-stack (no copy)' debug: Inserted test1_block@0.ops[145]: 'store asset3_txn%%ConfigAssetName#0 to l-stack (copy)' diff --git a/test_cases/transaction/out/TransactionContract.approval.mir b/test_cases/transaction/out/TransactionContract.approval.mir index 31648bd9ea..339d389caa 100644 --- a/test_cases/transaction/out/TransactionContract.approval.mir +++ b/test_cases/transaction/out/TransactionContract.approval.mir @@ -51,21 +51,21 @@ main_pay_route@2: // virtual: load tmp%7#0 from l-stack (no copy) tmp%7#0 arc4.abimethod transaction/contract.py:31 assert // is not creating // arc4.abimethod transaction/contract.py:31 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%10#0 to l-stack (no copy) tmp%10#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%10#0 from l-stack (no copy) tmp%10#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // tmp%10#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%8#0 to l-stack (no copy) tmp%8#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%8#0 from l-stack (no copy) tmp%8#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // tmp%8#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%12#0 to l-stack (no copy) awst_tmp%11#0,tmp%12#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%12#0 from l-stack (no copy) awst_tmp%11#0,tmp%12#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int pay // awst_tmp%11#0,tmp%12#0,pay class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%13#0 to l-stack (no copy) awst_tmp%11#0,tmp%13#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%13#0 from l-stack (no copy) awst_tmp%11#0,tmp%13#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is pay // awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load awst_tmp%11#0 from l-stack (no copy) awst_tmp%11#0 arc4.abimethod transaction/contract.py:31 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%10#0 to l-stack (no copy) awst_tmp%9#0,tmp%10#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%10#0 from l-stack (no copy) awst_tmp%9#0,tmp%10#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int pay // awst_tmp%9#0,tmp%10#0,pay class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%11#0 to l-stack (no copy) awst_tmp%9#0,tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%11#0 from l-stack (no copy) awst_tmp%9#0,tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is pay // awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load awst_tmp%9#0 from l-stack (no copy) awst_tmp%9#0 arc4.abimethod transaction/contract.py:31 callsub pay // arc4.abimethod transaction/contract.py:31 int 1 // 1 arc4.abimethod transaction/contract.py:31 return // arc4.abimethod transaction/contract.py:31 @@ -83,21 +83,21 @@ main_key_route@3: // virtual: load tmp%16#0 from l-stack (no copy) tmp%16#0 arc4.abimethod transaction/contract.py:40 assert // is not creating // arc4.abimethod transaction/contract.py:40 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%19#0 to l-stack (no copy) tmp%19#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%19#0 from l-stack (no copy) tmp%19#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // tmp%19#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%17#0 to l-stack (no copy) tmp%17#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%17#0 from l-stack (no copy) tmp%17#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // tmp%17#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%20#0 to l-stack (no copy) awst_tmp%11#0,tmp%20#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%20#0 from l-stack (no copy) awst_tmp%11#0,tmp%20#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int keyreg // awst_tmp%11#0,tmp%20#0,keyreg class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%21#0 to l-stack (no copy) awst_tmp%11#0,tmp%21#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%21#0 from l-stack (no copy) awst_tmp%11#0,tmp%21#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is keyreg // awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load awst_tmp%11#0 from l-stack (no copy) awst_tmp%11#0 arc4.abimethod transaction/contract.py:40 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%18#0 to l-stack (no copy) awst_tmp%9#0,tmp%18#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%18#0 from l-stack (no copy) awst_tmp%9#0,tmp%18#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int keyreg // awst_tmp%9#0,tmp%18#0,keyreg class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%19#0 to l-stack (no copy) awst_tmp%9#0,tmp%19#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%19#0 from l-stack (no copy) awst_tmp%9#0,tmp%19#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is keyreg // awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load awst_tmp%9#0 from l-stack (no copy) awst_tmp%9#0 arc4.abimethod transaction/contract.py:40 callsub key // arc4.abimethod transaction/contract.py:40 int 1 // 1 arc4.abimethod transaction/contract.py:40 return // arc4.abimethod transaction/contract.py:40 @@ -115,21 +115,21 @@ main_asset_config_route@4: // virtual: load tmp%24#0 from l-stack (no copy) tmp%24#0 arc4.abimethod transaction/contract.py:51 assert // is not creating // arc4.abimethod transaction/contract.py:51 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%27#0 to l-stack (no copy) tmp%27#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%27#0 from l-stack (no copy) tmp%27#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // tmp%27#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%25#0 to l-stack (no copy) tmp%25#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%25#0 from l-stack (no copy) tmp%25#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // tmp%25#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%28#0 to l-stack (no copy) awst_tmp%11#0,tmp%28#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%28#0 from l-stack (no copy) awst_tmp%11#0,tmp%28#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int acfg // awst_tmp%11#0,tmp%28#0,acfg class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%29#0 to l-stack (no copy) awst_tmp%11#0,tmp%29#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%29#0 from l-stack (no copy) awst_tmp%11#0,tmp%29#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is acfg // awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load awst_tmp%11#0 from l-stack (no copy) awst_tmp%11#0 arc4.abimethod transaction/contract.py:51 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%26#0 to l-stack (no copy) awst_tmp%9#0,tmp%26#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%26#0 from l-stack (no copy) awst_tmp%9#0,tmp%26#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int acfg // awst_tmp%9#0,tmp%26#0,acfg class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%27#0 to l-stack (no copy) awst_tmp%9#0,tmp%27#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%27#0 from l-stack (no copy) awst_tmp%9#0,tmp%27#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is acfg // awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load awst_tmp%9#0 from l-stack (no copy) awst_tmp%9#0 arc4.abimethod transaction/contract.py:51 callsub asset_config // arc4.abimethod transaction/contract.py:51 int 1 // 1 arc4.abimethod transaction/contract.py:51 return // arc4.abimethod transaction/contract.py:51 @@ -147,21 +147,21 @@ main_asset_transfer_route@5: // virtual: load tmp%32#0 from l-stack (no copy) tmp%32#0 arc4.abimethod transaction/contract.py:68 assert // is not creating // arc4.abimethod transaction/contract.py:68 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%35#0 to l-stack (no copy) tmp%35#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%35#0 from l-stack (no copy) tmp%35#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // tmp%35#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%33#0 to l-stack (no copy) tmp%33#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%33#0 from l-stack (no copy) tmp%33#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // tmp%33#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%36#0 to l-stack (no copy) awst_tmp%11#0,tmp%36#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%36#0 from l-stack (no copy) awst_tmp%11#0,tmp%36#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int axfer // awst_tmp%11#0,tmp%36#0,axfer class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%37#0 to l-stack (no copy) awst_tmp%11#0,tmp%37#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%37#0 from l-stack (no copy) awst_tmp%11#0,tmp%37#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is axfer // awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load awst_tmp%11#0 from l-stack (no copy) awst_tmp%11#0 arc4.abimethod transaction/contract.py:68 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%34#0 to l-stack (no copy) awst_tmp%9#0,tmp%34#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%34#0 from l-stack (no copy) awst_tmp%9#0,tmp%34#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int axfer // awst_tmp%9#0,tmp%34#0,axfer class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%35#0 to l-stack (no copy) awst_tmp%9#0,tmp%35#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%35#0 from l-stack (no copy) awst_tmp%9#0,tmp%35#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is axfer // awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load awst_tmp%9#0 from l-stack (no copy) awst_tmp%9#0 arc4.abimethod transaction/contract.py:68 callsub asset_transfer // arc4.abimethod transaction/contract.py:68 int 1 // 1 arc4.abimethod transaction/contract.py:68 return // arc4.abimethod transaction/contract.py:68 @@ -179,21 +179,21 @@ main_asset_freeze_route@6: // virtual: load tmp%40#0 from l-stack (no copy) tmp%40#0 arc4.abimethod transaction/contract.py:77 assert // is not creating // arc4.abimethod transaction/contract.py:77 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%43#0 to l-stack (no copy) tmp%43#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%43#0 from l-stack (no copy) tmp%43#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // tmp%43#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%41#0 to l-stack (no copy) tmp%41#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%41#0 from l-stack (no copy) tmp%41#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // tmp%41#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%44#0 to l-stack (no copy) awst_tmp%11#0,tmp%44#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%44#0 from l-stack (no copy) awst_tmp%11#0,tmp%44#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int afrz // awst_tmp%11#0,tmp%44#0,afrz class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%45#0 to l-stack (no copy) awst_tmp%11#0,tmp%45#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%45#0 from l-stack (no copy) awst_tmp%11#0,tmp%45#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is afrz // awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load awst_tmp%11#0 from l-stack (no copy) awst_tmp%11#0 arc4.abimethod transaction/contract.py:77 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%42#0 to l-stack (no copy) awst_tmp%9#0,tmp%42#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%42#0 from l-stack (no copy) awst_tmp%9#0,tmp%42#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int afrz // awst_tmp%9#0,tmp%42#0,afrz class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%43#0 to l-stack (no copy) awst_tmp%9#0,tmp%43#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%43#0 from l-stack (no copy) awst_tmp%9#0,tmp%43#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is afrz // awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load awst_tmp%9#0 from l-stack (no copy) awst_tmp%9#0 arc4.abimethod transaction/contract.py:77 callsub asset_freeze // arc4.abimethod transaction/contract.py:77 int 1 // 1 arc4.abimethod transaction/contract.py:77 return // arc4.abimethod transaction/contract.py:77 @@ -211,21 +211,21 @@ main_application_call_route@7: // virtual: load tmp%48#0 from l-stack (no copy) tmp%48#0 arc4.abimethod transaction/contract.py:85 assert // is not creating // arc4.abimethod transaction/contract.py:85 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%51#0 to l-stack (no copy) tmp%51#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%51#0 from l-stack (no copy) tmp%51#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // tmp%51#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%49#0 to l-stack (no copy) tmp%49#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%49#0 from l-stack (no copy) tmp%49#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // tmp%49#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%52#0 to l-stack (no copy) awst_tmp%11#0,tmp%52#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%52#0 from l-stack (no copy) awst_tmp%11#0,tmp%52#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int appl // awst_tmp%11#0,tmp%52#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%53#0 to l-stack (no copy) awst_tmp%11#0,tmp%53#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%53#0 from l-stack (no copy) awst_tmp%11#0,tmp%53#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is appl // awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load awst_tmp%11#0 from l-stack (no copy) awst_tmp%11#0 arc4.abimethod transaction/contract.py:85 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%50#0 to l-stack (no copy) awst_tmp%9#0,tmp%50#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%50#0 from l-stack (no copy) awst_tmp%9#0,tmp%50#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int appl // awst_tmp%9#0,tmp%50#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%51#0 to l-stack (no copy) awst_tmp%9#0,tmp%51#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%51#0 from l-stack (no copy) awst_tmp%9#0,tmp%51#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is appl // awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load awst_tmp%9#0 from l-stack (no copy) awst_tmp%9#0 arc4.abimethod transaction/contract.py:85 callsub application_call // arc4.abimethod transaction/contract.py:85 int 1 // 1 arc4.abimethod transaction/contract.py:85 return // arc4.abimethod transaction/contract.py:85 @@ -243,53 +243,53 @@ main_multiple_txns_route@8: // virtual: load tmp%56#0 from l-stack (no copy) tmp%56#0 arc4.abimethod transaction/contract.py:111 assert // is not creating // arc4.abimethod transaction/contract.py:111 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%59#0 to l-stack (no copy) tmp%59#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%59#0 from l-stack (no copy) tmp%59#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 3 // tmp%59#0,3 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%57#0 to l-stack (no copy) tmp%57#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%57#0 from l-stack (no copy) tmp%57#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 3 // tmp%57#0,3 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%60#0 to l-stack (no copy) awst_tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%60#0 from l-stack (copy) awst_tmp%60#0,awst_tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%60#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%61#0 to l-stack (no copy) awst_tmp%60#0,tmp%61#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%61#0 from l-stack (no copy) awst_tmp%60#0,tmp%61#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int appl // awst_tmp%60#0,tmp%61#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%60#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%62#0 to l-stack (no copy) awst_tmp%60#0,tmp%62#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%62#0 from l-stack (no copy) awst_tmp%60#0,tmp%62#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is appl // awst_tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - txn GroupIndex // awst_tmp%60#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%65#0 to l-stack (no copy) awst_tmp%60#0,tmp%65#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%65#0 from l-stack (no copy) awst_tmp%60#0,tmp%65#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 2 // awst_tmp%60#0,tmp%65#0,2 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - - // awst_tmp%60#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%66#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%66#0 from l-stack (copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%60#0,awst_tmp%66#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%67#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%67#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%67#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%67#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int appl // awst_tmp%60#0,awst_tmp%66#0,tmp%67#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%60#0,awst_tmp%66#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%68#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%68#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%68#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%68#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is appl // awst_tmp%60#0,awst_tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - txn GroupIndex // awst_tmp%60#0,awst_tmp%66#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%71#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%71#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%71#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%71#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // awst_tmp%60#0,awst_tmp%66#0,tmp%71#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - - // awst_tmp%60#0,awst_tmp%66#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%72#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%72#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%72#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%72#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int appl // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%72#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%73#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%73#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%73#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%73#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is appl // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - uncover 2 // load awst_tmp%60#0 from l-stack (no copy) awst_tmp%66#0,awst_tmp%11#0,awst_tmp%60#0 arc4.abimethod transaction/contract.py:111 - uncover 2 // load awst_tmp%66#0 from l-stack (no copy) awst_tmp%11#0,awst_tmp%60#0,awst_tmp%66#0 arc4.abimethod transaction/contract.py:111 - uncover 2 // load awst_tmp%11#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0 arc4.abimethod transaction/contract.py:111 + // virtual: store awst_tmp%58#0 to l-stack (no copy) awst_tmp%58#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%58#0 from l-stack (copy) awst_tmp%58#0,awst_tmp%58#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%58#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%59#0 to l-stack (no copy) awst_tmp%58#0,tmp%59#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%59#0 from l-stack (no copy) awst_tmp%58#0,tmp%59#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int appl // awst_tmp%58#0,tmp%59#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%58#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%60#0 to l-stack (no copy) awst_tmp%58#0,tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%60#0 from l-stack (no copy) awst_tmp%58#0,tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is appl // awst_tmp%58#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + txn GroupIndex // awst_tmp%58#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%63#0 to l-stack (no copy) awst_tmp%58#0,tmp%63#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%63#0 from l-stack (no copy) awst_tmp%58#0,tmp%63#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 2 // awst_tmp%58#0,tmp%63#0,2 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + - // awst_tmp%58#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store awst_tmp%64#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%64#0 from l-stack (copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%64#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%58#0,awst_tmp%64#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%65#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%65#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%65#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%65#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int appl // awst_tmp%58#0,awst_tmp%64#0,tmp%65#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%58#0,awst_tmp%64#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%66#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%66#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is appl // awst_tmp%58#0,awst_tmp%64#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + txn GroupIndex // awst_tmp%58#0,awst_tmp%64#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%69#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%69#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%69#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%69#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // awst_tmp%58#0,awst_tmp%64#0,tmp%69#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + - // awst_tmp%58#0,awst_tmp%64#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%70#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%70#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%70#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%70#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int appl // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%70#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%71#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%71#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%71#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%71#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is appl // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + uncover 2 // load awst_tmp%58#0 from l-stack (no copy) awst_tmp%64#0,awst_tmp%9#0,awst_tmp%58#0 arc4.abimethod transaction/contract.py:111 + uncover 2 // load awst_tmp%64#0 from l-stack (no copy) awst_tmp%9#0,awst_tmp%58#0,awst_tmp%64#0 arc4.abimethod transaction/contract.py:111 + uncover 2 // load awst_tmp%9#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0 arc4.abimethod transaction/contract.py:111 callsub multiple_txns // arc4.abimethod transaction/contract.py:111 int 1 // 1 arc4.abimethod transaction/contract.py:111 return // arc4.abimethod transaction/contract.py:111 @@ -307,53 +307,53 @@ main_any_txn_route@9: // virtual: load tmp%76#0 from l-stack (no copy) tmp%76#0 arc4.abimethod transaction/contract.py:121 assert // is not creating // arc4.abimethod transaction/contract.py:121 txn GroupIndex // {txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%79#0 to l-stack (no copy) tmp%79#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%79#0 from l-stack (no copy) tmp%79#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 3 // tmp%79#0,3 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%77#0 to l-stack (no copy) tmp%77#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%77#0 from l-stack (no copy) tmp%77#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 3 // tmp%77#0,3 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // {-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%60#0 to l-stack (no copy) awst_tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%60#0 from l-stack (copy) awst_tmp%60#0,awst_tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%60#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%80#0 to l-stack (no copy) awst_tmp%60#0,tmp%80#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%80#0 from l-stack (no copy) awst_tmp%60#0,tmp%80#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int appl // awst_tmp%60#0,tmp%80#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%60#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%81#0 to l-stack (no copy) awst_tmp%60#0,tmp%81#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%81#0 from l-stack (no copy) awst_tmp%60#0,tmp%81#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is appl // awst_tmp%60#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - txn GroupIndex // awst_tmp%60#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%84#0 to l-stack (no copy) awst_tmp%60#0,tmp%84#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%84#0 from l-stack (no copy) awst_tmp%60#0,tmp%84#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 2 // awst_tmp%60#0,tmp%84#0,2 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - - // awst_tmp%60#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%66#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%66#0 from l-stack (copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%60#0,awst_tmp%66#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%85#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%85#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%85#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%85#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int appl // awst_tmp%60#0,awst_tmp%66#0,tmp%85#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%60#0,awst_tmp%66#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%86#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%86#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%86#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%86#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is appl // awst_tmp%60#0,awst_tmp%66#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - txn GroupIndex // awst_tmp%60#0,awst_tmp%66#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%89#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%89#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%89#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,tmp%89#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int 1 // awst_tmp%60#0,awst_tmp%66#0,tmp%89#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - - // awst_tmp%60#0,awst_tmp%66#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store awst_tmp%11#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - dup // load awst_tmp%11#0 from l-stack (copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - gtxns TypeEnum // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%90#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%90#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%90#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%90#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - int appl // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%90#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - == // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: store tmp%91#0 to l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%91#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - // virtual: load tmp%91#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0,tmp%91#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - assert // transaction type is appl // awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 - uncover 2 // load awst_tmp%60#0 from l-stack (no copy) awst_tmp%66#0,awst_tmp%11#0,awst_tmp%60#0 arc4.abimethod transaction/contract.py:121 - uncover 2 // load awst_tmp%66#0 from l-stack (no copy) awst_tmp%11#0,awst_tmp%60#0,awst_tmp%66#0 arc4.abimethod transaction/contract.py:121 - uncover 2 // load awst_tmp%11#0 from l-stack (no copy) awst_tmp%60#0,awst_tmp%66#0,awst_tmp%11#0 arc4.abimethod transaction/contract.py:121 + // virtual: store awst_tmp%58#0 to l-stack (no copy) awst_tmp%58#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%58#0 from l-stack (copy) awst_tmp%58#0,awst_tmp%58#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%58#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%78#0 to l-stack (no copy) awst_tmp%58#0,tmp%78#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%78#0 from l-stack (no copy) awst_tmp%58#0,tmp%78#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int appl // awst_tmp%58#0,tmp%78#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%58#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%79#0 to l-stack (no copy) awst_tmp%58#0,tmp%79#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%79#0 from l-stack (no copy) awst_tmp%58#0,tmp%79#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is appl // awst_tmp%58#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + txn GroupIndex // awst_tmp%58#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%82#0 to l-stack (no copy) awst_tmp%58#0,tmp%82#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%82#0 from l-stack (no copy) awst_tmp%58#0,tmp%82#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 2 // awst_tmp%58#0,tmp%82#0,2 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + - // awst_tmp%58#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store awst_tmp%64#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%64#0 from l-stack (copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%64#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%58#0,awst_tmp%64#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%83#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%83#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%83#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%83#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int appl // awst_tmp%58#0,awst_tmp%64#0,tmp%83#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%58#0,awst_tmp%64#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%84#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%84#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%84#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%84#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is appl // awst_tmp%58#0,awst_tmp%64#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + txn GroupIndex // awst_tmp%58#0,awst_tmp%64#0,{txn} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%87#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%87#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%87#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,tmp%87#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int 1 // awst_tmp%58#0,awst_tmp%64#0,tmp%87#0,1 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + - // awst_tmp%58#0,awst_tmp%64#0,{-} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store awst_tmp%9#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + dup // load awst_tmp%9#0 from l-stack (copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + gtxns TypeEnum // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,{gtxns} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%88#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%88#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%88#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%88#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + int appl // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%88#0,appl class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + == // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,{==} class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: store tmp%89#0 to l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%89#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + // virtual: load tmp%89#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0,tmp%89#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + assert // transaction type is appl // awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0 class TransactionContract(arc4.ARC4Contract): transaction/contract.py:11 + uncover 2 // load awst_tmp%58#0 from l-stack (no copy) awst_tmp%64#0,awst_tmp%9#0,awst_tmp%58#0 arc4.abimethod transaction/contract.py:121 + uncover 2 // load awst_tmp%64#0 from l-stack (no copy) awst_tmp%9#0,awst_tmp%58#0,awst_tmp%64#0 arc4.abimethod transaction/contract.py:121 + uncover 2 // load awst_tmp%9#0 from l-stack (no copy) awst_tmp%58#0,awst_tmp%64#0,awst_tmp%9#0 arc4.abimethod transaction/contract.py:121 callsub any_txn // arc4.abimethod transaction/contract.py:121 int 1 // 1 arc4.abimethod transaction/contract.py:121 return // arc4.abimethod transaction/contract.py:121 diff --git a/test_cases/transaction/out/TransactionContract.destructured.ir b/test_cases/transaction/out/TransactionContract.destructured.ir index 98906739a9..606ac497ca 100644 --- a/test_cases/transaction/out/TransactionContract.destructured.ir +++ b/test_cases/transaction/out/TransactionContract.destructured.ir @@ -19,12 +19,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%6#0) // OnCompletion is NoOp let tmp%7#0: uint64 = (txn ApplicationID) (assert tmp%7#0) // is not creating - let tmp%10#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%10#0 1u) - let tmp%12#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%13#0: uint64 = (== tmp%12#0 pay) - (assert tmp%13#0) // transaction type is pay - test_cases.transaction.contract.TransactionContract.pay(awst_tmp%11#0) + let tmp%8#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%8#0 1u) + let tmp%10#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%11#0: uint64 = (== tmp%10#0 pay) + (assert tmp%11#0) // transaction type is pay + test_cases.transaction.contract.TransactionContract.pay(awst_tmp%9#0) return 1u block@3: // key_route_L40 let tmp%14#0: uint64 = (txn OnCompletion) @@ -32,12 +32,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%15#0) // OnCompletion is NoOp let tmp%16#0: uint64 = (txn ApplicationID) (assert tmp%16#0) // is not creating - let tmp%19#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%19#0 1u) - let tmp%20#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%21#0: uint64 = (== tmp%20#0 keyreg) - (assert tmp%21#0) // transaction type is keyreg - test_cases.transaction.contract.TransactionContract.key(awst_tmp%11#0) + let tmp%17#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%17#0 1u) + let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%19#0: uint64 = (== tmp%18#0 keyreg) + (assert tmp%19#0) // transaction type is keyreg + test_cases.transaction.contract.TransactionContract.key(awst_tmp%9#0) return 1u block@4: // asset_config_route_L51 let tmp%22#0: uint64 = (txn OnCompletion) @@ -45,12 +45,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%23#0) // OnCompletion is NoOp let tmp%24#0: uint64 = (txn ApplicationID) (assert tmp%24#0) // is not creating - let tmp%27#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%27#0 1u) - let tmp%28#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%29#0: uint64 = (== tmp%28#0 acfg) - (assert tmp%29#0) // transaction type is acfg - test_cases.transaction.contract.TransactionContract.asset_config(awst_tmp%11#0) + let tmp%25#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%25#0 1u) + let tmp%26#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%27#0: uint64 = (== tmp%26#0 acfg) + (assert tmp%27#0) // transaction type is acfg + test_cases.transaction.contract.TransactionContract.asset_config(awst_tmp%9#0) return 1u block@5: // asset_transfer_route_L68 let tmp%30#0: uint64 = (txn OnCompletion) @@ -58,12 +58,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%31#0) // OnCompletion is NoOp let tmp%32#0: uint64 = (txn ApplicationID) (assert tmp%32#0) // is not creating - let tmp%35#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%35#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%37#0: uint64 = (== tmp%36#0 axfer) - (assert tmp%37#0) // transaction type is axfer - test_cases.transaction.contract.TransactionContract.asset_transfer(awst_tmp%11#0) + let tmp%33#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%33#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%35#0: uint64 = (== tmp%34#0 axfer) + (assert tmp%35#0) // transaction type is axfer + test_cases.transaction.contract.TransactionContract.asset_transfer(awst_tmp%9#0) return 1u block@6: // asset_freeze_route_L77 let tmp%38#0: uint64 = (txn OnCompletion) @@ -71,12 +71,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%39#0) // OnCompletion is NoOp let tmp%40#0: uint64 = (txn ApplicationID) (assert tmp%40#0) // is not creating - let tmp%43#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%43#0 1u) - let tmp%44#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%45#0: uint64 = (== tmp%44#0 afrz) - (assert tmp%45#0) // transaction type is afrz - test_cases.transaction.contract.TransactionContract.asset_freeze(awst_tmp%11#0) + let tmp%41#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%41#0 1u) + let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%43#0: uint64 = (== tmp%42#0 afrz) + (assert tmp%43#0) // transaction type is afrz + test_cases.transaction.contract.TransactionContract.asset_freeze(awst_tmp%9#0) return 1u block@7: // application_call_route_L85 let tmp%46#0: uint64 = (txn OnCompletion) @@ -84,12 +84,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%47#0) // OnCompletion is NoOp let tmp%48#0: uint64 = (txn ApplicationID) (assert tmp%48#0) // is not creating - let tmp%51#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%51#0 1u) - let tmp%52#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%53#0: uint64 = (== tmp%52#0 appl) - (assert tmp%53#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.application_call(awst_tmp%11#0) + let tmp%49#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%49#0 1u) + let tmp%50#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%51#0: uint64 = (== tmp%50#0 appl) + (assert tmp%51#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.application_call(awst_tmp%9#0) return 1u block@8: // multiple_txns_route_L111 let tmp%54#0: uint64 = (txn OnCompletion) @@ -97,22 +97,22 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%55#0) // OnCompletion is NoOp let tmp%56#0: uint64 = (txn ApplicationID) (assert tmp%56#0) // is not creating - let tmp%59#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%59#0 3u) - let tmp%61#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%62#0: uint64 = (== tmp%61#0 appl) - (assert tmp%62#0) // transaction type is appl - let tmp%65#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%65#0 2u) - let tmp%67#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%68#0: uint64 = (== tmp%67#0 appl) - (assert tmp%68#0) // transaction type is appl - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%73#0: uint64 = (== tmp%72#0 appl) - (assert tmp%73#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.multiple_txns(awst_tmp%60#0, awst_tmp%66#0, awst_tmp%11#0) + let tmp%57#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%57#0 3u) + let tmp%59#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%60#0: uint64 = (== tmp%59#0 appl) + (assert tmp%60#0) // transaction type is appl + let tmp%63#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%63#0 2u) + let tmp%65#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%66#0: uint64 = (== tmp%65#0 appl) + (assert tmp%66#0) // transaction type is appl + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%71#0: uint64 = (== tmp%70#0 appl) + (assert tmp%71#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.multiple_txns(awst_tmp%58#0, awst_tmp%64#0, awst_tmp%9#0) return 1u block@9: // any_txn_route_L121 let tmp%74#0: uint64 = (txn OnCompletion) @@ -120,22 +120,22 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%75#0) // OnCompletion is NoOp let tmp%76#0: uint64 = (txn ApplicationID) (assert tmp%76#0) // is not creating - let tmp%79#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%79#0 3u) - let tmp%80#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%81#0: uint64 = (== tmp%80#0 appl) - (assert tmp%81#0) // transaction type is appl - let tmp%84#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%84#0 2u) - let tmp%85#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%86#0: uint64 = (== tmp%85#0 appl) - (assert tmp%86#0) // transaction type is appl - let tmp%89#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%89#0 1u) - let tmp%90#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%91#0: uint64 = (== tmp%90#0 appl) - (assert tmp%91#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.any_txn(awst_tmp%60#0, awst_tmp%66#0, awst_tmp%11#0) + let tmp%77#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%77#0 3u) + let tmp%78#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%79#0: uint64 = (== tmp%78#0 appl) + (assert tmp%79#0) // transaction type is appl + let tmp%82#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%82#0 2u) + let tmp%83#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%84#0: uint64 = (== tmp%83#0 appl) + (assert tmp%84#0) // transaction type is appl + let tmp%87#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%87#0 1u) + let tmp%88#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%89#0: uint64 = (== tmp%88#0 appl) + (assert tmp%89#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.any_txn(awst_tmp%58#0, awst_tmp%64#0, awst_tmp%9#0) return 1u subroutine test_cases.transaction.contract.TransactionContract.create() -> void: diff --git a/test_cases/transaction/out/TransactionContract.ssa.ir b/test_cases/transaction/out/TransactionContract.ssa.ir index c22c950987..e3b947157f 100644 --- a/test_cases/transaction/out/TransactionContract.ssa.ir +++ b/test_cases/transaction/out/TransactionContract.ssa.ir @@ -19,13 +19,13 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%6#0) // OnCompletion is NoOp let tmp%7#0: uint64 = (txn ApplicationID) (assert tmp%7#0) // is not creating - let tmp%10#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%10#0 1u) - let tmp%12#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%13#0: uint64 = (== tmp%12#0 pay) - let (maybe_value%8#0: uint64, maybe_value_did_exist%9#0: uint64) = (awst_tmp%11#0, tmp%13#0) - (assert maybe_value_did_exist%9#0) // transaction type is pay - test_cases.transaction.contract.TransactionContract.pay(maybe_value%8#0) + let tmp%8#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%8#0 1u) + let tmp%10#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%11#0: uint64 = (== tmp%10#0 pay) + let (value%12#0: uint64, check%13#0: uint64) = (awst_tmp%9#0, tmp%11#0) + (assert check%13#0) // transaction type is pay + test_cases.transaction.contract.TransactionContract.pay(value%12#0) return 1u block@3: // key_route_L40 let tmp%14#0: uint64 = (txn OnCompletion) @@ -33,13 +33,13 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%15#0) // OnCompletion is NoOp let tmp%16#0: uint64 = (txn ApplicationID) (assert tmp%16#0) // is not creating - let tmp%19#0: uint64 = (txn GroupIndex) - let awst_tmp%11#1: uint64 = (- tmp%19#0 1u) - let tmp%20#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#1) - let tmp%21#0: uint64 = (== tmp%20#0 keyreg) - let (maybe_value%17#0: uint64, maybe_value_did_exist%18#0: uint64) = (awst_tmp%11#1, tmp%21#0) - (assert maybe_value_did_exist%18#0) // transaction type is keyreg - test_cases.transaction.contract.TransactionContract.key(maybe_value%17#0) + let tmp%17#0: uint64 = (txn GroupIndex) + let awst_tmp%9#1: uint64 = (- tmp%17#0 1u) + let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#1) + let tmp%19#0: uint64 = (== tmp%18#0 keyreg) + let (value%20#0: uint64, check%21#0: uint64) = (awst_tmp%9#1, tmp%19#0) + (assert check%21#0) // transaction type is keyreg + test_cases.transaction.contract.TransactionContract.key(value%20#0) return 1u block@4: // asset_config_route_L51 let tmp%22#0: uint64 = (txn OnCompletion) @@ -47,13 +47,13 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%23#0) // OnCompletion is NoOp let tmp%24#0: uint64 = (txn ApplicationID) (assert tmp%24#0) // is not creating - let tmp%27#0: uint64 = (txn GroupIndex) - let awst_tmp%11#2: uint64 = (- tmp%27#0 1u) - let tmp%28#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#2) - let tmp%29#0: uint64 = (== tmp%28#0 acfg) - let (maybe_value%25#0: uint64, maybe_value_did_exist%26#0: uint64) = (awst_tmp%11#2, tmp%29#0) - (assert maybe_value_did_exist%26#0) // transaction type is acfg - test_cases.transaction.contract.TransactionContract.asset_config(maybe_value%25#0) + let tmp%25#0: uint64 = (txn GroupIndex) + let awst_tmp%9#2: uint64 = (- tmp%25#0 1u) + let tmp%26#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#2) + let tmp%27#0: uint64 = (== tmp%26#0 acfg) + let (value%28#0: uint64, check%29#0: uint64) = (awst_tmp%9#2, tmp%27#0) + (assert check%29#0) // transaction type is acfg + test_cases.transaction.contract.TransactionContract.asset_config(value%28#0) return 1u block@5: // asset_transfer_route_L68 let tmp%30#0: uint64 = (txn OnCompletion) @@ -61,13 +61,13 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%31#0) // OnCompletion is NoOp let tmp%32#0: uint64 = (txn ApplicationID) (assert tmp%32#0) // is not creating - let tmp%35#0: uint64 = (txn GroupIndex) - let awst_tmp%11#3: uint64 = (- tmp%35#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#3) - let tmp%37#0: uint64 = (== tmp%36#0 axfer) - let (maybe_value%33#0: uint64, maybe_value_did_exist%34#0: uint64) = (awst_tmp%11#3, tmp%37#0) - (assert maybe_value_did_exist%34#0) // transaction type is axfer - test_cases.transaction.contract.TransactionContract.asset_transfer(maybe_value%33#0) + let tmp%33#0: uint64 = (txn GroupIndex) + let awst_tmp%9#3: uint64 = (- tmp%33#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#3) + let tmp%35#0: uint64 = (== tmp%34#0 axfer) + let (value%36#0: uint64, check%37#0: uint64) = (awst_tmp%9#3, tmp%35#0) + (assert check%37#0) // transaction type is axfer + test_cases.transaction.contract.TransactionContract.asset_transfer(value%36#0) return 1u block@6: // asset_freeze_route_L77 let tmp%38#0: uint64 = (txn OnCompletion) @@ -75,13 +75,13 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%39#0) // OnCompletion is NoOp let tmp%40#0: uint64 = (txn ApplicationID) (assert tmp%40#0) // is not creating - let tmp%43#0: uint64 = (txn GroupIndex) - let awst_tmp%11#4: uint64 = (- tmp%43#0 1u) - let tmp%44#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#4) - let tmp%45#0: uint64 = (== tmp%44#0 afrz) - let (maybe_value%41#0: uint64, maybe_value_did_exist%42#0: uint64) = (awst_tmp%11#4, tmp%45#0) - (assert maybe_value_did_exist%42#0) // transaction type is afrz - test_cases.transaction.contract.TransactionContract.asset_freeze(maybe_value%41#0) + let tmp%41#0: uint64 = (txn GroupIndex) + let awst_tmp%9#4: uint64 = (- tmp%41#0 1u) + let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#4) + let tmp%43#0: uint64 = (== tmp%42#0 afrz) + let (value%44#0: uint64, check%45#0: uint64) = (awst_tmp%9#4, tmp%43#0) + (assert check%45#0) // transaction type is afrz + test_cases.transaction.contract.TransactionContract.asset_freeze(value%44#0) return 1u block@7: // application_call_route_L85 let tmp%46#0: uint64 = (txn OnCompletion) @@ -89,13 +89,13 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%47#0) // OnCompletion is NoOp let tmp%48#0: uint64 = (txn ApplicationID) (assert tmp%48#0) // is not creating - let tmp%51#0: uint64 = (txn GroupIndex) - let awst_tmp%11#5: uint64 = (- tmp%51#0 1u) - let tmp%52#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#5) - let tmp%53#0: uint64 = (== tmp%52#0 appl) - let (maybe_value%49#0: uint64, maybe_value_did_exist%50#0: uint64) = (awst_tmp%11#5, tmp%53#0) - (assert maybe_value_did_exist%50#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.application_call(maybe_value%49#0) + let tmp%49#0: uint64 = (txn GroupIndex) + let awst_tmp%9#5: uint64 = (- tmp%49#0 1u) + let tmp%50#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#5) + let tmp%51#0: uint64 = (== tmp%50#0 appl) + let (value%52#0: uint64, check%53#0: uint64) = (awst_tmp%9#5, tmp%51#0) + (assert check%53#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.application_call(value%52#0) return 1u block@8: // multiple_txns_route_L111 let tmp%54#0: uint64 = (txn OnCompletion) @@ -103,25 +103,25 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%55#0) // OnCompletion is NoOp let tmp%56#0: uint64 = (txn ApplicationID) (assert tmp%56#0) // is not creating - let tmp%59#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%59#0 3u) - let tmp%61#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%62#0: uint64 = (== tmp%61#0 appl) - let (maybe_value%57#0: uint64, maybe_value_did_exist%58#0: uint64) = (awst_tmp%60#0, tmp%62#0) - (assert maybe_value_did_exist%58#0) // transaction type is appl - let tmp%65#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%65#0 2u) - let tmp%67#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%68#0: uint64 = (== tmp%67#0 appl) - let (maybe_value%63#0: uint64, maybe_value_did_exist%64#0: uint64) = (awst_tmp%66#0, tmp%68#0) - (assert maybe_value_did_exist%64#0) // transaction type is appl - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%11#6: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#6) - let tmp%73#0: uint64 = (== tmp%72#0 appl) - let (maybe_value%69#0: uint64, maybe_value_did_exist%70#0: uint64) = (awst_tmp%11#6, tmp%73#0) - (assert maybe_value_did_exist%70#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.multiple_txns(maybe_value%57#0, maybe_value%63#0, maybe_value%69#0) + let tmp%57#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%57#0 3u) + let tmp%59#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%60#0: uint64 = (== tmp%59#0 appl) + let (value%61#0: uint64, check%62#0: uint64) = (awst_tmp%58#0, tmp%60#0) + (assert check%62#0) // transaction type is appl + let tmp%63#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%63#0 2u) + let tmp%65#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%66#0: uint64 = (== tmp%65#0 appl) + let (value%67#0: uint64, check%68#0: uint64) = (awst_tmp%64#0, tmp%66#0) + (assert check%68#0) // transaction type is appl + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%9#6: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#6) + let tmp%71#0: uint64 = (== tmp%70#0 appl) + let (value%72#0: uint64, check%73#0: uint64) = (awst_tmp%9#6, tmp%71#0) + (assert check%73#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.multiple_txns(value%61#0, value%67#0, value%72#0) return 1u block@9: // any_txn_route_L121 let tmp%74#0: uint64 = (txn OnCompletion) @@ -129,25 +129,25 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%75#0) // OnCompletion is NoOp let tmp%76#0: uint64 = (txn ApplicationID) (assert tmp%76#0) // is not creating - let tmp%79#0: uint64 = (txn GroupIndex) - let awst_tmp%60#1: uint64 = (- tmp%79#0 3u) - let tmp%80#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#1) - let tmp%81#0: uint64 = (== tmp%80#0 appl) - let (maybe_value%77#0: uint64, maybe_value_did_exist%78#0: uint64) = (awst_tmp%60#1, tmp%81#0) - (assert maybe_value_did_exist%78#0) // transaction type is appl - let tmp%84#0: uint64 = (txn GroupIndex) - let awst_tmp%66#1: uint64 = (- tmp%84#0 2u) - let tmp%85#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#1) - let tmp%86#0: uint64 = (== tmp%85#0 appl) - let (maybe_value%82#0: uint64, maybe_value_did_exist%83#0: uint64) = (awst_tmp%66#1, tmp%86#0) - (assert maybe_value_did_exist%83#0) // transaction type is appl - let tmp%89#0: uint64 = (txn GroupIndex) - let awst_tmp%11#7: uint64 = (- tmp%89#0 1u) - let tmp%90#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#7) - let tmp%91#0: uint64 = (== tmp%90#0 appl) - let (maybe_value%87#0: uint64, maybe_value_did_exist%88#0: uint64) = (awst_tmp%11#7, tmp%91#0) - (assert maybe_value_did_exist%88#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.any_txn(maybe_value%77#0, maybe_value%82#0, maybe_value%87#0) + let tmp%77#0: uint64 = (txn GroupIndex) + let awst_tmp%58#1: uint64 = (- tmp%77#0 3u) + let tmp%78#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#1) + let tmp%79#0: uint64 = (== tmp%78#0 appl) + let (value%80#0: uint64, check%81#0: uint64) = (awst_tmp%58#1, tmp%79#0) + (assert check%81#0) // transaction type is appl + let tmp%82#0: uint64 = (txn GroupIndex) + let awst_tmp%64#1: uint64 = (- tmp%82#0 2u) + let tmp%83#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#1) + let tmp%84#0: uint64 = (== tmp%83#0 appl) + let (value%85#0: uint64, check%86#0: uint64) = (awst_tmp%64#1, tmp%84#0) + (assert check%86#0) // transaction type is appl + let tmp%87#0: uint64 = (txn GroupIndex) + let awst_tmp%9#7: uint64 = (- tmp%87#0 1u) + let tmp%88#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#7) + let tmp%89#0: uint64 = (== tmp%88#0 appl) + let (value%90#0: uint64, check%91#0: uint64) = (awst_tmp%9#7, tmp%89#0) + (assert check%91#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.any_txn(value%80#0, value%85#0, value%90#0) return 1u block@10: // switch_case_default_L11 goto block@11 diff --git a/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir b/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir index c4f6bdd230..674c587228 100644 --- a/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir +++ b/test_cases/transaction/out/TransactionContract.ssa.opt_pass_1.ir @@ -19,12 +19,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%6#0) // OnCompletion is NoOp let tmp%7#0: uint64 = (txn ApplicationID) (assert tmp%7#0) // is not creating - let tmp%10#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%10#0 1u) - let tmp%12#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%13#0: uint64 = (== tmp%12#0 pay) - (assert tmp%13#0) // transaction type is pay - test_cases.transaction.contract.TransactionContract.pay(awst_tmp%11#0) + let tmp%8#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%8#0 1u) + let tmp%10#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%11#0: uint64 = (== tmp%10#0 pay) + (assert tmp%11#0) // transaction type is pay + test_cases.transaction.contract.TransactionContract.pay(awst_tmp%9#0) return 1u block@3: // key_route_L40 let tmp%14#0: uint64 = (txn OnCompletion) @@ -32,12 +32,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%15#0) // OnCompletion is NoOp let tmp%16#0: uint64 = (txn ApplicationID) (assert tmp%16#0) // is not creating - let tmp%19#0: uint64 = (txn GroupIndex) - let awst_tmp%11#1: uint64 = (- tmp%19#0 1u) - let tmp%20#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#1) - let tmp%21#0: uint64 = (== tmp%20#0 keyreg) - (assert tmp%21#0) // transaction type is keyreg - test_cases.transaction.contract.TransactionContract.key(awst_tmp%11#1) + let tmp%17#0: uint64 = (txn GroupIndex) + let awst_tmp%9#1: uint64 = (- tmp%17#0 1u) + let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#1) + let tmp%19#0: uint64 = (== tmp%18#0 keyreg) + (assert tmp%19#0) // transaction type is keyreg + test_cases.transaction.contract.TransactionContract.key(awst_tmp%9#1) return 1u block@4: // asset_config_route_L51 let tmp%22#0: uint64 = (txn OnCompletion) @@ -45,12 +45,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%23#0) // OnCompletion is NoOp let tmp%24#0: uint64 = (txn ApplicationID) (assert tmp%24#0) // is not creating - let tmp%27#0: uint64 = (txn GroupIndex) - let awst_tmp%11#2: uint64 = (- tmp%27#0 1u) - let tmp%28#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#2) - let tmp%29#0: uint64 = (== tmp%28#0 acfg) - (assert tmp%29#0) // transaction type is acfg - test_cases.transaction.contract.TransactionContract.asset_config(awst_tmp%11#2) + let tmp%25#0: uint64 = (txn GroupIndex) + let awst_tmp%9#2: uint64 = (- tmp%25#0 1u) + let tmp%26#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#2) + let tmp%27#0: uint64 = (== tmp%26#0 acfg) + (assert tmp%27#0) // transaction type is acfg + test_cases.transaction.contract.TransactionContract.asset_config(awst_tmp%9#2) return 1u block@5: // asset_transfer_route_L68 let tmp%30#0: uint64 = (txn OnCompletion) @@ -58,12 +58,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%31#0) // OnCompletion is NoOp let tmp%32#0: uint64 = (txn ApplicationID) (assert tmp%32#0) // is not creating - let tmp%35#0: uint64 = (txn GroupIndex) - let awst_tmp%11#3: uint64 = (- tmp%35#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#3) - let tmp%37#0: uint64 = (== tmp%36#0 axfer) - (assert tmp%37#0) // transaction type is axfer - test_cases.transaction.contract.TransactionContract.asset_transfer(awst_tmp%11#3) + let tmp%33#0: uint64 = (txn GroupIndex) + let awst_tmp%9#3: uint64 = (- tmp%33#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#3) + let tmp%35#0: uint64 = (== tmp%34#0 axfer) + (assert tmp%35#0) // transaction type is axfer + test_cases.transaction.contract.TransactionContract.asset_transfer(awst_tmp%9#3) return 1u block@6: // asset_freeze_route_L77 let tmp%38#0: uint64 = (txn OnCompletion) @@ -71,12 +71,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%39#0) // OnCompletion is NoOp let tmp%40#0: uint64 = (txn ApplicationID) (assert tmp%40#0) // is not creating - let tmp%43#0: uint64 = (txn GroupIndex) - let awst_tmp%11#4: uint64 = (- tmp%43#0 1u) - let tmp%44#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#4) - let tmp%45#0: uint64 = (== tmp%44#0 afrz) - (assert tmp%45#0) // transaction type is afrz - test_cases.transaction.contract.TransactionContract.asset_freeze(awst_tmp%11#4) + let tmp%41#0: uint64 = (txn GroupIndex) + let awst_tmp%9#4: uint64 = (- tmp%41#0 1u) + let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#4) + let tmp%43#0: uint64 = (== tmp%42#0 afrz) + (assert tmp%43#0) // transaction type is afrz + test_cases.transaction.contract.TransactionContract.asset_freeze(awst_tmp%9#4) return 1u block@7: // application_call_route_L85 let tmp%46#0: uint64 = (txn OnCompletion) @@ -84,12 +84,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%47#0) // OnCompletion is NoOp let tmp%48#0: uint64 = (txn ApplicationID) (assert tmp%48#0) // is not creating - let tmp%51#0: uint64 = (txn GroupIndex) - let awst_tmp%11#5: uint64 = (- tmp%51#0 1u) - let tmp%52#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#5) - let tmp%53#0: uint64 = (== tmp%52#0 appl) - (assert tmp%53#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.application_call(awst_tmp%11#5) + let tmp%49#0: uint64 = (txn GroupIndex) + let awst_tmp%9#5: uint64 = (- tmp%49#0 1u) + let tmp%50#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#5) + let tmp%51#0: uint64 = (== tmp%50#0 appl) + (assert tmp%51#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.application_call(awst_tmp%9#5) return 1u block@8: // multiple_txns_route_L111 let tmp%54#0: uint64 = (txn OnCompletion) @@ -97,22 +97,22 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%55#0) // OnCompletion is NoOp let tmp%56#0: uint64 = (txn ApplicationID) (assert tmp%56#0) // is not creating - let tmp%59#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%59#0 3u) - let tmp%61#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%62#0: uint64 = (== tmp%61#0 appl) - (assert tmp%62#0) // transaction type is appl - let tmp%65#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%65#0 2u) - let tmp%67#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%68#0: uint64 = (== tmp%67#0 appl) - (assert tmp%68#0) // transaction type is appl - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%11#6: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#6) - let tmp%73#0: uint64 = (== tmp%72#0 appl) - (assert tmp%73#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.multiple_txns(awst_tmp%60#0, awst_tmp%66#0, awst_tmp%11#6) + let tmp%57#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%57#0 3u) + let tmp%59#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%60#0: uint64 = (== tmp%59#0 appl) + (assert tmp%60#0) // transaction type is appl + let tmp%63#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%63#0 2u) + let tmp%65#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%66#0: uint64 = (== tmp%65#0 appl) + (assert tmp%66#0) // transaction type is appl + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%9#6: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#6) + let tmp%71#0: uint64 = (== tmp%70#0 appl) + (assert tmp%71#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.multiple_txns(awst_tmp%58#0, awst_tmp%64#0, awst_tmp%9#6) return 1u block@9: // any_txn_route_L121 let tmp%74#0: uint64 = (txn OnCompletion) @@ -120,22 +120,22 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%75#0) // OnCompletion is NoOp let tmp%76#0: uint64 = (txn ApplicationID) (assert tmp%76#0) // is not creating - let tmp%79#0: uint64 = (txn GroupIndex) - let awst_tmp%60#1: uint64 = (- tmp%79#0 3u) - let tmp%80#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#1) - let tmp%81#0: uint64 = (== tmp%80#0 appl) - (assert tmp%81#0) // transaction type is appl - let tmp%84#0: uint64 = (txn GroupIndex) - let awst_tmp%66#1: uint64 = (- tmp%84#0 2u) - let tmp%85#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#1) - let tmp%86#0: uint64 = (== tmp%85#0 appl) - (assert tmp%86#0) // transaction type is appl - let tmp%89#0: uint64 = (txn GroupIndex) - let awst_tmp%11#7: uint64 = (- tmp%89#0 1u) - let tmp%90#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#7) - let tmp%91#0: uint64 = (== tmp%90#0 appl) - (assert tmp%91#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.any_txn(awst_tmp%60#1, awst_tmp%66#1, awst_tmp%11#7) + let tmp%77#0: uint64 = (txn GroupIndex) + let awst_tmp%58#1: uint64 = (- tmp%77#0 3u) + let tmp%78#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#1) + let tmp%79#0: uint64 = (== tmp%78#0 appl) + (assert tmp%79#0) // transaction type is appl + let tmp%82#0: uint64 = (txn GroupIndex) + let awst_tmp%64#1: uint64 = (- tmp%82#0 2u) + let tmp%83#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#1) + let tmp%84#0: uint64 = (== tmp%83#0 appl) + (assert tmp%84#0) // transaction type is appl + let tmp%87#0: uint64 = (txn GroupIndex) + let awst_tmp%9#7: uint64 = (- tmp%87#0 1u) + let tmp%88#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#7) + let tmp%89#0: uint64 = (== tmp%88#0 appl) + (assert tmp%89#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.any_txn(awst_tmp%58#1, awst_tmp%64#1, awst_tmp%9#7) return 1u subroutine test_cases.transaction.contract.TransactionContract.create() -> void: diff --git a/test_cases/transaction/out_O2/TransactionContract.destructured.ir b/test_cases/transaction/out_O2/TransactionContract.destructured.ir index 98906739a9..606ac497ca 100644 --- a/test_cases/transaction/out_O2/TransactionContract.destructured.ir +++ b/test_cases/transaction/out_O2/TransactionContract.destructured.ir @@ -19,12 +19,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%6#0) // OnCompletion is NoOp let tmp%7#0: uint64 = (txn ApplicationID) (assert tmp%7#0) // is not creating - let tmp%10#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%10#0 1u) - let tmp%12#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%13#0: uint64 = (== tmp%12#0 pay) - (assert tmp%13#0) // transaction type is pay - test_cases.transaction.contract.TransactionContract.pay(awst_tmp%11#0) + let tmp%8#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%8#0 1u) + let tmp%10#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%11#0: uint64 = (== tmp%10#0 pay) + (assert tmp%11#0) // transaction type is pay + test_cases.transaction.contract.TransactionContract.pay(awst_tmp%9#0) return 1u block@3: // key_route_L40 let tmp%14#0: uint64 = (txn OnCompletion) @@ -32,12 +32,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%15#0) // OnCompletion is NoOp let tmp%16#0: uint64 = (txn ApplicationID) (assert tmp%16#0) // is not creating - let tmp%19#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%19#0 1u) - let tmp%20#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%21#0: uint64 = (== tmp%20#0 keyreg) - (assert tmp%21#0) // transaction type is keyreg - test_cases.transaction.contract.TransactionContract.key(awst_tmp%11#0) + let tmp%17#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%17#0 1u) + let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%19#0: uint64 = (== tmp%18#0 keyreg) + (assert tmp%19#0) // transaction type is keyreg + test_cases.transaction.contract.TransactionContract.key(awst_tmp%9#0) return 1u block@4: // asset_config_route_L51 let tmp%22#0: uint64 = (txn OnCompletion) @@ -45,12 +45,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%23#0) // OnCompletion is NoOp let tmp%24#0: uint64 = (txn ApplicationID) (assert tmp%24#0) // is not creating - let tmp%27#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%27#0 1u) - let tmp%28#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%29#0: uint64 = (== tmp%28#0 acfg) - (assert tmp%29#0) // transaction type is acfg - test_cases.transaction.contract.TransactionContract.asset_config(awst_tmp%11#0) + let tmp%25#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%25#0 1u) + let tmp%26#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%27#0: uint64 = (== tmp%26#0 acfg) + (assert tmp%27#0) // transaction type is acfg + test_cases.transaction.contract.TransactionContract.asset_config(awst_tmp%9#0) return 1u block@5: // asset_transfer_route_L68 let tmp%30#0: uint64 = (txn OnCompletion) @@ -58,12 +58,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%31#0) // OnCompletion is NoOp let tmp%32#0: uint64 = (txn ApplicationID) (assert tmp%32#0) // is not creating - let tmp%35#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%35#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%37#0: uint64 = (== tmp%36#0 axfer) - (assert tmp%37#0) // transaction type is axfer - test_cases.transaction.contract.TransactionContract.asset_transfer(awst_tmp%11#0) + let tmp%33#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%33#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%35#0: uint64 = (== tmp%34#0 axfer) + (assert tmp%35#0) // transaction type is axfer + test_cases.transaction.contract.TransactionContract.asset_transfer(awst_tmp%9#0) return 1u block@6: // asset_freeze_route_L77 let tmp%38#0: uint64 = (txn OnCompletion) @@ -71,12 +71,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%39#0) // OnCompletion is NoOp let tmp%40#0: uint64 = (txn ApplicationID) (assert tmp%40#0) // is not creating - let tmp%43#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%43#0 1u) - let tmp%44#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%45#0: uint64 = (== tmp%44#0 afrz) - (assert tmp%45#0) // transaction type is afrz - test_cases.transaction.contract.TransactionContract.asset_freeze(awst_tmp%11#0) + let tmp%41#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%41#0 1u) + let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%43#0: uint64 = (== tmp%42#0 afrz) + (assert tmp%43#0) // transaction type is afrz + test_cases.transaction.contract.TransactionContract.asset_freeze(awst_tmp%9#0) return 1u block@7: // application_call_route_L85 let tmp%46#0: uint64 = (txn OnCompletion) @@ -84,12 +84,12 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%47#0) // OnCompletion is NoOp let tmp%48#0: uint64 = (txn ApplicationID) (assert tmp%48#0) // is not creating - let tmp%51#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%51#0 1u) - let tmp%52#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%53#0: uint64 = (== tmp%52#0 appl) - (assert tmp%53#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.application_call(awst_tmp%11#0) + let tmp%49#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%49#0 1u) + let tmp%50#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%51#0: uint64 = (== tmp%50#0 appl) + (assert tmp%51#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.application_call(awst_tmp%9#0) return 1u block@8: // multiple_txns_route_L111 let tmp%54#0: uint64 = (txn OnCompletion) @@ -97,22 +97,22 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%55#0) // OnCompletion is NoOp let tmp%56#0: uint64 = (txn ApplicationID) (assert tmp%56#0) // is not creating - let tmp%59#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%59#0 3u) - let tmp%61#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%62#0: uint64 = (== tmp%61#0 appl) - (assert tmp%62#0) // transaction type is appl - let tmp%65#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%65#0 2u) - let tmp%67#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%68#0: uint64 = (== tmp%67#0 appl) - (assert tmp%68#0) // transaction type is appl - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%73#0: uint64 = (== tmp%72#0 appl) - (assert tmp%73#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.multiple_txns(awst_tmp%60#0, awst_tmp%66#0, awst_tmp%11#0) + let tmp%57#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%57#0 3u) + let tmp%59#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%60#0: uint64 = (== tmp%59#0 appl) + (assert tmp%60#0) // transaction type is appl + let tmp%63#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%63#0 2u) + let tmp%65#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%66#0: uint64 = (== tmp%65#0 appl) + (assert tmp%66#0) // transaction type is appl + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%71#0: uint64 = (== tmp%70#0 appl) + (assert tmp%71#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.multiple_txns(awst_tmp%58#0, awst_tmp%64#0, awst_tmp%9#0) return 1u block@9: // any_txn_route_L121 let tmp%74#0: uint64 = (txn OnCompletion) @@ -120,22 +120,22 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%75#0) // OnCompletion is NoOp let tmp%76#0: uint64 = (txn ApplicationID) (assert tmp%76#0) // is not creating - let tmp%79#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%79#0 3u) - let tmp%80#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%81#0: uint64 = (== tmp%80#0 appl) - (assert tmp%81#0) // transaction type is appl - let tmp%84#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%84#0 2u) - let tmp%85#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%86#0: uint64 = (== tmp%85#0 appl) - (assert tmp%86#0) // transaction type is appl - let tmp%89#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%89#0 1u) - let tmp%90#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%91#0: uint64 = (== tmp%90#0 appl) - (assert tmp%91#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.any_txn(awst_tmp%60#0, awst_tmp%66#0, awst_tmp%11#0) + let tmp%77#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%77#0 3u) + let tmp%78#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%79#0: uint64 = (== tmp%78#0 appl) + (assert tmp%79#0) // transaction type is appl + let tmp%82#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%82#0 2u) + let tmp%83#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%84#0: uint64 = (== tmp%83#0 appl) + (assert tmp%84#0) // transaction type is appl + let tmp%87#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%87#0 1u) + let tmp%88#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%89#0: uint64 = (== tmp%88#0 appl) + (assert tmp%89#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.any_txn(awst_tmp%58#0, awst_tmp%64#0, awst_tmp%9#0) return 1u subroutine test_cases.transaction.contract.TransactionContract.create() -> void: diff --git a/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir b/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir index d6ad579197..5ed44f9e07 100644 --- a/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir +++ b/test_cases/transaction/out_unoptimized/TransactionContract.destructured.ir @@ -19,14 +19,14 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%6#0) // OnCompletion is NoOp let tmp%7#0: uint64 = (txn ApplicationID) (assert tmp%7#0) // is not creating - let tmp%10#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%10#0 1u) - let tmp%12#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%13#0: uint64 = (== tmp%12#0 pay) - let maybe_value%8#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%9#0: uint64 = tmp%13#0 - (assert maybe_value_did_exist%9#0) // transaction type is pay - test_cases.transaction.contract.TransactionContract.pay(maybe_value%8#0) + let tmp%8#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%8#0 1u) + let tmp%10#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%11#0: uint64 = (== tmp%10#0 pay) + let value%12#0: uint64 = awst_tmp%9#0 + let check%13#0: uint64 = tmp%11#0 + (assert check%13#0) // transaction type is pay + test_cases.transaction.contract.TransactionContract.pay(value%12#0) return 1u block@3: // key_route_L40 let tmp%14#0: uint64 = (txn OnCompletion) @@ -34,14 +34,14 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%15#0) // OnCompletion is NoOp let tmp%16#0: uint64 = (txn ApplicationID) (assert tmp%16#0) // is not creating - let tmp%19#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%19#0 1u) - let tmp%20#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%21#0: uint64 = (== tmp%20#0 keyreg) - let maybe_value%17#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%18#0: uint64 = tmp%21#0 - (assert maybe_value_did_exist%18#0) // transaction type is keyreg - test_cases.transaction.contract.TransactionContract.key(maybe_value%17#0) + let tmp%17#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%17#0 1u) + let tmp%18#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%19#0: uint64 = (== tmp%18#0 keyreg) + let value%20#0: uint64 = awst_tmp%9#0 + let check%21#0: uint64 = tmp%19#0 + (assert check%21#0) // transaction type is keyreg + test_cases.transaction.contract.TransactionContract.key(value%20#0) return 1u block@4: // asset_config_route_L51 let tmp%22#0: uint64 = (txn OnCompletion) @@ -49,14 +49,14 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%23#0) // OnCompletion is NoOp let tmp%24#0: uint64 = (txn ApplicationID) (assert tmp%24#0) // is not creating - let tmp%27#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%27#0 1u) - let tmp%28#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%29#0: uint64 = (== tmp%28#0 acfg) - let maybe_value%25#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%26#0: uint64 = tmp%29#0 - (assert maybe_value_did_exist%26#0) // transaction type is acfg - test_cases.transaction.contract.TransactionContract.asset_config(maybe_value%25#0) + let tmp%25#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%25#0 1u) + let tmp%26#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%27#0: uint64 = (== tmp%26#0 acfg) + let value%28#0: uint64 = awst_tmp%9#0 + let check%29#0: uint64 = tmp%27#0 + (assert check%29#0) // transaction type is acfg + test_cases.transaction.contract.TransactionContract.asset_config(value%28#0) return 1u block@5: // asset_transfer_route_L68 let tmp%30#0: uint64 = (txn OnCompletion) @@ -64,14 +64,14 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%31#0) // OnCompletion is NoOp let tmp%32#0: uint64 = (txn ApplicationID) (assert tmp%32#0) // is not creating - let tmp%35#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%35#0 1u) - let tmp%36#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%37#0: uint64 = (== tmp%36#0 axfer) - let maybe_value%33#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%34#0: uint64 = tmp%37#0 - (assert maybe_value_did_exist%34#0) // transaction type is axfer - test_cases.transaction.contract.TransactionContract.asset_transfer(maybe_value%33#0) + let tmp%33#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%33#0 1u) + let tmp%34#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%35#0: uint64 = (== tmp%34#0 axfer) + let value%36#0: uint64 = awst_tmp%9#0 + let check%37#0: uint64 = tmp%35#0 + (assert check%37#0) // transaction type is axfer + test_cases.transaction.contract.TransactionContract.asset_transfer(value%36#0) return 1u block@6: // asset_freeze_route_L77 let tmp%38#0: uint64 = (txn OnCompletion) @@ -79,14 +79,14 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%39#0) // OnCompletion is NoOp let tmp%40#0: uint64 = (txn ApplicationID) (assert tmp%40#0) // is not creating - let tmp%43#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%43#0 1u) - let tmp%44#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%45#0: uint64 = (== tmp%44#0 afrz) - let maybe_value%41#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%42#0: uint64 = tmp%45#0 - (assert maybe_value_did_exist%42#0) // transaction type is afrz - test_cases.transaction.contract.TransactionContract.asset_freeze(maybe_value%41#0) + let tmp%41#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%41#0 1u) + let tmp%42#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%43#0: uint64 = (== tmp%42#0 afrz) + let value%44#0: uint64 = awst_tmp%9#0 + let check%45#0: uint64 = tmp%43#0 + (assert check%45#0) // transaction type is afrz + test_cases.transaction.contract.TransactionContract.asset_freeze(value%44#0) return 1u block@7: // application_call_route_L85 let tmp%46#0: uint64 = (txn OnCompletion) @@ -94,14 +94,14 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%47#0) // OnCompletion is NoOp let tmp%48#0: uint64 = (txn ApplicationID) (assert tmp%48#0) // is not creating - let tmp%51#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%51#0 1u) - let tmp%52#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%53#0: uint64 = (== tmp%52#0 appl) - let maybe_value%49#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%50#0: uint64 = tmp%53#0 - (assert maybe_value_did_exist%50#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.application_call(maybe_value%49#0) + let tmp%49#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%49#0 1u) + let tmp%50#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%51#0: uint64 = (== tmp%50#0 appl) + let value%52#0: uint64 = awst_tmp%9#0 + let check%53#0: uint64 = tmp%51#0 + (assert check%53#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.application_call(value%52#0) return 1u block@8: // multiple_txns_route_L111 let tmp%54#0: uint64 = (txn OnCompletion) @@ -109,28 +109,28 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%55#0) // OnCompletion is NoOp let tmp%56#0: uint64 = (txn ApplicationID) (assert tmp%56#0) // is not creating - let tmp%59#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%59#0 3u) - let tmp%61#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%62#0: uint64 = (== tmp%61#0 appl) - let maybe_value%57#0: uint64 = awst_tmp%60#0 - let maybe_value_did_exist%58#0: uint64 = tmp%62#0 - (assert maybe_value_did_exist%58#0) // transaction type is appl - let tmp%65#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%65#0 2u) - let tmp%67#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%68#0: uint64 = (== tmp%67#0 appl) - let maybe_value%63#0: uint64 = awst_tmp%66#0 - let maybe_value_did_exist%64#0: uint64 = tmp%68#0 - (assert maybe_value_did_exist%64#0) // transaction type is appl - let tmp%71#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%71#0 1u) - let tmp%72#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%73#0: uint64 = (== tmp%72#0 appl) - let maybe_value%69#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%70#0: uint64 = tmp%73#0 - (assert maybe_value_did_exist%70#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.multiple_txns(maybe_value%57#0, maybe_value%63#0, maybe_value%69#0) + let tmp%57#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%57#0 3u) + let tmp%59#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%60#0: uint64 = (== tmp%59#0 appl) + let value%61#0: uint64 = awst_tmp%58#0 + let check%62#0: uint64 = tmp%60#0 + (assert check%62#0) // transaction type is appl + let tmp%63#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%63#0 2u) + let tmp%65#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%66#0: uint64 = (== tmp%65#0 appl) + let value%67#0: uint64 = awst_tmp%64#0 + let check%68#0: uint64 = tmp%66#0 + (assert check%68#0) // transaction type is appl + let tmp%69#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%69#0 1u) + let tmp%70#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%71#0: uint64 = (== tmp%70#0 appl) + let value%72#0: uint64 = awst_tmp%9#0 + let check%73#0: uint64 = tmp%71#0 + (assert check%73#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.multiple_txns(value%61#0, value%67#0, value%72#0) return 1u block@9: // any_txn_route_L121 let tmp%74#0: uint64 = (txn OnCompletion) @@ -138,28 +138,28 @@ contract test_cases.transaction.contract.TransactionContract: (assert tmp%75#0) // OnCompletion is NoOp let tmp%76#0: uint64 = (txn ApplicationID) (assert tmp%76#0) // is not creating - let tmp%79#0: uint64 = (txn GroupIndex) - let awst_tmp%60#0: uint64 = (- tmp%79#0 3u) - let tmp%80#0: uint64 = ((gtxns TypeEnum) awst_tmp%60#0) - let tmp%81#0: uint64 = (== tmp%80#0 appl) - let maybe_value%77#0: uint64 = awst_tmp%60#0 - let maybe_value_did_exist%78#0: uint64 = tmp%81#0 - (assert maybe_value_did_exist%78#0) // transaction type is appl - let tmp%84#0: uint64 = (txn GroupIndex) - let awst_tmp%66#0: uint64 = (- tmp%84#0 2u) - let tmp%85#0: uint64 = ((gtxns TypeEnum) awst_tmp%66#0) - let tmp%86#0: uint64 = (== tmp%85#0 appl) - let maybe_value%82#0: uint64 = awst_tmp%66#0 - let maybe_value_did_exist%83#0: uint64 = tmp%86#0 - (assert maybe_value_did_exist%83#0) // transaction type is appl - let tmp%89#0: uint64 = (txn GroupIndex) - let awst_tmp%11#0: uint64 = (- tmp%89#0 1u) - let tmp%90#0: uint64 = ((gtxns TypeEnum) awst_tmp%11#0) - let tmp%91#0: uint64 = (== tmp%90#0 appl) - let maybe_value%87#0: uint64 = awst_tmp%11#0 - let maybe_value_did_exist%88#0: uint64 = tmp%91#0 - (assert maybe_value_did_exist%88#0) // transaction type is appl - test_cases.transaction.contract.TransactionContract.any_txn(maybe_value%77#0, maybe_value%82#0, maybe_value%87#0) + let tmp%77#0: uint64 = (txn GroupIndex) + let awst_tmp%58#0: uint64 = (- tmp%77#0 3u) + let tmp%78#0: uint64 = ((gtxns TypeEnum) awst_tmp%58#0) + let tmp%79#0: uint64 = (== tmp%78#0 appl) + let value%80#0: uint64 = awst_tmp%58#0 + let check%81#0: uint64 = tmp%79#0 + (assert check%81#0) // transaction type is appl + let tmp%82#0: uint64 = (txn GroupIndex) + let awst_tmp%64#0: uint64 = (- tmp%82#0 2u) + let tmp%83#0: uint64 = ((gtxns TypeEnum) awst_tmp%64#0) + let tmp%84#0: uint64 = (== tmp%83#0 appl) + let value%85#0: uint64 = awst_tmp%64#0 + let check%86#0: uint64 = tmp%84#0 + (assert check%86#0) // transaction type is appl + let tmp%87#0: uint64 = (txn GroupIndex) + let awst_tmp%9#0: uint64 = (- tmp%87#0 1u) + let tmp%88#0: uint64 = ((gtxns TypeEnum) awst_tmp%9#0) + let tmp%89#0: uint64 = (== tmp%88#0 appl) + let value%90#0: uint64 = awst_tmp%9#0 + let check%91#0: uint64 = tmp%89#0 + (assert check%91#0) // transaction type is appl + test_cases.transaction.contract.TransactionContract.any_txn(value%80#0, value%85#0, value%90#0) return 1u block@10: // switch_case_default_L11 goto block@11 diff --git a/test_cases/transaction/puya.log b/test_cases/transaction/puya.log index 44eb8d9413..42ad5e074b 100644 --- a/test_cases/transaction/puya.log +++ b/test_cases/transaction/puya.log @@ -403,54 +403,54 @@ debug: Splitting parallel copies prior to optimization debug: Optimizer: Arithmetic Simplification debug: Optimizer: Constant Replacer debug: Optimizer: Copy Propagation -debug: Found equivalence set: awst_tmp%11#0, maybe_value%8#0 -debug: Replacing {maybe_value%8#0} with awst_tmp%11#0 made 1 modifications -debug: Found equivalence set: tmp%13#0, maybe_value_did_exist%9#0 -debug: Replacing {maybe_value_did_exist%9#0} with tmp%13#0 made 1 modifications -debug: Found equivalence set: awst_tmp%11#1, maybe_value%17#0 -debug: Replacing {maybe_value%17#0} with awst_tmp%11#1 made 1 modifications -debug: Found equivalence set: tmp%21#0, maybe_value_did_exist%18#0 -debug: Replacing {maybe_value_did_exist%18#0} with tmp%21#0 made 1 modifications -debug: Found equivalence set: awst_tmp%11#2, maybe_value%25#0 -debug: Replacing {maybe_value%25#0} with awst_tmp%11#2 made 1 modifications -debug: Found equivalence set: tmp%29#0, maybe_value_did_exist%26#0 -debug: Replacing {maybe_value_did_exist%26#0} with tmp%29#0 made 1 modifications -debug: Found equivalence set: awst_tmp%11#3, maybe_value%33#0 -debug: Replacing {maybe_value%33#0} with awst_tmp%11#3 made 1 modifications -debug: Found equivalence set: tmp%37#0, maybe_value_did_exist%34#0 -debug: Replacing {maybe_value_did_exist%34#0} with tmp%37#0 made 1 modifications -debug: Found equivalence set: awst_tmp%11#4, maybe_value%41#0 -debug: Replacing {maybe_value%41#0} with awst_tmp%11#4 made 1 modifications -debug: Found equivalence set: tmp%45#0, maybe_value_did_exist%42#0 -debug: Replacing {maybe_value_did_exist%42#0} with tmp%45#0 made 1 modifications -debug: Found equivalence set: awst_tmp%11#5, maybe_value%49#0 -debug: Replacing {maybe_value%49#0} with awst_tmp%11#5 made 1 modifications -debug: Found equivalence set: tmp%53#0, maybe_value_did_exist%50#0 -debug: Replacing {maybe_value_did_exist%50#0} with tmp%53#0 made 1 modifications -debug: Found equivalence set: awst_tmp%60#0, maybe_value%57#0 -debug: Replacing {maybe_value%57#0} with awst_tmp%60#0 made 1 modifications -debug: Found equivalence set: tmp%62#0, maybe_value_did_exist%58#0 -debug: Replacing {maybe_value_did_exist%58#0} with tmp%62#0 made 1 modifications -debug: Found equivalence set: awst_tmp%66#0, maybe_value%63#0 -debug: Replacing {maybe_value%63#0} with awst_tmp%66#0 made 1 modifications -debug: Found equivalence set: tmp%68#0, maybe_value_did_exist%64#0 -debug: Replacing {maybe_value_did_exist%64#0} with tmp%68#0 made 1 modifications -debug: Found equivalence set: awst_tmp%11#6, maybe_value%69#0 -debug: Replacing {maybe_value%69#0} with awst_tmp%11#6 made 1 modifications -debug: Found equivalence set: tmp%73#0, maybe_value_did_exist%70#0 -debug: Replacing {maybe_value_did_exist%70#0} with tmp%73#0 made 1 modifications -debug: Found equivalence set: awst_tmp%60#1, maybe_value%77#0 -debug: Replacing {maybe_value%77#0} with awst_tmp%60#1 made 1 modifications -debug: Found equivalence set: tmp%81#0, maybe_value_did_exist%78#0 -debug: Replacing {maybe_value_did_exist%78#0} with tmp%81#0 made 1 modifications -debug: Found equivalence set: awst_tmp%66#1, maybe_value%82#0 -debug: Replacing {maybe_value%82#0} with awst_tmp%66#1 made 1 modifications -debug: Found equivalence set: tmp%86#0, maybe_value_did_exist%83#0 -debug: Replacing {maybe_value_did_exist%83#0} with tmp%86#0 made 1 modifications -debug: Found equivalence set: awst_tmp%11#7, maybe_value%87#0 -debug: Replacing {maybe_value%87#0} with awst_tmp%11#7 made 1 modifications -debug: Found equivalence set: tmp%91#0, maybe_value_did_exist%88#0 -debug: Replacing {maybe_value_did_exist%88#0} with tmp%91#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#0, value%12#0 +debug: Replacing {value%12#0} with awst_tmp%9#0 made 1 modifications +debug: Found equivalence set: tmp%11#0, check%13#0 +debug: Replacing {check%13#0} with tmp%11#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#1, value%20#0 +debug: Replacing {value%20#0} with awst_tmp%9#1 made 1 modifications +debug: Found equivalence set: tmp%19#0, check%21#0 +debug: Replacing {check%21#0} with tmp%19#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#2, value%28#0 +debug: Replacing {value%28#0} with awst_tmp%9#2 made 1 modifications +debug: Found equivalence set: tmp%27#0, check%29#0 +debug: Replacing {check%29#0} with tmp%27#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#3, value%36#0 +debug: Replacing {value%36#0} with awst_tmp%9#3 made 1 modifications +debug: Found equivalence set: tmp%35#0, check%37#0 +debug: Replacing {check%37#0} with tmp%35#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#4, value%44#0 +debug: Replacing {value%44#0} with awst_tmp%9#4 made 1 modifications +debug: Found equivalence set: tmp%43#0, check%45#0 +debug: Replacing {check%45#0} with tmp%43#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#5, value%52#0 +debug: Replacing {value%52#0} with awst_tmp%9#5 made 1 modifications +debug: Found equivalence set: tmp%51#0, check%53#0 +debug: Replacing {check%53#0} with tmp%51#0 made 1 modifications +debug: Found equivalence set: awst_tmp%58#0, value%61#0 +debug: Replacing {value%61#0} with awst_tmp%58#0 made 1 modifications +debug: Found equivalence set: tmp%60#0, check%62#0 +debug: Replacing {check%62#0} with tmp%60#0 made 1 modifications +debug: Found equivalence set: awst_tmp%64#0, value%67#0 +debug: Replacing {value%67#0} with awst_tmp%64#0 made 1 modifications +debug: Found equivalence set: tmp%66#0, check%68#0 +debug: Replacing {check%68#0} with tmp%66#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#6, value%72#0 +debug: Replacing {value%72#0} with awst_tmp%9#6 made 1 modifications +debug: Found equivalence set: tmp%71#0, check%73#0 +debug: Replacing {check%73#0} with tmp%71#0 made 1 modifications +debug: Found equivalence set: awst_tmp%58#1, value%80#0 +debug: Replacing {value%80#0} with awst_tmp%58#1 made 1 modifications +debug: Found equivalence set: tmp%79#0, check%81#0 +debug: Replacing {check%81#0} with tmp%79#0 made 1 modifications +debug: Found equivalence set: awst_tmp%64#1, value%85#0 +debug: Replacing {value%85#0} with awst_tmp%64#1 made 1 modifications +debug: Found equivalence set: tmp%84#0, check%86#0 +debug: Replacing {check%86#0} with tmp%84#0 made 1 modifications +debug: Found equivalence set: awst_tmp%9#7, value%90#0 +debug: Replacing {value%90#0} with awst_tmp%9#7 made 1 modifications +debug: Found equivalence set: tmp%89#0, check%91#0 +debug: Replacing {check%91#0} with tmp%89#0 made 1 modifications debug: Optimizer: Intrinsic Simplifier debug: Optimizer: Remove Unused Variables debug: Optimizer: Simplify Control Ops @@ -774,9 +774,9 @@ debug: Removing Phis from test_cases.transaction.contract.TransactionContract.mu debug: Removing Phis from test_cases.transaction.contract.TransactionContract.any_txn debug: Removing Phis from test_cases.transaction.contract.TransactionContract.clear_state_program debug: Coalescing local variables in test_cases.transaction.contract.TransactionContract.approval_program using strategy RootOperandGrouping -debug: Coalescing awst_tmp%11#0 with [awst_tmp%11#1, awst_tmp%11#2, awst_tmp%11#3, awst_tmp%11#4, awst_tmp%11#5, awst_tmp%11#6, awst_tmp%11#7] -debug: Coalescing awst_tmp%60#0 with [awst_tmp%60#1] -debug: Coalescing awst_tmp%66#0 with [awst_tmp%66#1] +debug: Coalescing awst_tmp%9#0 with [awst_tmp%9#1, awst_tmp%9#2, awst_tmp%9#3, awst_tmp%9#4, awst_tmp%9#5, awst_tmp%9#6, awst_tmp%9#7] +debug: Coalescing awst_tmp%58#0 with [awst_tmp%58#1] +debug: Coalescing awst_tmp%64#0 with [awst_tmp%64#1] debug: Coalescing resulted in 27 replacement/s debug: Coalescing local variables in test_cases.transaction.contract.TransactionContract.create using strategy RootOperandGrouping debug: Coalescing resulted in 0 replacement/s @@ -902,168 +902,168 @@ debug: Inserted main_pay_route@2.ops[5]: 'store tmp%6#0 to l-stack (copy)' debug: Replaced main_pay_route@2.ops[7]: 'load tmp%6#0' with 'load tmp%6#0 from l-stack (no copy)' debug: Inserted main_pay_route@2.ops[10]: 'store tmp%7#0 to l-stack (copy)' debug: Replaced main_pay_route@2.ops[12]: 'load tmp%7#0' with 'load tmp%7#0 from l-stack (no copy)' -debug: Inserted main_pay_route@2.ops[15]: 'store tmp%10#0 to l-stack (copy)' -debug: Replaced main_pay_route@2.ops[17]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' -debug: Inserted main_pay_route@2.ops[20]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_pay_route@2.ops[22]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_pay_route@2.ops[24]: 'store tmp%12#0 to l-stack (copy)' -debug: Replaced main_pay_route@2.ops[26]: 'load tmp%12#0' with 'load tmp%12#0 from l-stack (no copy)' -debug: Inserted main_pay_route@2.ops[29]: 'store tmp%13#0 to l-stack (copy)' -debug: Replaced main_pay_route@2.ops[31]: 'load tmp%13#0' with 'load tmp%13#0 from l-stack (no copy)' -debug: Inserted main_pay_route@2.ops[23]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_pay_route@2.ops[34]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' +debug: Inserted main_pay_route@2.ops[15]: 'store tmp%8#0 to l-stack (copy)' +debug: Replaced main_pay_route@2.ops[17]: 'load tmp%8#0' with 'load tmp%8#0 from l-stack (no copy)' +debug: Inserted main_pay_route@2.ops[20]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_pay_route@2.ops[22]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_pay_route@2.ops[24]: 'store tmp%10#0 to l-stack (copy)' +debug: Replaced main_pay_route@2.ops[26]: 'load tmp%10#0' with 'load tmp%10#0 from l-stack (no copy)' +debug: Inserted main_pay_route@2.ops[29]: 'store tmp%11#0 to l-stack (copy)' +debug: Replaced main_pay_route@2.ops[31]: 'load tmp%11#0' with 'load tmp%11#0 from l-stack (no copy)' +debug: Inserted main_pay_route@2.ops[23]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_pay_route@2.ops[34]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' debug: Inserted main_key_route@3.ops[1]: 'store tmp%14#0 to l-stack (copy)' debug: Replaced main_key_route@3.ops[3]: 'load tmp%14#0' with 'load tmp%14#0 from l-stack (no copy)' debug: Inserted main_key_route@3.ops[5]: 'store tmp%15#0 to l-stack (copy)' debug: Replaced main_key_route@3.ops[7]: 'load tmp%15#0' with 'load tmp%15#0 from l-stack (no copy)' debug: Inserted main_key_route@3.ops[10]: 'store tmp%16#0 to l-stack (copy)' debug: Replaced main_key_route@3.ops[12]: 'load tmp%16#0' with 'load tmp%16#0 from l-stack (no copy)' -debug: Inserted main_key_route@3.ops[15]: 'store tmp%19#0 to l-stack (copy)' -debug: Replaced main_key_route@3.ops[17]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' -debug: Inserted main_key_route@3.ops[20]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_key_route@3.ops[22]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_key_route@3.ops[24]: 'store tmp%20#0 to l-stack (copy)' -debug: Replaced main_key_route@3.ops[26]: 'load tmp%20#0' with 'load tmp%20#0 from l-stack (no copy)' -debug: Inserted main_key_route@3.ops[29]: 'store tmp%21#0 to l-stack (copy)' -debug: Replaced main_key_route@3.ops[31]: 'load tmp%21#0' with 'load tmp%21#0 from l-stack (no copy)' -debug: Inserted main_key_route@3.ops[23]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_key_route@3.ops[34]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' +debug: Inserted main_key_route@3.ops[15]: 'store tmp%17#0 to l-stack (copy)' +debug: Replaced main_key_route@3.ops[17]: 'load tmp%17#0' with 'load tmp%17#0 from l-stack (no copy)' +debug: Inserted main_key_route@3.ops[20]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_key_route@3.ops[22]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_key_route@3.ops[24]: 'store tmp%18#0 to l-stack (copy)' +debug: Replaced main_key_route@3.ops[26]: 'load tmp%18#0' with 'load tmp%18#0 from l-stack (no copy)' +debug: Inserted main_key_route@3.ops[29]: 'store tmp%19#0 to l-stack (copy)' +debug: Replaced main_key_route@3.ops[31]: 'load tmp%19#0' with 'load tmp%19#0 from l-stack (no copy)' +debug: Inserted main_key_route@3.ops[23]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_key_route@3.ops[34]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' debug: Inserted main_asset_config_route@4.ops[1]: 'store tmp%22#0 to l-stack (copy)' debug: Replaced main_asset_config_route@4.ops[3]: 'load tmp%22#0' with 'load tmp%22#0 from l-stack (no copy)' debug: Inserted main_asset_config_route@4.ops[5]: 'store tmp%23#0 to l-stack (copy)' debug: Replaced main_asset_config_route@4.ops[7]: 'load tmp%23#0' with 'load tmp%23#0 from l-stack (no copy)' debug: Inserted main_asset_config_route@4.ops[10]: 'store tmp%24#0 to l-stack (copy)' debug: Replaced main_asset_config_route@4.ops[12]: 'load tmp%24#0' with 'load tmp%24#0 from l-stack (no copy)' -debug: Inserted main_asset_config_route@4.ops[15]: 'store tmp%27#0 to l-stack (copy)' -debug: Replaced main_asset_config_route@4.ops[17]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' -debug: Inserted main_asset_config_route@4.ops[20]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_asset_config_route@4.ops[22]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_asset_config_route@4.ops[24]: 'store tmp%28#0 to l-stack (copy)' -debug: Replaced main_asset_config_route@4.ops[26]: 'load tmp%28#0' with 'load tmp%28#0 from l-stack (no copy)' -debug: Inserted main_asset_config_route@4.ops[29]: 'store tmp%29#0 to l-stack (copy)' -debug: Replaced main_asset_config_route@4.ops[31]: 'load tmp%29#0' with 'load tmp%29#0 from l-stack (no copy)' -debug: Inserted main_asset_config_route@4.ops[23]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_asset_config_route@4.ops[34]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' +debug: Inserted main_asset_config_route@4.ops[15]: 'store tmp%25#0 to l-stack (copy)' +debug: Replaced main_asset_config_route@4.ops[17]: 'load tmp%25#0' with 'load tmp%25#0 from l-stack (no copy)' +debug: Inserted main_asset_config_route@4.ops[20]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_asset_config_route@4.ops[22]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_asset_config_route@4.ops[24]: 'store tmp%26#0 to l-stack (copy)' +debug: Replaced main_asset_config_route@4.ops[26]: 'load tmp%26#0' with 'load tmp%26#0 from l-stack (no copy)' +debug: Inserted main_asset_config_route@4.ops[29]: 'store tmp%27#0 to l-stack (copy)' +debug: Replaced main_asset_config_route@4.ops[31]: 'load tmp%27#0' with 'load tmp%27#0 from l-stack (no copy)' +debug: Inserted main_asset_config_route@4.ops[23]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_asset_config_route@4.ops[34]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' debug: Inserted main_asset_transfer_route@5.ops[1]: 'store tmp%30#0 to l-stack (copy)' debug: Replaced main_asset_transfer_route@5.ops[3]: 'load tmp%30#0' with 'load tmp%30#0 from l-stack (no copy)' debug: Inserted main_asset_transfer_route@5.ops[5]: 'store tmp%31#0 to l-stack (copy)' debug: Replaced main_asset_transfer_route@5.ops[7]: 'load tmp%31#0' with 'load tmp%31#0 from l-stack (no copy)' debug: Inserted main_asset_transfer_route@5.ops[10]: 'store tmp%32#0 to l-stack (copy)' debug: Replaced main_asset_transfer_route@5.ops[12]: 'load tmp%32#0' with 'load tmp%32#0 from l-stack (no copy)' -debug: Inserted main_asset_transfer_route@5.ops[15]: 'store tmp%35#0 to l-stack (copy)' -debug: Replaced main_asset_transfer_route@5.ops[17]: 'load tmp%35#0' with 'load tmp%35#0 from l-stack (no copy)' -debug: Inserted main_asset_transfer_route@5.ops[20]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_asset_transfer_route@5.ops[22]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_asset_transfer_route@5.ops[24]: 'store tmp%36#0 to l-stack (copy)' -debug: Replaced main_asset_transfer_route@5.ops[26]: 'load tmp%36#0' with 'load tmp%36#0 from l-stack (no copy)' -debug: Inserted main_asset_transfer_route@5.ops[29]: 'store tmp%37#0 to l-stack (copy)' -debug: Replaced main_asset_transfer_route@5.ops[31]: 'load tmp%37#0' with 'load tmp%37#0 from l-stack (no copy)' -debug: Inserted main_asset_transfer_route@5.ops[23]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_asset_transfer_route@5.ops[34]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' +debug: Inserted main_asset_transfer_route@5.ops[15]: 'store tmp%33#0 to l-stack (copy)' +debug: Replaced main_asset_transfer_route@5.ops[17]: 'load tmp%33#0' with 'load tmp%33#0 from l-stack (no copy)' +debug: Inserted main_asset_transfer_route@5.ops[20]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_asset_transfer_route@5.ops[22]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_asset_transfer_route@5.ops[24]: 'store tmp%34#0 to l-stack (copy)' +debug: Replaced main_asset_transfer_route@5.ops[26]: 'load tmp%34#0' with 'load tmp%34#0 from l-stack (no copy)' +debug: Inserted main_asset_transfer_route@5.ops[29]: 'store tmp%35#0 to l-stack (copy)' +debug: Replaced main_asset_transfer_route@5.ops[31]: 'load tmp%35#0' with 'load tmp%35#0 from l-stack (no copy)' +debug: Inserted main_asset_transfer_route@5.ops[23]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_asset_transfer_route@5.ops[34]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' debug: Inserted main_asset_freeze_route@6.ops[1]: 'store tmp%38#0 to l-stack (copy)' debug: Replaced main_asset_freeze_route@6.ops[3]: 'load tmp%38#0' with 'load tmp%38#0 from l-stack (no copy)' debug: Inserted main_asset_freeze_route@6.ops[5]: 'store tmp%39#0 to l-stack (copy)' debug: Replaced main_asset_freeze_route@6.ops[7]: 'load tmp%39#0' with 'load tmp%39#0 from l-stack (no copy)' debug: Inserted main_asset_freeze_route@6.ops[10]: 'store tmp%40#0 to l-stack (copy)' debug: Replaced main_asset_freeze_route@6.ops[12]: 'load tmp%40#0' with 'load tmp%40#0 from l-stack (no copy)' -debug: Inserted main_asset_freeze_route@6.ops[15]: 'store tmp%43#0 to l-stack (copy)' -debug: Replaced main_asset_freeze_route@6.ops[17]: 'load tmp%43#0' with 'load tmp%43#0 from l-stack (no copy)' -debug: Inserted main_asset_freeze_route@6.ops[20]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_asset_freeze_route@6.ops[22]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_asset_freeze_route@6.ops[24]: 'store tmp%44#0 to l-stack (copy)' -debug: Replaced main_asset_freeze_route@6.ops[26]: 'load tmp%44#0' with 'load tmp%44#0 from l-stack (no copy)' -debug: Inserted main_asset_freeze_route@6.ops[29]: 'store tmp%45#0 to l-stack (copy)' -debug: Replaced main_asset_freeze_route@6.ops[31]: 'load tmp%45#0' with 'load tmp%45#0 from l-stack (no copy)' -debug: Inserted main_asset_freeze_route@6.ops[23]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_asset_freeze_route@6.ops[34]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' +debug: Inserted main_asset_freeze_route@6.ops[15]: 'store tmp%41#0 to l-stack (copy)' +debug: Replaced main_asset_freeze_route@6.ops[17]: 'load tmp%41#0' with 'load tmp%41#0 from l-stack (no copy)' +debug: Inserted main_asset_freeze_route@6.ops[20]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_asset_freeze_route@6.ops[22]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_asset_freeze_route@6.ops[24]: 'store tmp%42#0 to l-stack (copy)' +debug: Replaced main_asset_freeze_route@6.ops[26]: 'load tmp%42#0' with 'load tmp%42#0 from l-stack (no copy)' +debug: Inserted main_asset_freeze_route@6.ops[29]: 'store tmp%43#0 to l-stack (copy)' +debug: Replaced main_asset_freeze_route@6.ops[31]: 'load tmp%43#0' with 'load tmp%43#0 from l-stack (no copy)' +debug: Inserted main_asset_freeze_route@6.ops[23]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_asset_freeze_route@6.ops[34]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' debug: Inserted main_application_call_route@7.ops[1]: 'store tmp%46#0 to l-stack (copy)' debug: Replaced main_application_call_route@7.ops[3]: 'load tmp%46#0' with 'load tmp%46#0 from l-stack (no copy)' debug: Inserted main_application_call_route@7.ops[5]: 'store tmp%47#0 to l-stack (copy)' debug: Replaced main_application_call_route@7.ops[7]: 'load tmp%47#0' with 'load tmp%47#0 from l-stack (no copy)' debug: Inserted main_application_call_route@7.ops[10]: 'store tmp%48#0 to l-stack (copy)' debug: Replaced main_application_call_route@7.ops[12]: 'load tmp%48#0' with 'load tmp%48#0 from l-stack (no copy)' -debug: Inserted main_application_call_route@7.ops[15]: 'store tmp%51#0 to l-stack (copy)' -debug: Replaced main_application_call_route@7.ops[17]: 'load tmp%51#0' with 'load tmp%51#0 from l-stack (no copy)' -debug: Inserted main_application_call_route@7.ops[20]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_application_call_route@7.ops[22]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_application_call_route@7.ops[24]: 'store tmp%52#0 to l-stack (copy)' -debug: Replaced main_application_call_route@7.ops[26]: 'load tmp%52#0' with 'load tmp%52#0 from l-stack (no copy)' -debug: Inserted main_application_call_route@7.ops[29]: 'store tmp%53#0 to l-stack (copy)' -debug: Replaced main_application_call_route@7.ops[31]: 'load tmp%53#0' with 'load tmp%53#0 from l-stack (no copy)' -debug: Inserted main_application_call_route@7.ops[23]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_application_call_route@7.ops[34]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' +debug: Inserted main_application_call_route@7.ops[15]: 'store tmp%49#0 to l-stack (copy)' +debug: Replaced main_application_call_route@7.ops[17]: 'load tmp%49#0' with 'load tmp%49#0 from l-stack (no copy)' +debug: Inserted main_application_call_route@7.ops[20]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_application_call_route@7.ops[22]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_application_call_route@7.ops[24]: 'store tmp%50#0 to l-stack (copy)' +debug: Replaced main_application_call_route@7.ops[26]: 'load tmp%50#0' with 'load tmp%50#0 from l-stack (no copy)' +debug: Inserted main_application_call_route@7.ops[29]: 'store tmp%51#0 to l-stack (copy)' +debug: Replaced main_application_call_route@7.ops[31]: 'load tmp%51#0' with 'load tmp%51#0 from l-stack (no copy)' +debug: Inserted main_application_call_route@7.ops[23]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_application_call_route@7.ops[34]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' debug: Inserted main_multiple_txns_route@8.ops[1]: 'store tmp%54#0 to l-stack (copy)' debug: Replaced main_multiple_txns_route@8.ops[3]: 'load tmp%54#0' with 'load tmp%54#0 from l-stack (no copy)' debug: Inserted main_multiple_txns_route@8.ops[5]: 'store tmp%55#0 to l-stack (copy)' debug: Replaced main_multiple_txns_route@8.ops[7]: 'load tmp%55#0' with 'load tmp%55#0 from l-stack (no copy)' debug: Inserted main_multiple_txns_route@8.ops[10]: 'store tmp%56#0 to l-stack (copy)' debug: Replaced main_multiple_txns_route@8.ops[12]: 'load tmp%56#0' with 'load tmp%56#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[15]: 'store tmp%59#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[17]: 'load tmp%59#0' with 'load tmp%59#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[20]: 'store awst_tmp%60#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[22]: 'load awst_tmp%60#0' with 'load awst_tmp%60#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[24]: 'store tmp%61#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[26]: 'load tmp%61#0' with 'load tmp%61#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[29]: 'store tmp%62#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[31]: 'load tmp%62#0' with 'load tmp%62#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[34]: 'store tmp%65#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[36]: 'load tmp%65#0' with 'load tmp%65#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[39]: 'store awst_tmp%66#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[41]: 'load awst_tmp%66#0' with 'load awst_tmp%66#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[43]: 'store tmp%67#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[45]: 'load tmp%67#0' with 'load tmp%67#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[48]: 'store tmp%68#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[50]: 'load tmp%68#0' with 'load tmp%68#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[53]: 'store tmp%71#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[55]: 'load tmp%71#0' with 'load tmp%71#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[58]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[60]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[62]: 'store tmp%72#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[64]: 'load tmp%72#0' with 'load tmp%72#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[67]: 'store tmp%73#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[69]: 'load tmp%73#0' with 'load tmp%73#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[61]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[74]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[42]: 'store awst_tmp%66#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[74]: 'load awst_tmp%66#0' with 'load awst_tmp%66#0 from l-stack (no copy)' -debug: Inserted main_multiple_txns_route@8.ops[23]: 'store awst_tmp%60#0 to l-stack (copy)' -debug: Replaced main_multiple_txns_route@8.ops[74]: 'load awst_tmp%60#0' with 'load awst_tmp%60#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[15]: 'store tmp%57#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[17]: 'load tmp%57#0' with 'load tmp%57#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[20]: 'store awst_tmp%58#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[22]: 'load awst_tmp%58#0' with 'load awst_tmp%58#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[24]: 'store tmp%59#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[26]: 'load tmp%59#0' with 'load tmp%59#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[29]: 'store tmp%60#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[31]: 'load tmp%60#0' with 'load tmp%60#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[34]: 'store tmp%63#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[36]: 'load tmp%63#0' with 'load tmp%63#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[39]: 'store awst_tmp%64#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[41]: 'load awst_tmp%64#0' with 'load awst_tmp%64#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[43]: 'store tmp%65#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[45]: 'load tmp%65#0' with 'load tmp%65#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[48]: 'store tmp%66#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[50]: 'load tmp%66#0' with 'load tmp%66#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[53]: 'store tmp%69#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[55]: 'load tmp%69#0' with 'load tmp%69#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[58]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[60]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[62]: 'store tmp%70#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[64]: 'load tmp%70#0' with 'load tmp%70#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[67]: 'store tmp%71#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[69]: 'load tmp%71#0' with 'load tmp%71#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[61]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[74]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[42]: 'store awst_tmp%64#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[74]: 'load awst_tmp%64#0' with 'load awst_tmp%64#0 from l-stack (no copy)' +debug: Inserted main_multiple_txns_route@8.ops[23]: 'store awst_tmp%58#0 to l-stack (copy)' +debug: Replaced main_multiple_txns_route@8.ops[74]: 'load awst_tmp%58#0' with 'load awst_tmp%58#0 from l-stack (no copy)' debug: Inserted main_any_txn_route@9.ops[1]: 'store tmp%74#0 to l-stack (copy)' debug: Replaced main_any_txn_route@9.ops[3]: 'load tmp%74#0' with 'load tmp%74#0 from l-stack (no copy)' debug: Inserted main_any_txn_route@9.ops[5]: 'store tmp%75#0 to l-stack (copy)' debug: Replaced main_any_txn_route@9.ops[7]: 'load tmp%75#0' with 'load tmp%75#0 from l-stack (no copy)' debug: Inserted main_any_txn_route@9.ops[10]: 'store tmp%76#0 to l-stack (copy)' debug: Replaced main_any_txn_route@9.ops[12]: 'load tmp%76#0' with 'load tmp%76#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[15]: 'store tmp%79#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[17]: 'load tmp%79#0' with 'load tmp%79#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[20]: 'store awst_tmp%60#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[22]: 'load awst_tmp%60#0' with 'load awst_tmp%60#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[24]: 'store tmp%80#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[26]: 'load tmp%80#0' with 'load tmp%80#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[29]: 'store tmp%81#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[31]: 'load tmp%81#0' with 'load tmp%81#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[34]: 'store tmp%84#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[36]: 'load tmp%84#0' with 'load tmp%84#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[39]: 'store awst_tmp%66#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[41]: 'load awst_tmp%66#0' with 'load awst_tmp%66#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[43]: 'store tmp%85#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[45]: 'load tmp%85#0' with 'load tmp%85#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[48]: 'store tmp%86#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[50]: 'load tmp%86#0' with 'load tmp%86#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[53]: 'store tmp%89#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[55]: 'load tmp%89#0' with 'load tmp%89#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[58]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[60]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[62]: 'store tmp%90#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[64]: 'load tmp%90#0' with 'load tmp%90#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[67]: 'store tmp%91#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[69]: 'load tmp%91#0' with 'load tmp%91#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[61]: 'store awst_tmp%11#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[74]: 'load awst_tmp%11#0' with 'load awst_tmp%11#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[42]: 'store awst_tmp%66#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[74]: 'load awst_tmp%66#0' with 'load awst_tmp%66#0 from l-stack (no copy)' -debug: Inserted main_any_txn_route@9.ops[23]: 'store awst_tmp%60#0 to l-stack (copy)' -debug: Replaced main_any_txn_route@9.ops[74]: 'load awst_tmp%60#0' with 'load awst_tmp%60#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[15]: 'store tmp%77#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[17]: 'load tmp%77#0' with 'load tmp%77#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[20]: 'store awst_tmp%58#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[22]: 'load awst_tmp%58#0' with 'load awst_tmp%58#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[24]: 'store tmp%78#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[26]: 'load tmp%78#0' with 'load tmp%78#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[29]: 'store tmp%79#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[31]: 'load tmp%79#0' with 'load tmp%79#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[34]: 'store tmp%82#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[36]: 'load tmp%82#0' with 'load tmp%82#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[39]: 'store awst_tmp%64#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[41]: 'load awst_tmp%64#0' with 'load awst_tmp%64#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[43]: 'store tmp%83#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[45]: 'load tmp%83#0' with 'load tmp%83#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[48]: 'store tmp%84#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[50]: 'load tmp%84#0' with 'load tmp%84#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[53]: 'store tmp%87#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[55]: 'load tmp%87#0' with 'load tmp%87#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[58]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[60]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[62]: 'store tmp%88#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[64]: 'load tmp%88#0' with 'load tmp%88#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[67]: 'store tmp%89#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[69]: 'load tmp%89#0' with 'load tmp%89#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[61]: 'store awst_tmp%9#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[74]: 'load awst_tmp%9#0' with 'load awst_tmp%9#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[42]: 'store awst_tmp%64#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[74]: 'load awst_tmp%64#0' with 'load awst_tmp%64#0 from l-stack (no copy)' +debug: Inserted main_any_txn_route@9.ops[23]: 'store awst_tmp%58#0 to l-stack (copy)' +debug: Replaced main_any_txn_route@9.ops[74]: 'load awst_tmp%58#0' with 'load awst_tmp%58#0 from l-stack (no copy)' debug: Found 1 edge set/s for test_cases.transaction.contract.TransactionContract.approval_program debug: Inserted pay_block@0.ops[10]: 'store tmp%2#0 to l-stack (copy)' debug: Replaced pay_block@0.ops[12]: 'load tmp%2#0' with 'load tmp%2#0 from l-stack (no copy)' From 63f3e6b07fd939b7e22ea191ac5e2b1a74919756 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Tue, 5 Mar 2024 13:08:58 +0800 Subject: [PATCH 40/40] refactoring _build_field --- src/puya/awst_build/eb/app_account_state.py | 80 ++++++++------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/src/puya/awst_build/eb/app_account_state.py b/src/puya/awst_build/eb/app_account_state.py index 86de47c377..600d2b2e93 100644 --- a/src/puya/awst_build/eb/app_account_state.py +++ b/src/puya/awst_build/eb/app_account_state.py @@ -16,7 +16,6 @@ StateGet, StateGetEx, Statement, - UInt64Constant, ) from puya.awst_build import constants from puya.awst_build.contract_data import AppStateDeclaration @@ -29,23 +28,11 @@ ) from puya.awst_build.eb.value_proxy import ValueProxyExpressionBuilder from puya.awst_build.eb.var_factory import var_expression -from puya.awst_build.utils import expect_operand_wtype, get_arg_mapping +from puya.awst_build.utils import convert_literal_to_expr, expect_operand_wtype, get_arg_mapping from puya.errors import CodeError, InternalError from puya.parse import SourceLocation -def _build_field( - state_decl: AppStateDeclaration, index: ExpressionBuilder | Literal, location: SourceLocation -) -> AppAccountStateExpression: - index_expr = _validated_index_expr(index) - return AppAccountStateExpression( - field_name=state_decl.member_name, - account=index_expr, - wtype=state_decl.storage_wtype, - source_location=location, - ) - - class AppAccountStateExpressionBuilder(StateProxyMemberBuilder): def __init__(self, state_decl: AppStateDeclaration, location: SourceLocation): assert state_decl.kind is AppStateKind.account_local @@ -128,42 +115,6 @@ def call( raise CodeError("Invalid/unhandled arguments", location) -def _validated_index_expr(index: ExpressionBuilder | Literal) -> Expression: - # TODO: FIXME - tmp: Expression | Literal - if isinstance(index, Literal): - tmp = index - else: - tmp = index.rvalue() - match tmp: - case Literal(value=int(account_offset)): - valid_account_offset(account_offset, index.source_location) - index_expr: Expression = UInt64Constant( - value=account_offset, source_location=index.source_location - ) - case Literal(): - raise CodeError("Invalid literal, expected an int", index.source_location) - case IntegerConstant(value=account_offset) as index_expr: - valid_account_offset(account_offset, index.source_location) - case Expression(wtype=(wtypes.uint64_wtype | wtypes.account_wtype)) as index_expr: - pass - case _: - raise CodeError( - "Invalid index argument - must be either an Address or a UInt64", - index.source_location, - ) - return index_expr - - -def valid_account_offset(value: int, loc: SourceLocation) -> None: - # https://developer.algorand.org/docs/get-details/dapps/smart-contracts/apps/#resource-availability - # Note that the sender address is implicitly included in the array, - # but doesn't count towards the limit of 4, so the <= 4 below is correct - # and intended - if not (0 <= value <= 4): - raise CodeError("Account index should be between 0 and 4 inclusive", loc) - - class AppAccountStateForAccountExpressionBuilder(ValueProxyExpressionBuilder): def __init__(self, expr: AppAccountStateExpression): self.__field = expr @@ -269,3 +220,32 @@ def call( class AppAccountStateProxyDefinitionBuilder(StateProxyDefinitionBuilder): kind = AppStateKind.account_local python_name = constants.CLS_LOCAL_STATE_ALIAS + + +def _build_field( + state_decl: AppStateDeclaration, index: ExpressionBuilder | Literal, location: SourceLocation +) -> AppAccountStateExpression: + index_expr = convert_literal_to_expr(index, wtypes.uint64_wtype) + match index_expr: + case IntegerConstant(value=account_offset): + # https://developer.algorand.org/docs/get-details/dapps/smart-contracts/apps/#resource-availability + # Note that the sender address is implicitly included in the array, + # but doesn't count towards the limit of 4, so the <= 4 below is correct + # and intended + if not (0 <= account_offset <= 4): + raise CodeError( + "Account index should be between 0 and 4 inclusive", index.source_location + ) + case Expression(wtype=(wtypes.uint64_wtype | wtypes.account_wtype)): + pass + case _: + raise CodeError( + "Invalid index argument - must be either an Address or a UInt64", + index.source_location, + ) + return AppAccountStateExpression( + field_name=state_decl.member_name, + account=index_expr, + wtype=state_decl.storage_wtype, + source_location=location, + )