From 0414a043c8e3f338528ffa897cd9b441d5e6cbde Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Tue, 21 Feb 2023 11:15:20 +0100 Subject: [PATCH] rework plugin start so name and icon can be passed to eth --- src/chainConfig.h | 7 +++++++ src/main.c | 43 +++++++++++++++++++++++-------------------- src/shared_context.h | 2 ++ src/swap_lib_calls.h | 13 +++++++++++++ src_common/network.c | 13 ++++++++++++- 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/chainConfig.h b/src/chainConfig.h index 070de49..63a4324 100644 --- a/src/chainConfig.h +++ b/src/chainConfig.h @@ -77,10 +77,17 @@ typedef enum chain_kind_e { CHAIN_KIND_OASYS } chain_kind_t; +#ifdef HAVE_NBGL +#include "nbgl_types.h" +#endif // HAVE_NBGL + typedef struct chain_config_s { char coinName[10]; // ticker uint64_t chainId; chain_kind_t kind; +#ifdef HAVE_NBGL + nbgl_icon_details_t coinIconDetails; +#endif // HAVE_NBGL } chain_config_t; #define ETHEREUM_MAINNET_CHAINID 1 diff --git a/src/main.c b/src/main.c index 67442b0..7032183 100644 --- a/src/main.c +++ b/src/main.c @@ -69,7 +69,8 @@ bolos_ux_params_t G_ux_params; const internalStorage_t N_storage_real; -chain_config_t *chainConfig; +const char *plugin_name = NULL; +chain_config_t *chainConfig = NULL; void reset_app_context() { // PRINTF("!!RESET_APP_CONTEXT\n"); @@ -950,14 +951,19 @@ void init_coin_config(chain_config_t *coin_config) { coin_config->kind = CHAIN_KIND; } -void coin_main(chain_config_t *coin_config) { +void coin_main(libargs_t *args) { chain_config_t config; - if (coin_config == NULL) { + if (args) { + if (args->chain_config != NULL) { + chainConfig = args->chain_config; + } + plugin_name = args->plugin_name; + } + if (chainConfig == NULL) { init_coin_config(&config); chainConfig = &config; - } else { - chainConfig = coin_config; } + reset_app_context(); tmpCtx.transactionContext.currentItemIndex = 0; @@ -1031,18 +1037,7 @@ void coin_main(chain_config_t *coin_config) { app_exit(); } -struct libargs_s { - unsigned int id; - unsigned int command; - chain_config_t *chain_config; - union { - check_address_parameters_t *check_address; - create_transaction_parameters_t *create_transaction; - get_printable_amount_parameters_t *get_printable_amount; - }; -}; - -static void library_main_helper(struct libargs_s *args) { +static void library_main_helper(libargs_t *args) { check_api_level(CX_COMPAT_APILEVEL); PRINTF("Inside a library \n"); switch (args->command) { @@ -1070,7 +1065,7 @@ static void library_main_helper(struct libargs_s *args) { } } -void library_main(struct libargs_s *args) { +void library_main(libargs_t *args) { chain_config_t coin_config; if (args->chain_config == NULL) { init_coin_config(&coin_config); @@ -1102,6 +1097,13 @@ __attribute__((section(".boot"))) int main(int arg0) { unsigned int libcall_params[5]; chain_config_t local_chainConfig; init_coin_config(&local_chainConfig); +#ifdef HAVE_NBGL + uint8_t coinIcon[sizeof(ICONBITMAP)]; + memcpy(coinIcon, &ICONBITMAP, sizeof(ICONBITMAP)); + memcpy(&local_chainConfig.coinIconDetails, &ICONGLYPH, sizeof(ICONGLYPH)); + local_chainConfig.coinIconDetails.bitmap = coinIcon; +#endif // HAVE_NBGL + PRINTF("Hello from Eth-clone\n"); check_api_level(CX_COMPAT_APILEVEL); // delegate to Ethereum app/lib @@ -1110,6 +1112,7 @@ __attribute__((section(".boot"))) int main(int arg0) { libcall_params[2] = RUN_APPLICATION; libcall_params[3] = (unsigned int) &local_chainConfig; libcall_params[4] = 0; + if (arg0) { // call as a library libcall_params[2] = ((unsigned int *) arg0)[1]; @@ -1141,7 +1144,7 @@ __attribute__((section(".boot"))) int main(int arg0) { return 0; } - struct libargs_s *args = (struct libargs_s *) arg0; + libargs_t *args = (libargs_t *) arg0; if (args->id != 0x100) { app_exit(); return 0; @@ -1149,7 +1152,7 @@ __attribute__((section(".boot"))) int main(int arg0) { switch (args->command) { case RUN_APPLICATION: // called as ethereum from altcoin or plugin - coin_main(args->chain_config); + coin_main(args); break; default: // called as ethereum or altcoin library diff --git a/src/shared_context.h b/src/shared_context.h index ce907dd..e4d3c4d 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -229,6 +229,8 @@ extern bool quantumSet; extern uint32_t eth2WithdrawalIndex; #endif +extern const char *plugin_name; + void reset_app_context(void); const uint8_t *parseBip32(const uint8_t *dataBuffer, uint8_t *dataLength, bip32_path_t *bip32); diff --git a/src/swap_lib_calls.h b/src/swap_lib_calls.h index 9bdb115..1bca6c2 100644 --- a/src/swap_lib_calls.h +++ b/src/swap_lib_calls.h @@ -2,6 +2,7 @@ #define _SWAP_LIB_CALLS_H_ #include "stdbool.h" +#include "chainConfig.h" #define RUN_APPLICATION 1 @@ -52,4 +53,16 @@ typedef struct create_transaction_parameters_s { const char* const destination_address_extra_id; } create_transaction_parameters_t; +typedef struct libargs_s { + unsigned int id; + unsigned int command; + chain_config_t* chain_config; + union { + check_address_parameters_t* check_address; + create_transaction_parameters_t* create_transaction; + get_printable_amount_parameters_t* get_printable_amount; + char* plugin_name; + }; +} libargs_t; + #endif // _SWAP_LIB_CALLS_H_ diff --git a/src_common/network.c b/src_common/network.c index 1111134..7366179 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -135,4 +135,15 @@ const char *get_app_network_ticker(void) { const char *get_tx_network_ticker(void) { return get_network_ticker(TX); -} \ No newline at end of file +} + +#ifdef HAVE_NBGL +#include "glyphs.h" +const nbgl_icon_details_t *get_app_chain_icon(void) { + if (chainConfig->coinIconDetails.bitmap) { + return &chainConfig->coinIconDetails; // if called from a clone, the bitmap is correct + } else { + return &ICONGLYPH; // else, jsu return the ETH icon + } +} +#endif // HAVE_NBGL \ No newline at end of file