예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
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
예제 #8
0
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)
예제 #9
0
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)
예제 #10
0
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
예제 #11
0
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
예제 #12
0
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
예제 #13
0
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)
예제 #14
0
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
예제 #15
0
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
예제 #16
0
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
예제 #17
0
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
예제 #18
0
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
예제 #19
0
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
예제 #20
0
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
예제 #21
0
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
예제 #22
0
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
예제 #23
0
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
예제 #24
0
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
예제 #25
0
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
예제 #26
0
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
예제 #27
0
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
예제 #28
0
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
예제 #29
0
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
예제 #30
0
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