def test_arg_static(): for i in range(256): expr = pt.Arg(i) assert expr.type_of() == pt.TealType.bytes assert not expr.has_return() expected = pt.TealSimpleBlock([pt.TealOp(expr, pt.Op.arg, i)]) actual, _ = expr.__teal__(avm2Options) assert actual == expected
def test_String_encode(): value = abi.String() expr = value.encode() assert expr.type_of() == pt.TealType.bytes assert expr.has_return() is False expected = pt.TealSimpleBlock( [pt.TealOp(expr, pt.Op.load, value.stored_value.slot)]) actual, _ = expr.__teal__(options) assert actual == expected
def test_concat_one(): arg = pt.Bytes("a") expr = pt.Concat(arg) assert expr.type_of() == pt.TealType.bytes expected = pt.TealSimpleBlock([pt.TealOp(arg, pt.Op.byte, '"a"')]) actual, _ = expr.__teal__(options) assert actual == expected
def test_or_one(): arg = pt.Int(1) expr = pt.Or(arg) assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([pt.TealOp(arg, pt.Op.int, 1)]) actual, _ = expr.__teal__(options) assert actual == expected
def test_get_bit_int(): args = [pt.Int(3), pt.Int(1)] expr = pt.GetBit(args[0], args[1]) assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.int, 3), pt.TealOp(args[1], pt.Op.int, 1), pt.TealOp(expr, pt.Op.getbit), ]) actual, _ = expr.__teal__(avm3Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) assert actual == expected with pytest.raises(pt.TealInputError): expr.__teal__(avm2Options)
def test_get_byte(): args = [pt.Bytes("base16", "0xFF"), pt.Int(0)] expr = pt.GetByte(args[0], args[1]) assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.byte, "0xFF"), pt.TealOp(args[1], pt.Op.int, 0), pt.TealOp(expr, pt.Op.getbyte), ]) actual, _ = expr.__teal__(avm3Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) assert actual == expected with pytest.raises(pt.TealInputError): expr.__teal__(avm2Options)
def test_minus_overload(): args = [pt.Int(10), pt.Int(1), pt.Int(2)] expr = args[0] - args[1] - args[2] assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.int, 10), pt.TealOp(args[1], pt.Op.int, 1), pt.TealOp(None, pt.Op.minus), pt.TealOp(args[2], pt.Op.int, 2), pt.TealOp(None, pt.Op.minus), ]) actual, _ = expr.__teal__(avm2Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_shift_right(): args = [pt.Int(5), pt.Int(1)] expr = pt.ShiftRight(args[0], args[1]) assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.int, 5), pt.TealOp(args[1], pt.Op.int, 1), pt.TealOp(expr, pt.Op.shr), ]) actual, _ = expr.__teal__(avm4Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) assert actual == expected with pytest.raises(pt.TealInputError): expr.__teal__(avm3Options)
def test_exp(): args = [pt.Int(2), pt.Int(9)] expr = pt.Exp(args[0], args[1]) assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.int, 2), pt.TealOp(args[1], pt.Op.int, 9), pt.TealOp(expr, pt.Op.exp), ]) actual, _ = expr.__teal__(avm4Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) assert actual == expected with pytest.raises(pt.TealInputError): expr.__teal__(avm3Options)
def test_acct_param_balance_valid(): arg = pt.Int(1) expr = pt.AccountParam.balance(arg) assert expr.type_of() == pt.TealType.none assert expr.value().type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(arg, pt.Op.int, 1), pt.TealOp(expr, pt.Op.acct_params_get, "AcctBalance"), pt.TealOp(None, pt.Op.store, expr.slotOk), pt.TealOp(None, pt.Op.store, expr.slotValue), ]) actual, _ = expr.__teal__(avm6Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_Bool_encode(): value = abi.Bool() expr = value.encode() assert expr.type_of() == pt.TealType.bytes assert not expr.has_return() expected = pt.TealSimpleBlock([ pt.TealOp(None, pt.Op.byte, "0x00"), pt.TealOp(None, pt.Op.int, 0), pt.TealOp(None, pt.Op.load, value.stored_value.slot), pt.TealOp(None, pt.Op.setbit), ]) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_global_group_size(): expr = pt.Global.group_size() assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock( [pt.TealOp(expr, pt.Op.global_, "GroupSize")]) actual, _ = expr.__teal__(avm2Options) assert actual == expected
def test_replace_immediate(): args = [pt.Bytes("my string"), pt.Int(0), pt.Bytes("abcdefghi")] expr = pt.Replace(args[0], args[1], args[2]) assert expr.type_of() == pt.TealType.bytes expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.byte, '"my string"'), pt.TealOp(args[2], pt.Op.byte, '"abcdefghi"'), pt.TealOp(expr, pt.Op.replace2, 0), ]) actual, _ = expr.__teal__(avm7Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) assert actual == expected with pytest.raises(pt.TealInputError): expr.__teal__(avm6Options)
def test_gloadss(): txID = pt.Int(1) slotID = pt.Int(0) expr = pt.ImportScratchValue(txID, slotID) assert expr.type_of() == pt.TealType.anytype expected = pt.TealSimpleBlock( [ pt.TealOp(txID, pt.Op.int, 1), pt.TealOp(slotID, pt.Op.int, 0), pt.TealOp(expr, pt.Op.gloadss), ] ) actual, _ = expr.__teal__(avm6Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) assert actual == expected
def test_scratch_load_default(): slot = pt.ScratchSlot() expr = pt.ScratchLoad(slot) assert expr.type_of() == pt.TealType.anytype expected = pt.TealSimpleBlock([pt.TealOp(expr, pt.Op.load, slot)]) actual, _ = expr.__teal__(options) assert actual == expected
def test_substring_to_extract(): my_string = "a" * 257 args = [pt.Bytes(my_string), pt.Int(255), pt.Int(257)] expr = pt.Substring(args[0], args[1], args[2]) assert expr.type_of() == pt.TealType.bytes expected = pt.TealSimpleBlock( [ pt.TealOp(args[0], pt.Op.byte, '"{my_string}"'.format(my_string=my_string)), pt.TealOp(expr, pt.Op.extract, 255, 2), ] ) actual, _ = expr.__teal__(avm5Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_global_max_txn_life(): expr = pt.Global.max_txn_life() assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock( [pt.TealOp(expr, pt.Op.global_, "MaxTxnLife")]) actual, _ = expr.__teal__(avm2Options) assert actual == expected
def test_global_zero_address(): expr = pt.Global.zero_address() assert expr.type_of() == pt.TealType.bytes expected = pt.TealSimpleBlock( [pt.TealOp(expr, pt.Op.global_, "ZeroAddress")]) actual, _ = expr.__teal__(avm2Options) assert actual == expected
def test_global_current_application_id(): expr = pt.Global.current_application_id() assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock( [pt.TealOp(expr, pt.Op.global_, "CurrentApplicationID")]) actual, _ = expr.__teal__(avm2Options) assert actual == expected
def test_global_min_balance(): expr = pt.Global.min_balance() assert expr.type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock( [pt.TealOp(expr, pt.Op.global_, "MinBalance")]) actual, _ = expr.__teal__(avm2Options) assert actual == expected
def test_dynamic_scratchvar_store(): myvar = pt.DynamicScratchVar(pt.TealType.bytes) arg = pt.Bytes("value") expr = myvar.store(arg) expected = pt.TealSimpleBlock( [ pt.TealOp(pt.ScratchLoad(myvar.slot), pt.Op.load, myvar.slot), pt.TealOp(arg, pt.Op.byte, '"value"'), pt.TealOp(expr, pt.Op.stores), ] ) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_app_param_address_valid(): arg = pt.Int(1) expr = pt.AppParam.address(arg) assert expr.type_of() == pt.TealType.none assert expr.value().type_of() == pt.TealType.bytes expected = pt.TealSimpleBlock([ pt.TealOp(arg, pt.Op.int, 1), pt.TealOp(expr, pt.Op.app_params_get, "AppAddress"), pt.TealOp(None, pt.Op.store, expr.slotOk), pt.TealOp(None, pt.Op.store, expr.slotValue), ]) actual, _ = expr.__teal__(avm5Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_scratch_assign_id(): slot = pt.ScratchSlot(255) expr = pt.ScratchStackStore(slot) assert expr.type_of() == pt.TealType.none expected = pt.TealSimpleBlock([pt.TealOp(expr, pt.Op.store, slot)]) actual, _ = expr.__teal__(options) assert actual == expected
def test_asset_param_clawback_direct_ref(): arg = pt.Txn.assets[1] expr = pt.AssetParam.clawback(arg) assert expr.type_of() == pt.TealType.none assert expr.value().type_of() == pt.TealType.bytes expected = pt.TealSimpleBlock([ pt.TealOp(arg, pt.Op.txna, "Assets", 1), pt.TealOp(expr, pt.Op.asset_params_get, "AssetClawback"), pt.TealOp(None, pt.Op.store, expr.slotOk), pt.TealOp(None, pt.Op.store, expr.slotValue), ]) actual, _ = expr.__teal__(avm4Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_asset_param_freeze(): arg = pt.Int(0) expr = pt.AssetParam.freeze(arg) assert expr.type_of() == pt.TealType.none assert expr.value().type_of() == pt.TealType.bytes expected = pt.TealSimpleBlock([ pt.TealOp(arg, pt.Op.int, 0), pt.TealOp(expr, pt.Op.asset_params_get, "AssetFreeze"), pt.TealOp(None, pt.Op.store, expr.slotOk), pt.TealOp(None, pt.Op.store, expr.slotValue), ]) actual, _ = expr.__teal__(avm2Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_extractMethodValue(): tests = [ ( pt.TealOp(None, pt.Op.method_signature, '"create(uint64)uint64"'), b"\x43\x46\x41\x01", ), ( pt.TealOp(None, pt.Op.method_signature, '"update()void"'), b"\xa0\xe8\x18\x72", ), ( pt.TealOp(None, pt.Op.method_signature, '"optIn(string)string"'), b"\xcf\xa6\x8e\x36", ), ( pt.TealOp(None, pt.Op.method_signature, '"closeOut()string"'), b"\xa9\xf4\x2b\x3d", ), ( pt.TealOp(None, pt.Op.method_signature, '"delete()void"'), b"\x24\x37\x8d\x3c", ), ( pt.TealOp(None, pt.Op.method_signature, '"add(uint64,uint64)uint64"'), b"\xfe\x6b\xdf\x69", ), (pt.TealOp(None, pt.Op.method_signature, '"empty()void"'), b"\xa8\x8c\x26\xa5"), ( pt.TealOp(None, pt.Op.method_signature, '"payment(pay,uint64)bool"'), b"\x3e\x3b\x3d\x28", ), ( pt.TealOp( None, pt.Op.method_signature, '"referenceTest(account,application,account,asset,account,asset,asset,application,application)uint8[9]"', ), b"\x0d\xf0\x05\x0f", ), ] for op, expected in tests: actual = extractMethodSigValue(op) assert actual == expected
def test_global_get_ex_direct_ref(): args = [pt.Txn.applications[0], pt.Bytes("key")] expr = pt.App.globalGetEx(args[0], args[1]) assert expr.type_of() == pt.TealType.none assert expr.value().type_of() == pt.TealType.anytype expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.txna, "Applications", 0), pt.TealOp(args[1], pt.Op.byte, '"key"'), pt.TealOp(expr, pt.Op.app_global_get_ex), pt.TealOp(None, pt.Op.store, expr.slotOk), pt.TealOp(None, pt.Op.store, expr.slotValue), ]) actual, _ = expr.__teal__(avm4Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_scratch_load_type(): for type in (pt.TealType.uint64, pt.TealType.bytes, pt.TealType.anytype): slot = pt.ScratchSlot() expr = pt.ScratchLoad(slot, type) assert expr.type_of() == type expected = pt.TealSimpleBlock([pt.TealOp(expr, pt.Op.load, slot)]) actual, _ = expr.__teal__(options) assert actual == expected
def test_asset_holding_frozen_direct_ref(): args = [pt.Txn.sender(), pt.Txn.assets[17]] expr = pt.AssetHolding.frozen(args[0], args[1]) assert expr.type_of() == pt.TealType.none assert expr.value().type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.txn, "Sender"), pt.TealOp(args[1], pt.Op.txna, "Assets", 17), pt.TealOp(expr, pt.Op.asset_holding_get, "AssetFrozen"), pt.TealOp(None, pt.Op.store, expr.slotOk), pt.TealOp(None, pt.Op.store, expr.slotValue), ]) actual, _ = expr.__teal__(avm4Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_asset_holding_balance(): args = pt.Int(0), pt.Int(17) expr = pt.AssetHolding.balance(args[0], args[1]) assert expr.type_of() == pt.TealType.none assert expr.value().type_of() == pt.TealType.uint64 expected = pt.TealSimpleBlock([ pt.TealOp(args[0], pt.Op.int, 0), pt.TealOp(args[1], pt.Op.int, 17), pt.TealOp(expr, pt.Op.asset_holding_get, "AssetBalance"), pt.TealOp(None, pt.Op.store, expr.slotOk), pt.TealOp(None, pt.Op.store, expr.slotValue), ]) actual, _ = expr.__teal__(avm2Options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected