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)
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)
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)
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] != '%'])
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)
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)
def do_some(ctx: Context, prim, args, annots): top = ctx.pop1() res = Option.some(top) ctx.push(res, annots=annots)
def do_none(ctx: Context, prim, args, annots): none = Option.none(args[0]) ctx.push(none, annots=annots)