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_unchecked(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 _write_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_unchecked(w, code + bytearray([0] * (4 - len(code)))) elif asset_type == consts.ASSET_TYPE_ALPHANUM12: # pad with zeros to 12 chars writers.write_bytes_unchecked(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_unchecked(w, network_passphrase_hash) writers.write_bytes_unchecked(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 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_unchecked(w, msg.signer_key) writers.write_uint32(w, msg.signer_weight) else: raise ProcessError("Stellar: unknown signer type")