Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
35b46de
feat: Add stellar to cmake
Keyur279 Jul 8, 2025
cd36a59
feat: Add proto-options for stellar
Keyur279 Jul 8, 2025
32f9713
feat: Registered stellar app
Keyur279 Jul 8, 2025
be930b5
feat: Add main and api files
Keyur279 Jul 8, 2025
1d6af75
feat: Add stellar context and helper files
Keyur279 Jul 8, 2025
8aec6df
feat: Add stellar key handling files
Keyur279 Jul 8, 2025
b5e7642
feat: Registered stellar app
Keyur279 Jul 8, 2025
bdff72a
chore: Update cypherock-common for stellar
Keyur279 Jul 21, 2025
c99340f
feat: Add reference links to stellar files
Keyur279 Jul 25, 2025
f35100d
feat: Add reference links to stellar files
Keyur279 Jul 25, 2025
2af5061
feat: Address stellar review feedback
Keyur279 Jul 29, 2025
5c155b4
feat: Address stellar review feedback
Keyur279 Jul 29, 2025
6207e64
feat: Add reference for signature creation
Keyur279 Jul 30, 2025
fefd570
chore: Address feedbacks remove re-parsing of xdr
Keyur279 Aug 4, 2025
3578a93
chore: Remove display text for operation
Keyur279 Aug 4, 2025
fa40580
fix: Set stellar signature response fix length and resolve reviews
muzaffarbhat07 Aug 4, 2025
39d24ee
fix: Stellar txn structure and data types
muzaffarbhat07 Aug 4, 2025
9aa8d63
fix: Stellar verify fee
muzaffarbhat07 Aug 4, 2025
0e30211
fix: Stellar verify memo and review comments
muzaffarbhat07 Aug 4, 2025
ba1e16b
fix: Added stellar xdr string padding reference
muzaffarbhat07 Aug 5, 2025
dcae63c
fix: Stellar txn preconditions and extension
muzaffarbhat07 Aug 5, 2025
932f0f6
fix: Complete stellar txn parsing
muzaffarbhat07 Aug 6, 2025
b343e09
Merge pull request #666 from Cypherock/fix/stellar/reviews
muzaffarbhat07 Aug 6, 2025
6985f9c
fix: Stellar amount and fee display format
muzaffarbhat07 Aug 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 198 additions & 0 deletions apps/stellar_app/stellar_api.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
/**
* @file stellar_api.c
* @author Cypherock X1 Team
* @brief Defines helpers apis for Stellar app.
* @copyright Copyright (c) 2025 HODL TECH PTE LTD
* <br/> You may obtain a copy of license at <a href="https://mitcc.org/"
*target=_blank>https://mitcc.org/</a>
*
******************************************************************************
* @attention
*
* (c) Copyright 2025 by HODL TECH PTE LTD
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*
* "Commons Clause" License Condition v1.0
*
* The Software is provided to you by the Licensor under the License,
* as defined below, subject to the following condition.
*
* Without limiting other conditions in the License, the grant of
* rights under the License will not include, and the License does not
* grant to you, the right to Sell the Software.
*
* For purposes of the foregoing, "Sell" means practicing any or all
* of the rights granted to you under the License to provide to third
* parties, for a fee or other consideration (including without
* limitation fees for hosting or consulting/ support services related
* to the Software), a product or service whose value derives, entirely
* or substantially, from the functionality of the Software. Any license
* notice or attribution required by the License must also include
* this Commons Clause License Condition notice.
*
* Software: All X1Wallet associated files.
* License: MIT
* Licensor: HODL TECH PTE LTD
*
******************************************************************************
*/

/*****************************************************************************
* INCLUDES
*****************************************************************************/

#include "stellar_api.h"

#include <pb_decode.h>
#include <pb_encode.h>

#include "common_error.h"
#include "core_api.h"
#include "events.h"

/*****************************************************************************
* EXTERN VARIABLES
*****************************************************************************/

/*****************************************************************************
* PRIVATE MACROS AND DEFINES
*****************************************************************************/

/*****************************************************************************
* PRIVATE TYPEDEFS
*****************************************************************************/

/*****************************************************************************
* STATIC VARIABLES
*****************************************************************************/

/*****************************************************************************
* GLOBAL VARIABLES
*****************************************************************************/

/*****************************************************************************
* STATIC FUNCTION PROTOTYPES
*****************************************************************************/

/*****************************************************************************
* STATIC FUNCTIONS
*****************************************************************************/

/*****************************************************************************
* GLOBAL FUNCTIONS
*****************************************************************************/
bool decode_stellar_query(const uint8_t *data,
uint16_t data_size,
stellar_query_t *query_out) {
if (NULL == data || NULL == query_out || 0 == data_size) {
stellar_send_error(ERROR_COMMON_ERROR_CORRUPT_DATA_TAG,
ERROR_DATA_FLOW_DECODING_FAILED);
return false;
}

// zeroise for safety from garbage in the query reference
memzero(query_out, sizeof(stellar_query_t));

/* Create a stream that reads from the buffer. */
pb_istream_t stream = pb_istream_from_buffer(data, data_size);

/* Now we are ready to decode the message. */
bool status = pb_decode(&stream, STELLAR_QUERY_FIELDS, query_out);

/* Send error to host if status is false*/
if (false == status) {
stellar_send_error(ERROR_COMMON_ERROR_CORRUPT_DATA_TAG,
ERROR_DATA_FLOW_DECODING_FAILED);
}

return status;
}

