예제 #1
0
def do_is_nat(ctx: Context, prim, args, annots):
    top = ctx.pop1()
    assert_stack_type(top, Int)
    if int(top) >= 0:
        res = Option.some(Nat(int(top)))
    else:
        res = Option.none(Nat().type_expr)
    ctx.push(res, annots=annots)
예제 #2
0
def do_slice(ctx: Context, prim, args, annots):
    offset, length, s = ctx.pop3()
    assert_stack_type(s, [String, Bytes])
    offset, length = int(offset), int(length)
    if len(s) > 0 and offset + length <= len(s):
        res = Option.some(s[offset:offset+length])
    else:
        res = Option.none(type(s)().type_expr)
    ctx.push(res, annots=annots)
예제 #3
0
def do_unpack(ctx: Context, prim, args, annots):
    top = ctx.pop1()
    assert_stack_type(top, Bytes)
    try:
        val_expr = unpack(data=bytes(top), type_expr=args[0])
        item = StackItem.parse(val_expr=val_expr, type_expr=args[0])
        res = Option.some(item)
    except Exception as e:
        ctx.print(f'failed: {e}')
        res = Option.none(args[0])
    ctx.push(res, annots=annots)
예제 #4
0
def do_contract(ctx: Context, prim, args, annots):
    top = ctx.pop1()
    assert_stack_type(top, Address)

    entry_annot = next((a for a in annots if a[0] == '%'), '%default')
    contract = Contract.new(str(top) + entry_annot, type_expr=args[0])

    if check_contract(ctx, address=str(top), entry_annot=entry_annot, type_expr=args[0]):
        res = Option.some(contract)
    else:
        res = Option.none(contract.type_expr)

    if top.name:
        annots.append(f'@{top.name}.contract')
    ctx.push(res, annots=[a for a in annots if a[0] != '%'])
예제 #5
0
def do_get(ctx: Context, prim, args, annots):
    key, container = ctx.pop2()
    assert_stack_type(container, [Map, BigMap])

    if type(container) == Map:
        val = container.find(key)
    else:
        val = ctx.big_maps.find(container, key)

    if val is not None:
        res = Option.some(val)
    else:
        res = Option.none(container.val_type_expr())

    ctx.push(res, annots=annots)
예제 #6
0
def do_ediv(ctx: Context, prim, args, annots):
    a, b = ctx.pop2()
    q_type, r_type = dispatch_type_map(
        a, b, {
            (Nat, Nat): (Nat, Nat),
            (Nat, Int): (Int, Nat),
            (Int, Nat): (Int, Nat),
            (Int, Int): (Int, Nat),
            (Mutez, Nat): (Mutez, Mutez),
            (Mutez, Mutez): (Nat, Mutez)
        })
    if int(b) == 0:
        res = Option.none(Pair.new(q_type(), r_type()).type_expr)
    else:
        q, r = divmod(int(a), int(b))
        if r < 0:
            r += abs(int(b))
            q += 1
        res = Option.some(Pair.new(q_type(q), r_type(r)))
    ctx.push(res, annots=annots)
예제 #7
0
def do_some(ctx: Context, prim, args, annots):
    top = ctx.pop1()
    res = Option.some(top)
    ctx.push(res, annots=annots)
예제 #8
0
def do_none(ctx: Context, prim, args, annots):
    none = Option.none(args[0])
    ctx.push(none, annots=annots)