async def _memo(ctx, w: bytearray, msg: StellarSignTx): if msg.memo_type is None: msg.memo_type = consts.MEMO_TYPE_NONE writers.write_uint32(w, msg.memo_type) if msg.memo_type == consts.MEMO_TYPE_NONE: # nothing is serialized memo_confirm_text = "" elif msg.memo_type == consts.MEMO_TYPE_TEXT: # Text: 4 bytes (size) + up to 28 bytes if len(msg.memo_text) > 28: raise ProcessError( "Stellar: max length of a memo text is 28 bytes") writers.write_string(w, msg.memo_text) memo_confirm_text = msg.memo_text elif msg.memo_type == consts.MEMO_TYPE_ID: # ID: 64 bit unsigned integer writers.write_uint64(w, msg.memo_id) memo_confirm_text = str(msg.memo_id) elif msg.memo_type in (consts.MEMO_TYPE_HASH, consts.MEMO_TYPE_RETURN): # Hash/Return: 32 byte hash writers.write_bytes(w, bytearray(msg.memo_hash)) memo_confirm_text = hexlify(msg.memo_hash).decode() else: raise ProcessError("Stellar invalid memo type") await layout.require_confirm_memo(ctx, msg.memo_type, memo_confirm_text)
def serialize_manage_data_op(w, msg: StellarManageDataOp): if len(msg.key) > 64: raise ProcessError("Stellar: max length of a key is 64 bytes") writers.write_string(w, msg.key) writers.write_bool(w, bool(msg.value)) if msg.value: writers.write_uint32(w, len(msg.value)) writers.write_bytes(w, msg.value)
def _serialize_asset_code(w, asset_type: int, asset_code: str): code = bytearray(asset_code) if asset_type == consts.ASSET_TYPE_NATIVE: return # nothing is needed elif asset_type == consts.ASSET_TYPE_ALPHANUM4: # pad with zeros to 4 chars writers.write_bytes(w, code + bytearray([0] * (4 - len(code)))) elif asset_type == consts.ASSET_TYPE_ALPHANUM12: # pad with zeros to 12 chars writers.write_bytes(w, code + bytearray([0] * (12 - len(code)))) else: raise ProcessError("Stellar: invalid asset type")
async def _init(ctx, w: bytearray, pubkey: bytes, msg: StellarSignTx): network_passphrase_hash = sha256(msg.network_passphrase).digest() writers.write_bytes(w, network_passphrase_hash) writers.write_bytes(w, consts.TX_TYPE) address = helpers.address_from_public_key(pubkey) writers.write_pubkey(w, address) if helpers.public_key_from_address(msg.source_account) != pubkey: raise ProcessError("Stellar: source account does not match address_n") writers.write_uint32(w, msg.fee) writers.write_uint64(w, msg.sequence_number) # confirm init await layout.require_confirm_init(ctx, address, msg.network_passphrase)
async def _init(ctx, w: bytearray, pubkey: bytes, msg: StellarSignTx): network_passphrase_hash = sha256(msg.network_passphrase).digest() writers.write_bytes(w, network_passphrase_hash) writers.write_bytes(w, consts.TX_TYPE) address = helpers.address_from_public_key(pubkey) accounts_match = msg.source_account == address writers.write_pubkey(w, msg.source_account) writers.write_uint32(w, msg.fee) writers.write_uint64(w, msg.sequence_number) # confirm init await layout.require_confirm_init(ctx, msg.source_account, msg.network_passphrase, accounts_match)
def serialize_set_options_op(w, msg: StellarSetOptionsOp): # inflation destination writers.write_bool(w, bool(msg.inflation_destination_account)) if msg.inflation_destination_account: writers.write_pubkey(w, msg.inflation_destination_account) # clear flags writers.write_bool(w, bool(msg.clear_flags)) if msg.clear_flags: writers.write_uint32(w, msg.clear_flags) # set flags writers.write_bool(w, bool(msg.set_flags)) if msg.set_flags: writers.write_uint32(w, msg.set_flags) # account thresholds writers.write_bool(w, bool(msg.master_weight)) if msg.master_weight: writers.write_uint32(w, msg.master_weight) writers.write_bool(w, bool(msg.low_threshold)) if msg.low_threshold: writers.write_uint32(w, msg.low_threshold) writers.write_bool(w, bool(msg.medium_threshold)) if msg.medium_threshold: writers.write_uint32(w, msg.medium_threshold) writers.write_bool(w, bool(msg.high_threshold)) if msg.high_threshold: writers.write_uint32(w, msg.high_threshold) # home domain writers.write_bool(w, bool(msg.home_domain)) if msg.home_domain: if len(msg.home_domain) > 32: raise ProcessError( "Stellar: max length of a home domain is 32 bytes") writers.write_string(w, msg.home_domain) # signer writers.write_bool(w, bool(msg.signer_type)) if msg.signer_type: # signer type writers.write_uint32(w, msg.signer_type) writers.write_bytes(w, msg.signer_key) writers.write_uint32(w, msg.signer_weight)
def write_set_options_op(w, msg: StellarSetOptionsOp): # inflation destination if msg.inflation_destination_account is None: writers.write_bool(w, False) else: writers.write_bool(w, True) writers.write_pubkey(w, msg.inflation_destination_account) # clear flags _write_set_options_int(w, msg.clear_flags) # set flags _write_set_options_int(w, msg.set_flags) # account thresholds _write_set_options_int(w, msg.master_weight) _write_set_options_int(w, msg.low_threshold) _write_set_options_int(w, msg.medium_threshold) _write_set_options_int(w, msg.high_threshold) # home domain if msg.home_domain is None: writers.write_bool(w, False) else: writers.write_bool(w, True) if len(msg.home_domain) > 32: raise ProcessError( "Stellar: max length of a home domain is 32 bytes") writers.write_string(w, msg.home_domain) # signer if msg.signer_type is None: writers.write_bool(w, False) elif msg.signer_type in consts.SIGN_TYPES: writers.write_bool(w, True) writers.write_uint32(w, msg.signer_type) writers.write_bytes(w, msg.signer_key) writers.write_uint32(w, msg.signer_weight) else: raise ProcessError("Stellar: unknown signer type")