bool encode_stellar_result(const stellar_result_t *result,
uint8_t *buffer,
uint16_t max_buffer_len,
size_t *bytes_written_out) {
if (NULL == result || NULL == buffer || NULL == bytes_written_out)
return false;

/* Create a stream that will write to our buffer. */
pb_ostream_t stream = pb_ostream_from_buffer(buffer, max_buffer_len);

/* Now we are ready to encode the message! */
bool status = pb_encode(&stream, STELLAR_RESULT_FIELDS, result);

if (true == status) {
*bytes_written_out = stream.bytes_written;
}

return status;
}

bool check_stellar_query(const stellar_query_t *query,
pb_size_t exp_query_tag) {
if ((NULL == query) || (exp_query_tag != query->which_request)) {
stellar_send_error(ERROR_COMMON_ERROR_CORRUPT_DATA_TAG,
ERROR_DATA_FLOW_INVALID_QUERY);
return false;
}
return true;
}

stellar_result_t init_stellar_result(pb_size_t result_tag) {
stellar_result_t result = STELLAR_RESULT_INIT_ZERO;
result.which_response = result_tag;
return result;
}

void stellar_send_error(pb_size_t which_error, uint32_t error_code) {
stellar_result_t result =
init_stellar_result(STELLAR_RESULT_COMMON_ERROR_TAG);
result.common_error = init_common_error(which_error, error_code);
stellar_send_result(&result);
}

void stellar_send_result(const stellar_result_t *result) {
// TODO: Set all option files
uint8_t buffer[1700] = {0};
size_t bytes_encoded = 0;
ASSERT(encode_stellar_result(result, buffer, sizeof(buffer), &bytes_encoded));
send_response_to_host(&buffer[0], bytes_encoded);
}

bool stellar_get_query(stellar_query_t *query, pb_size_t exp_query_tag) {
evt_status_t event = get_events(EVENT_CONFIG_USB, MAX_INACTIVITY_TIMEOUT);

if (true == event.p0_event.flag) {
return false;
}

if (!decode_stellar_query(
event.usb_event.p_msg, event.usb_event.msg_size, query)) {
return false;
}

if (!check_stellar_query(query, exp_query_tag)) {
return false;
}

return true;
}
113 changes: 113 additions & 0 deletions apps/stellar_app/stellar_api.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/**
* @file stellar_api.h
* @author Cypherock X1 Team
* @brief Header file to export some helper functions for the Stellar app
* @copyright Copyright (c) 2025 HODL TECH PTE LTD
* <br/> You may obtain a copy of license at <a href="https://mitcc.org/"
* target=_blank>https://mitcc.org/</a>
*/
#ifndef STELLAR_API_H
#define STELLAR_API_H

/*****************************************************************************
* INCLUDES
*****************************************************************************/

#include <stdint.h>
#include <stellar/core.pb.h>

/*****************************************************************************
* MACROS AND DEFINES
*****************************************************************************/

/*****************************************************************************
* TYPEDEFS
*****************************************************************************/

/*****************************************************************************
* EXPORTED VARIABLES
*****************************************************************************/

/*****************************************************************************
* GLOBAL FUNCTION PROTOTYPES
*****************************************************************************/

/**
* @brief API to decode query from host with `STELLAR_QUERY_FIELDS`
*
* @param[in] data: PB encoded bytestream received from host
* @param[in] data_size: size of pb encoded bytestream
* @param[out] query_out: @ref stellar_query_t obj to copy the decoded result to
* @return bool True if decoding was successful, else false
*/
bool decode_stellar_query(const uint8_t *data,
uint16_t data_size,
stellar_query_t *query_out);

/**
* @brief Encodes the STELLAR result with `STELLAR_RESULT_FIELDS` to byte-stream
*
* @param[in] result: object of populated @ref stellar_result_t to be encoded
* @param[out] buffer: buffer to fill byte-stream into
* @param[in] max_buffer_len: Max length allowed for writing bytestream to
* buffer
* @param[out] bytes_written_out: bytes written to bytestream
* @return bool True if decoding was successful, else false
*/
bool encode_stellar_result(const stellar_result_t *result,
uint8_t *buffer,
uint16_t max_buffer_len,
size_t *bytes_written_out);

/**
* @brief This API checks if the `which_request` field of the query of type
* `stellar_query_t` matches against the expected tag.
*
* @param query The query of type `stellar_query_t` to be checked
* @param exp_query_tag The expected tag of the query
* @return true If the query tag matches the expected tag
* @return false If the query tag does not match the expected tag
*/
bool check_stellar_query(const stellar_query_t *query, pb_size_t exp_query_tag);

/**
* @brief Returns zero initialized object of type
* stellar_result_t result_tag set in result.which_response field
*
* @param result_tag Result tag to be set in the stellar_result_t result
* @return stellar_result_t Result object of type stellar_result_t
*/
stellar_result_t init_stellar_result(pb_size_t result_tag);

/**
* @brief Send the error to the host.
*
* @param which_error The error type to be sent
* @param error_code The error code to sent to the host
*/
void stellar_send_error(pb_size_t which_error, uint32_t error_code);

/**
* @brief This API encodes stellar_result_t in protobuf structure.
* @details If the encoding is successful, then it sends the corresponding
* result to the host.
*
* The function ASSERTs the result of encode_stellar_result internally.
*
* @param result The result which needs to be sent to the host.
*/
void stellar_send_result(const stellar_result_t *result);

/**
* @brief This API receives request of type stellar_query_t of type
* exp_query_tag from the host.
*
* @param query The reference to which the query needs to be populated
* @param exp_query_tag The expected tag of the query
* @return true If the query was recieved from the host matching the tag
* @return false If the request timed out or the recieved request did not match
* the tag
*/
bool stellar_get_query(stellar_query_t *query, pb_size_t exp_query_tag);

#endif
Loading