def forge_script(script) -> bytes: """ Encode an origination script into the byte form. :param script: {"code": "$Micheline_expression", "storage": "$Micheline_expression"} """ code = forge_micheline(script['code']) storage = forge_micheline(script['storage']) return forge_array(code) + forge_array(storage)
def forge_micheline(data) -> bytes: """ Encode a Micheline expression into the byte form. :param data: Micheline expression """ res = [] if isinstance(data, list): res.append(b'\x02') res.append(forge_array(b''.join(map(forge_micheline, data)))) elif isinstance(data, dict): if data.get('prim'): args_len = len(data.get('args', [])) annots_len = len(data.get('annots', [])) res.append(len_tags[args_len][annots_len > 0]) res.append(prim_tags[data['prim']]) if args_len > 0: args = b''.join(map(forge_micheline, data['args'])) if args_len < 3: res.append(args) else: res.append(forge_array(args)) if annots_len > 0: res.append(forge_array(' '.join(data['annots']).encode())) elif args_len == 3: res.append(b'\x00' * 4) elif data.get('bytes') is not None: res.append(b'\x0A') res.append(forge_array(bytes.fromhex(data['bytes']))) elif data.get('int') is not None: res.append(b'\x00') res.append(forge_int(int(data['int']))) elif data.get('string') is not None: res.append(b'\x01') res.append(forge_array(data['string'].encode())) else: assert False, data else: assert False, data return b''.join(res)
def forge_entrypoint(entrypoint) -> bytes: """ Encode Michelson contract entrypoint into the byte form. :param entrypoint: string """ if entrypoint in reserved_entries: return reserved_entries[entrypoint] else: return b'\xff' + forge_array(entrypoint.encode(), len_bytes=1)
def forge_transaction(content): res = forge_nat(operation_tags[content['kind']]) res += forge_address(content['source'], tz_only=True) res += forge_nat(int(content['fee'])) res += forge_nat(int(content['counter'])) res += forge_nat(int(content['gas_limit'])) res += forge_nat(int(content['storage_limit'])) res += forge_nat(int(content['amount'])) res += forge_address(content['destination']) if content.get('parameters'): res += forge_bool(True) res += forge_entrypoint(content['parameters']['entrypoint']) res += forge_array(forge_micheline(content['parameters']['value'])) else: res += forge_bool(False) return res
def forge_script(script): code = forge_micheline(script['code']) storage = forge_micheline(script['storage']) return forge_array(code) + forge_array(storage)
def forge_entrypoint(entrypoint): if entrypoint in reserved_entries: return reserved_entries[entrypoint] else: return b'\xff' + forge_array(entrypoint.encode(), len_bytes=1)