Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 10 additions & 0 deletions src/explorer_info.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#pragma once

#include <stdint.h>

#define MAX_EXPLORER_LEN 64

typedef struct {
uint64_t chain_id;
char name[MAX_EXPLORER_LEN];
} explorer_info_t;
125 changes: 125 additions & 0 deletions src/explorers.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#include "explorers.h"
#include "explorer_info.h"
#include <stddef.h>

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;
}
5 changes: 5 additions & 0 deletions src/explorers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#pragma once

#include <stdint.h>

const char *get_explorer_name_from_chain_id(const uint64_t *chain_id);
10 changes: 7 additions & 3 deletions src_nbgl/ui_gcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down