diff --git a/src/explorer_info.h b/src/explorer_info.h new file mode 100644 index 000000000..28e79bf78 --- /dev/null +++ b/src/explorer_info.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +#define MAX_EXPLORER_LEN 64 + +typedef struct { + uint64_t chain_id; + char name[MAX_EXPLORER_LEN]; +} explorer_info_t; \ No newline at end of file diff --git a/src/explorers.c b/src/explorers.c new file mode 100644 index 000000000..3a5d9efc4 --- /dev/null +++ b/src/explorers.c @@ -0,0 +1,125 @@ +#include "explorers.h" +#include "explorer_info.h" +#include + +static const explorer_info_t EXPLORER_MAPPING[] = { + {.chain_id = 1, .name = "https://etherscan.io/address/"}, + {.chain_id = 3, .name = ""}, // Does not exist + {.chain_id = 4, .name = ""}, // Does not exist + {.chain_id = 5, .name = ""}, // Does not exist + {.chain_id = 10, .name = "https://optimistic.etherscan.io/address/"}, + {.chain_id = 14, .name = "https://flarescan.com/address/"}, + {.chain_id = 16, .name = ""}, + {.chain_id = 19, .name = ""}, + {.chain_id = 24, .name = ""}, + {.chain_id = 25, .name = ""}, + {.chain_id = 30, .name = ""}, + {.chain_id = 40, .name = ""}, + {.chain_id = 42, .name = ""}, + {.chain_id = 50, .name = ""}, + {.chain_id = 51, .name = ""}, + {.chain_id = 56, .name = ""}, + {.chain_id = 57, .name = ""}, + {.chain_id = 61, .name = ""}, + {.chain_id = 66, .name = ""}, + {.chain_id = 82, .name = ""}, + {.chain_id = 99, .name = ""}, + {.chain_id = 100, .name = ""}, + {.chain_id = 106, .name = ""}, + {.chain_id = 137, .name = ""}, + {.chain_id = 138, .name = ""}, + {.chain_id = 146, .name = ""}, + {.chain_id = 196, .name = ""}, + {.chain_id = 199, .name = ""}, + {.chain_id = 246, .name = ""}, + {.chain_id = 248, .name = ""}, + {.chain_id = 250, .name = ""}, + {.chain_id = 288, .name = ""}, + {.chain_id = 300, .name = ""}, + {.chain_id = 321, .name = ""}, + {.chain_id = 324, .name = ""}, + {.chain_id = 336, .name = ""}, + {.chain_id = 369, .name = ""}, + {.chain_id = 592, .name = ""}, + {.chain_id = 888, .name = ""}, + {.chain_id = 943, .name = ""}, + {.chain_id = 1030, .name = ""}, + {.chain_id = 1088, .name = ""}, + {.chain_id = 1101, .name = ""}, + {.chain_id = 1116, .name = ""}, + {.chain_id = 1135, .name = ""}, + {.chain_id = 1284, .name = ""}, + {.chain_id = 1285, .name = ""}, + {.chain_id = 1818, .name = ""}, + {.chain_id = 1868, .name = ""}, + {.chain_id = 1907, .name = ""}, + {.chain_id = 1923, .name = ""}, + {.chain_id = 1924, .name = ""}, + {.chain_id = 1946, .name = ""}, + {.chain_id = 2222, .name = ""}, + {.chain_id = 3776, .name = ""}, + {.chain_id = 4201, .name = ""}, + {.chain_id = 4202, .name = ""}, + {.chain_id = 4689, .name = ""}, + {.chain_id = 4690, .name = ""}, + {.chain_id = 4919, .name = ""}, + {.chain_id = 5000, .name = ""}, + {.chain_id = 5003, .name = ""}, + {.chain_id = 5165, .name = ""}, + {.chain_id = 7000, .name = ""}, + {.chain_id = 7171, .name = ""}, + {.chain_id = 7341, .name = ""}, + {.chain_id = 8217, .name = ""}, + {.chain_id = 8453, .name = "https://basescan.org/address/"}, + {.chain_id = 9001, .name = ""}, + {.chain_id = 10200, .name = ""}, + {.chain_id = 10507, .name = ""}, + {.chain_id = 17000, .name = ""}, + {.chain_id = 39797, .name = ""}, + {.chain_id = 42161, .name = "https://arbiscan.io/address/"}, + {.chain_id = 42220, .name = ""}, + {.chain_id = 42793, .name = ""}, + {.chain_id = 43114, .name = "https://snowtrace.io/address/"}, + {.chain_id = 44787, .name = ""}, + {.chain_id = 47763, .name = ""}, + {.chain_id = 52014, .name = ""}, + {.chain_id = 59141, .name = ""}, + {.chain_id = 59144, .name = ""}, + {.chain_id = 60808, .name = ""}, + {.chain_id = 62320, .name = ""}, + {.chain_id = 62621, .name = ""}, + {.chain_id = 73799, .name = ""}, + {.chain_id = 80094, .name = ""}, + {.chain_id = 81457, .name = ""}, + {.chain_id = 84532, .name = "https://sepolia.basescan.org/address/"}, + {.chain_id = 153153, .name = ""}, + {.chain_id = 200810, .name = ""}, + {.chain_id = 200901, .name = ""}, + {.chain_id = 421614, .name = "https://sepolia.arbiscan.io/address/"}, + {.chain_id = 534351, .name = ""}, + {.chain_id = 534352, .name = ""}, + {.chain_id = 534353, .name = ""}, + {.chain_id = 543210, .name = ""}, + {.chain_id = 5201420, .name = ""}, + {.chain_id = 11155111, .name = "https://sepolia.etherscan.io/address/"}, + {.chain_id = 11155420, .name = "https://sepolia-optimism.etherscan.io/address/"}, + {.chain_id = 12227332, .name = ""}, + {.chain_id = 20531811, .name = ""}, + {.chain_id = 20531812, .name = ""}, + {.chain_id = 168587773, .name = ""}, + {.chain_id = 245022926, .name = ""}, + {.chain_id = 245022934, .name = ""}, + {.chain_id = 994873017, .name = ""}, + {.chain_id = 1666600000, .name = ""}, + {.chain_id = 1666600001, .name = ""}, + {.chain_id = 11297108109, .name = ""}, +}; + +const char *get_explorer_name_from_chain_id(const uint64_t *chain_id) { + for (size_t i = 0; i < sizeof(EXPLORER_MAPPING) / sizeof(EXPLORER_MAPPING[0]); i++) { + if (EXPLORER_MAPPING[i].chain_id == *chain_id) { + return EXPLORER_MAPPING[i].name; + } + } + return NULL; +} \ No newline at end of file diff --git a/src/explorers.h b/src/explorers.h new file mode 100644 index 000000000..d20a22b66 --- /dev/null +++ b/src/explorers.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +const char *get_explorer_name_from_chain_id(const uint64_t *chain_id); \ No newline at end of file diff --git a/src_nbgl/ui_gcs.c b/src_nbgl/ui_gcs.c index 5b0297c4a..18ca66586 100644 --- a/src_nbgl/ui_gcs.c +++ b/src_nbgl/ui_gcs.c @@ -12,6 +12,7 @@ #include "ui_utils.h" #include "enum_value.h" #include "proxy_info.h" +#include "explorers.h" static void review_choice(bool confirm) { if (confirm) { @@ -202,14 +203,17 @@ static bool prepare_infos(nbgl_contentInfoList_t *infos) { return false; } // Etherscan only for mainnet - if (get_tx_chain_id() == ETHEREUM_MAINNET_CHAINID) { + uint64_t tx_chain_id = get_tx_chain_id(); + const char *explorer_name = get_explorer_name_from_chain_id(&tx_chain_id); + if (explorer_name != NULL && explorer_name[0] != '\0') { if ((extensions[contract_idx].explanation = - app_mem_strdup("Scan to view on Etherscan")) == NULL) { + app_mem_strdup("Scan to view on explorer")) == NULL) { return false; } snprintf(tmp_buf, tmp_buf_size, - "https://etherscan.io/address/%s", + "%s%s", + explorer_name, extensions[contract_idx].title); if ((extensions[contract_idx].fullValue = app_mem_strdup(tmp_buf)) == NULL) { return false;