diff --git a/Makefile b/Makefile index 553ab70..3b7e2ba 100755 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ APP_LOAD_PARAMS= --curve secp256k1 $(COMMON_LOAD_PARAMS) APPVERSION_M=1 APPVERSION_N=1 -APPVERSION_P=3 +APPVERSION_P=4 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) @@ -116,7 +116,7 @@ DEFINES += CHAINID_UPCASE=\"EOSCLASSIC\" CHAINID_COINNAME=\"EOSC\" CHAIN_KIND=CH APPNAME = "EOSClassic" else ifeq ($(filter clean,$(MAKECMDGOALS)),) -$(error Unsupported CHAIN - use ethereum, ethereum_classic, expanse, poa, rsk, rsk_testnet, ubiq, wanchain, kusd, musicoin, callisto, ethersocial, ellaism, pirl, akroma, ether1, ethergem, atheios, eosclassic) +$(error Unsupported CHAIN - use ethereum, ethereum_classic, expanse, poa, rsk, rsk_testnet, ubiq, wanchain, kusd, musicoin, pirl, akroma, atheios, callisto, ethersocial, ellaism, ether1, ethergem, eosclassic) endif endif @@ -205,7 +205,7 @@ delete: include $(BOLOS_SDK)/Makefile.rules #add dependency on custom makefile filename -dep/%.d: %.c Makefile.genericwallet +dep/%.d: %.c Makefile listvariants: - @echo VARIANTS CHAIN ethereum ethereum_classic expanse poa rsk rsk_testnet ubiq wanchain kusd #musicoin callisto ethersocial ellaism pirl akroma ether1 ethergem atheios eosclassic + @echo VARIANTS CHAIN ethereum ethereum_classic expanse poa rsk rsk_testnet ubiq wanchain kusd pirl akroma # musicoin atheios callisto ethersocial ellaism ether1 ethergem eosclassic diff --git a/akroma.png b/akroma.png new file mode 100644 index 0000000..22baa92 Binary files /dev/null and b/akroma.png differ diff --git a/atheios.png b/atheios.png new file mode 100644 index 0000000..22af8d2 Binary files /dev/null and b/atheios.png differ diff --git a/blue_app_akroma.gif b/blue_app_akroma.gif index b1a656a..12c9cd2 100644 Binary files a/blue_app_akroma.gif and b/blue_app_akroma.gif differ diff --git a/blue_app_atheios.gif b/blue_app_atheios.gif index c3d5c4e..99e4520 100644 Binary files a/blue_app_atheios.gif and b/blue_app_atheios.gif differ diff --git a/blue_app_musicoin.gif b/blue_app_musicoin.gif index f66dac0..42f8185 100644 Binary files a/blue_app_musicoin.gif and b/blue_app_musicoin.gif differ diff --git a/blue_app_pirl.gif b/blue_app_pirl.gif index 1376610..a6824ae 100644 Binary files a/blue_app_pirl.gif and b/blue_app_pirl.gif differ diff --git a/musicoin.png b/musicoin.png new file mode 100644 index 0000000..2d6ec90 Binary files /dev/null and b/musicoin.png differ diff --git a/nanos_app_akroma.gif b/nanos_app_akroma.gif index fcb4e88..1ea56c5 100644 Binary files a/nanos_app_akroma.gif and b/nanos_app_akroma.gif differ diff --git a/nanos_app_atheios.gif b/nanos_app_atheios.gif index 590a37a..d63c299 100644 Binary files a/nanos_app_atheios.gif and b/nanos_app_atheios.gif differ diff --git a/nanos_app_musicoin.gif b/nanos_app_musicoin.gif index 94b6195..34778b2 100644 Binary files a/nanos_app_musicoin.gif and b/nanos_app_musicoin.gif differ diff --git a/nanos_app_pirl.gif b/nanos_app_pirl.gif index 6cb1f5b..852d4d5 100644 Binary files a/nanos_app_pirl.gif and b/nanos_app_pirl.gif differ diff --git a/pirl.png b/pirl.png new file mode 100644 index 0000000..9ba9202 Binary files /dev/null and b/pirl.png differ diff --git a/src_chainsplit/main.c b/src_chainsplit/main.c deleted file mode 100644 index caee8be..0000000 --- a/src_chainsplit/main.c +++ /dev/null @@ -1,1405 +0,0 @@ -/******************************************************************************* -* Ledger Blue -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include "os.h" -#include "cx.h" -#include -#include "ethUstream.h" -#include "ethUtils.h" -#include "uint256.h" - -#include "os_io_seproxyhal.h" -#include "string.h" -unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; - -unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e); - -uint32_t set_result_get_publicKey(void); - -#define MAX_BIP32_PATH 10 - -#define CLA 0xE0 -#define INS_GET_PUBLIC_KEY 0x02 -#define INS_SIGN 0x04 -#define INS_ADD_SELF 0x06 -#define P1_CONFIRM 0x01 -#define P1_NON_CONFIRM 0x00 -#define P1_FIRST 0x00 -#define P1_MORE 0x80 - -#define OFFSET_CLA 0 -#define OFFSET_INS 1 -#define OFFSET_P1 2 -#define OFFSET_P2 3 -#define OFFSET_LC 4 -#define OFFSET_CDATA 5 - -#define WEI_TO_ETHER 18 - -typedef struct publicKeyContext_t { - cx_ecfp_public_key_t publicKey; - uint8_t address[41]; -} publicKeyContext_t; - -typedef struct transactionContext_t { - uint8_t pathLength; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint8_t hash[32]; -} transactionContext_t; - -typedef struct splitContext_t { - uint8_t data[4 + 32 + 32]; - uint8_t targetAddress[20]; - bool targetAddressProvided; -} splitContext_t; - -union { - publicKeyContext_t publicKeyContext; - transactionContext_t transactionContext; -} tmpCtx; -txContext_t txContext; -txContent_t txContent; -splitContext_t splitContext; -cx_sha3_t sha3; -volatile char addressSummary[21]; -volatile char address1[21]; -volatile char address2[21]; -volatile char fullAmount[50]; -volatile char splitType[50]; -volatile char gasPrice[50]; -volatile char startgas[50]; - -ux_state_t ux; -// display stepped screens -unsigned int ux_step; -unsigned int ux_step_count; - -static const char *const SPLIT_TO_ETH = "Split to ETH"; -static const char *const SPLIT_TO_ETC = "Split to ETC"; - -static const uint8_t const SPLIT_TRANSFER_ID[] = {0x9c, 0x70, 0x93, 0x43}; -static const uint8_t const SPLIT_ADDRESS[] = { - 0x5d, 0xc8, 0x10, 0x8f, 0xc7, 0x90, 0x18, 0x11, 0x3a, 0x58, - 0x32, 0x8f, 0x52, 0x83, 0xb3, 0x76, 0xb8, 0x39, 0x22, 0xef}; - -// UI displayed when no signature proposal has been received -static const bagl_element_t const ui_idle_blue[] = { - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 480, 0, 0, BAGL_FILL, 0xf9f9f9, 0xf9f9f9, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 60, 0, 0, BAGL_FILL, 0x1d2028, 0x1d2028, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABEL, 0x00, 20, 0, 320, 60, 0, 0, BAGL_FILL, 0xFFFFFF, 0x1d2028, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_MIDDLE, 0}, - "ETC<>ETH split", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 190, 215, 120, 40, 0, 6, - BAGL_FILL, 0x41ccb4, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "Exit", - 0, - 0x37ae99, - 0xF9F9F9, - io_seproxyhal_touch_exit, - NULL, - NULL}}; - -unsigned int ui_idle_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { - return 0; -} - -const bagl_element_t ui_idle_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x01, 17, 9, 14, 14, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_ETHEREUM_BADGE}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 38, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px, 0}, - "Use wallet to", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 39, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px, 0}, - "split ETH<>ETC", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x01, 118, 14, 7, 4, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_DOWN}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x02, 29, 9, 14, 14, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_DASHBOARD_BADGE}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - //{{BAGL_LABELINE , 0x02, 0, 3, 128, 32, 0, 0, 0 - //, 0xFFFFFF, 0x000000, - //BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "view - //accounts", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x02, 50, 19, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px, 0}, - "Quit app", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x02, 3, 14, 7, 4, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_UP}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; -unsigned int ui_idle_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter); - -unsigned int ui_idle_nanos_state; -unsigned int ui_idle_nanos_prepro(const bagl_element_t *element) { - if (element->component.userid > 0) { - return (ui_idle_nanos_state == element->component.userid - 1); - } - return 1; -} - -bagl_element_t const ui_address_blue[] = { - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 480, 0, 0, BAGL_FILL, 0xf9f9f9, 0xf9f9f9, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - // type id x y w h s r fill - // fg bg font icon text, out, over, touch - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 60, 0, 0, BAGL_FILL, 0x1d2028, 0x1d2028, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 20, 0, 320, 60, 0, 0, BAGL_FILL, 0xFFFFFF, 0x1d2028, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_MIDDLE, 0}, - "ETC<>ETH split", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 35, 385, 120, 40, 0, 6, - BAGL_FILL, 0xcccccc, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CANCEL", - 0, - 0x37ae99, - 0xF9F9F9, - io_seproxyhal_touch_address_cancel, - NULL, - NULL}, - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 165, 385, 120, 40, 0, 6, - BAGL_FILL, 0x41ccb4, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CONFIRM", - 0, - 0x37ae99, - 0xF9F9F9, - io_seproxyhal_touch_address_ok, - NULL, - NULL}, - - {{BAGL_LABEL, 0x00, 0, 147, 320, 32, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm address", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 280, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 310, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address1, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 330, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address2, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; -unsigned int ui_address_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { - return 0; -} - -const bagl_element_t ui_address_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x01, 31, 9, 14, 14, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_EYE_BADGE}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 52, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 53, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px, 0}, - "account", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Account", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; - -unsigned int ui_address_prepro(const bagl_element_t *element) { - if (element->component.userid > 0) { - unsigned int display = (ux_step == element->component.userid - 1); - if (display) { - switch (element->component.userid) { - case 1: - io_seproxyhal_setup_ticker(2000); - break; - case 2: - io_seproxyhal_setup_ticker(3000); - break; - } - } - return display; - } - return 1; -} - -unsigned int ui_address_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter); - -// UI to approve or deny the signature proposal -static const bagl_element_t const ui_approval_blue[] = { - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 480, 0, 0, BAGL_FILL, 0xf9f9f9, 0xf9f9f9, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - // type id x y w h s r fill - // fg bg font icon text, out, over, touch - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 60, 0, 0, BAGL_FILL, 0x1d2028, 0x1d2028, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 20, 0, 320, 60, 0, 0, BAGL_FILL, 0xFFFFFF, 0x1d2028, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_MIDDLE, 0}, - "ETC<>ETH split", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 35, 385, 120, 40, 0, 6, - BAGL_FILL, 0xcccccc, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CANCEL", - 0, - 0x37ae99, - 0xF9F9F9, - io_seproxyhal_touch_tx_cancel, - NULL, - NULL}, - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 165, 385, 120, 40, 0, 6, - BAGL_FILL, 0x41ccb4, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CONFIRM", - 0, - 0x37ae99, - 0xF9F9F9, - io_seproxyhal_touch_tx_ok, - NULL, - NULL}, - - {{BAGL_LABEL, 0x00, 0, 87, 320, 32, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "CONFIRM SPLIT", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 125, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)fullAmount, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 175, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 205, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address1, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 225, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address2, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 265, 320, 32, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Gas price / start", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 305, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)gasPrice, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 325, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)startgas, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - -}; -unsigned int ui_approval_blue_button(unsigned int button_mask, - unsigned int button_mask_counter) { - return 0; -} - -const bagl_element_t ui_approval_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x01, 21, 9, 14, 14, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_TRANSACTION_BADGE}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 42, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 43, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px, 0}, - splitType, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Amount", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 11, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - fullAmount, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x03, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Recipient account", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x03, 16, 26, 96, 11, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x04, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Gas price", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x04, 23, 26, 82, 11, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - gasPrice, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x05, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Gas limit", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x05, 23, 26, 82, 11, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - startgas, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; - -unsigned int ui_approval_prepro(const bagl_element_t *element) { - if (element->component.userid > 0) { - unsigned int display = (ux_step == element->component.userid - 1); - if (display) { - switch (element->component.userid) { - case 1: - io_seproxyhal_setup_ticker(2000); - break; - case 3: - io_seproxyhal_setup_ticker(3000); - break; - case 2: - io_seproxyhal_setup_ticker(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - case 4: - io_seproxyhal_setup_ticker(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - case 5: - io_seproxyhal_setup_ticker(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - } - } - return display; - } - return 1; -} - -unsigned int ui_approval_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter); - -void ui_idle(void) { - if (os_seph_features() & - SEPROXYHAL_TAG_SESSION_START_EVENT_FEATURE_SCREEN_BIG) { - UX_DISPLAY(ui_idle_blue, NULL); - } else { - ui_idle_nanos_state = 0; // start by displaying the idle first screen - UX_DISPLAY(ui_idle_nanos, ui_idle_nanos_prepro); - } -} - -unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e) { - // Go back to the dashboard - os_sched_exit(0); - return 0; // do not redraw the widget -} - -unsigned int ui_idle_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) { - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: // UP - if (ui_idle_nanos_state == 1) { - ui_idle_nanos_state = 0; - UX_DISPLAY(ui_idle_nanos, ui_idle_nanos_prepro); - } - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: // DOWN - if (ui_idle_nanos_state == 0) { - ui_idle_nanos_state = 1; - UX_DISPLAY(ui_idle_nanos, ui_idle_nanos_prepro); - } - break; - - case BUTTON_EVT_RELEASED | BUTTON_LEFT | BUTTON_RIGHT: // EXIT - if (ui_idle_nanos_state == 1) { - io_seproxyhal_touch_exit(NULL); - } - break; - } - return 0; -} - -unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e) { - uint32_t tx = set_result_get_publicKey(); - G_io_apdu_buffer[tx++] = 0x90; - G_io_apdu_buffer[tx++] = 0x00; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - // Display back the original UX - ui_idle(); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e) { - G_io_apdu_buffer[0] = 0x69; - G_io_apdu_buffer[1] = 0x85; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); - // Display back the original UX - ui_idle(); - return 0; // do not redraw the widget -} - -unsigned int ui_address_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) { - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL - io_seproxyhal_touch_address_cancel(NULL); - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: { // OK - io_seproxyhal_touch_address_ok(NULL); - break; - } - } - return 0; -} - -unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { - uint8_t privateKeyData[32]; - uint8_t signature[100]; - uint8_t signatureLength; - cx_ecfp_private_key_t privateKey; - uint32_t tx = 0; - uint8_t rLength, sLength, rOffset, sOffset; - os_perso_derive_node_bip32( - CX_CURVE_256K1, tmpCtx.transactionContext.bip32Path, - tmpCtx.transactionContext.pathLength, privateKeyData, NULL); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - os_memset(privateKeyData, 0, sizeof(privateKeyData)); - signatureLength = - cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - tmpCtx.transactionContext.hash, - sizeof(tmpCtx.transactionContext.hash), signature); - os_memset(&privateKey, 0, sizeof(privateKey)); - // Parity is present in the sequence tag in the legacy API - G_io_apdu_buffer[0] = 27 + (signature[0] & 0x01); - rLength = signature[3]; - sLength = signature[4 + rLength + 1]; - rOffset = (rLength == 33 ? 1 : 0); - sOffset = (sLength == 33 ? 1 : 0); - os_memmove(G_io_apdu_buffer + 1, signature + 4 + rOffset, 32); - os_memmove(G_io_apdu_buffer + 1 + 32, signature + 4 + rLength + 2 + sOffset, - 32); - tx = 65; - G_io_apdu_buffer[tx++] = 0x90; - G_io_apdu_buffer[tx++] = 0x00; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - // Display back the original UX - ui_idle(); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e) { - G_io_apdu_buffer[0] = 0x69; - G_io_apdu_buffer[1] = 0x85; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); - // Display back the original UX - ui_idle(); - return 0; // do not redraw the widget -} - -unsigned int ui_approval_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) { - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: - io_seproxyhal_touch_tx_cancel(NULL); - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: { - io_seproxyhal_touch_tx_ok(NULL); - break; - } - } - return 0; -} - -unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { - switch (channel & ~(IO_FLAGS)) { - case CHANNEL_KEYBOARD: - break; - - // multiplexed io exchange over a SPI channel and TLV encapsulated protocol - case CHANNEL_SPI: - if (tx_len) { - io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); - - if (channel & IO_RESET_AFTER_REPLIED) { - reset(); - } - return 0; // nothing received from the master so far (it's a tx - // transaction) - } else { - return io_seproxyhal_spi_recv(G_io_apdu_buffer, - sizeof(G_io_apdu_buffer), 0); - } - - default: - THROW(INVALID_PARAMETER); - } - return 0; -} - -uint32_t set_result_get_publicKey() { - uint32_t tx = 0; - G_io_apdu_buffer[tx++] = 65; - os_memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.publicKey.W, 65); - tx += 65; - G_io_apdu_buffer[tx++] = 40; - os_memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.address, 40); - tx += 40; - return tx; -} - -void convertUint256BE(uint8_t *data, uint32_t length, uint256_t *target) { - uint8_t tmp[32]; - os_memset(tmp, 0, 32); - os_memmove(tmp + 32 - length, data, length); - readu256BE(tmp, target); -} - -bool customProcessor(txContext_t *context) { - if (context->currentField != TX_RLP_DATA) { - return false; - } - if (context->currentFieldLength != sizeof(splitContext.data)) { - screen_printf("Invalid length for RLP_DATA\n"); - THROW(EXCEPTION); - } - if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = - (context->commandLength < - ((context->currentFieldLength - context->currentFieldPos)) - ? context->commandLength - : context->currentFieldLength - context->currentFieldPos); - copyTxData(context, splitContext.data + context->currentFieldPos, - copySize); - } - if (context->currentFieldPos == context->currentFieldLength) { - context->currentField++; - context->processingField = false; - } - - return true; -} - -void sample_main(void) { - volatile unsigned int rx = 0; - volatile unsigned int tx = 0; - volatile unsigned int flags = 0; - - // DESIGN NOTE: the bootloader ignores the way APDU are fetched. The only - // goal is to retrieve APDU. - // When APDU are to be fetched from multiple IOs, like NFC+USB+BLE, make - // sure the io_event is called with a - // switch event, before the apdu is replied to the bootloader. This avoid - // APDU injection faults. - for (;;) { - volatile unsigned short sw = 0; - - BEGIN_TRY { - TRY { - rx = tx; - tx = 0; // ensure no race in catch_other if io_exchange throws - // an error - rx = io_exchange(CHANNEL_APDU | flags, rx); - flags = 0; - - // no apdu received, well, reset the session, and reset the - // bootloader configuration - if (rx == 0) { - THROW(0x6982); - } - - if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { - THROW(0x6E00); - } - - switch (G_io_apdu_buffer[OFFSET_INS]) { - case INS_GET_PUBLIC_KEY: { - uint8_t privateKeyData[32]; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = G_io_apdu_buffer[OFFSET_CDATA]; - uint8_t p1 = G_io_apdu_buffer[OFFSET_P1]; - uint8_t *dataBuffer = G_io_apdu_buffer + OFFSET_CDATA + 1; - cx_ecfp_private_key_t privateKey; - - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - screen_printf("Invalid path\n"); - THROW(0x6a80); - } - if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { - THROW(0x6B00); - } - if (G_io_apdu_buffer[OFFSET_P2] != 0) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = (dataBuffer[0] << 24) | - (dataBuffer[1] << 16) | - (dataBuffer[2] << 8) | (dataBuffer[3]); - dataBuffer += 4; - } - os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, - bip32PathLength, privateKeyData, - NULL); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, - &privateKey); - cx_ecfp_generate_pair(CX_CURVE_256K1, - &tmpCtx.publicKeyContext.publicKey, - &privateKey, 1); - os_memset(&privateKey, 0, sizeof(privateKey)); - os_memset(privateKeyData, 0, sizeof(privateKeyData)); - getEthAddressStringFromKey( - &tmpCtx.publicKeyContext.publicKey, - tmpCtx.publicKeyContext.address, &sha3); - if (p1 == P1_NON_CONFIRM) { - tx = set_result_get_publicKey(); - THROW(0x9000); - } else { - addressSummary[0] = '0'; - addressSummary[1] = 'x'; - os_memmove((unsigned char *)(addressSummary + 2), - tmpCtx.publicKeyContext.address, 4); - os_memmove((unsigned char *)(addressSummary + 6), "...", - 3); - os_memmove((unsigned char *)(addressSummary + 9), - tmpCtx.publicKeyContext.address + 40 - 4, 4); - addressSummary[13] = '\0'; - os_memmove((unsigned char *)address1, - tmpCtx.publicKeyContext.address, 20); - address1[20] = '\0'; - os_memmove((unsigned char *)address2, - tmpCtx.publicKeyContext.address + 20, 20); - address2[20] = '\0'; - - // prepare for a UI based reply - if (os_seph_features() & - SEPROXYHAL_TAG_SESSION_START_EVENT_FEATURE_SCREEN_BIG) { - UX_DISPLAY(ui_address_blue, NULL); - } else { - ux_step = 0; - ux_step_count = 2; - // io_seproxyhal_setup_ticker(2000); - UX_DISPLAY(ui_address_nanos, ui_address_prepro); - } - - flags |= IO_ASYNCH_REPLY; - } - } - - break; - - case INS_ADD_SELF: { - uint8_t privateKeyData[32]; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = G_io_apdu_buffer[OFFSET_CDATA]; - uint8_t *dataBuffer = G_io_apdu_buffer + OFFSET_CDATA + 1; - cx_ecfp_private_key_t privateKey; - - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - screen_printf("Invalid path\n"); - THROW(0x6a80); - } - if ((G_io_apdu_buffer[OFFSET_P1] != 0) || - (G_io_apdu_buffer[OFFSET_P2] != 0)) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = (dataBuffer[0] << 24) | - (dataBuffer[1] << 16) | - (dataBuffer[2] << 8) | (dataBuffer[3]); - dataBuffer += 4; - } - os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, - bip32PathLength, privateKeyData, - NULL); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, - &privateKey); - cx_ecfp_generate_pair(CX_CURVE_256K1, - &tmpCtx.publicKeyContext.publicKey, - &privateKey, 1); - os_memset(&privateKey, 0, sizeof(privateKey)); - os_memset(privateKeyData, 0, sizeof(privateKeyData)); - getEthAddressFromKey(&tmpCtx.publicKeyContext.publicKey, - splitContext.targetAddress, &sha3); - splitContext.targetAddressProvided = true; - THROW(0x9000); - } break; - - case INS_SIGN: { - uint8_t commandLength = G_io_apdu_buffer[OFFSET_LC]; - uint8_t *workBuffer = G_io_apdu_buffer + OFFSET_CDATA; - parserStatus_e txResult; - uint256_t uint256; - uint32_t i; - uint8_t address[41]; - if (G_io_apdu_buffer[OFFSET_P1] == P1_FIRST) { - tmpCtx.transactionContext.pathLength = workBuffer[0]; - if ((tmpCtx.transactionContext.pathLength < 0x01) || - (tmpCtx.transactionContext.pathLength > - MAX_BIP32_PATH)) { - screen_printf("Invalid path\n"); - THROW(0x6a80); - } - workBuffer++; - commandLength--; - for (i = 0; i < tmpCtx.transactionContext.pathLength; - i++) { - tmpCtx.transactionContext.bip32Path[i] = - (workBuffer[0] << 24) | (workBuffer[1] << 16) | - (workBuffer[2] << 8) | (workBuffer[3]); - workBuffer += 4; - commandLength -= 4; - } - initTx(&txContext, &sha3, &txContent, customProcessor, - NULL); - } else if (G_io_apdu_buffer[OFFSET_P1] != P1_MORE) { - THROW(0x6B00); - } - if (G_io_apdu_buffer[OFFSET_P2] != 0) { - THROW(0x6B00); - } - if (txContext.currentField == TX_RLP_NONE) { - screen_printf("Parser not initialized\n"); - THROW(0x6985); - } - txResult = processTx(&txContext, workBuffer, commandLength); - switch (txResult) { - case USTREAM_FINISHED: - break; - case USTREAM_PROCESSING: - THROW(0x9000); - case USTREAM_FAULT: - THROW(0x6A80); - default: - screen_printf("Unexpected parser status\n"); - THROW(0x6A80); - } - - // Store the hash - cx_hash((cx_hash_t *)&sha3, CX_LAST, - tmpCtx.transactionContext.hash, 0, - tmpCtx.transactionContext.hash); - // Abort if not sending to the splitting contract - if (os_memcmp(txContent.destination, SPLIT_ADDRESS, - sizeof(SPLIT_ADDRESS)) != 0) { - screen_printf("Invalid target address\n"); - THROW(0x6A80); - } - // Abort if not calling the split function - if (os_memcmp(splitContext.data, SPLIT_TRANSFER_ID, - sizeof(SPLIT_TRANSFER_ID)) != 0) { - screen_printf("Invalid contract call ID\n"); - THROW(0x6A80); - } - // Abort if the destination address was not provided - if (!splitContext.targetAddressProvided || - (os_memcmp(splitContext.targetAddress, - splitContext.data + 4 + 32 + 12, 20) != 0)) { - screen_printf("Invalid target address\n"); - THROW(0x6A80); - } - // Check where the split is made - switch (splitContext.data[4 + 31]) { - case 0x00: - strcpy(splitType, SPLIT_TO_ETC); - break; - case 0x01: - strcpy(splitType, SPLIT_TO_ETH); - break; - default: - screen_printf("Invalid boolean\n"); - THROW(0x6A80); - } - // Add target address - getEthAddressStringFromBinary(splitContext.targetAddress, - address, &sha3); - addressSummary[0] = '0'; - addressSummary[1] = 'x'; - os_memmove((unsigned char *)(addressSummary + 2), address, - 4); - os_memmove((unsigned char *)(addressSummary + 6), "...", 3); - os_memmove((unsigned char *)(addressSummary + 9), - address + 40 - 4, 4); - addressSummary[13] = '\0'; - os_memmove((unsigned char *)address1, address, 20); - address1[20] = '\0'; - os_memmove((unsigned char *)address2, address + 20, 20); - address2[20] = '\0'; - // Add amount in ethers - convertUint256BE(txContent.value.value, - txContent.value.length, &uint256); - tostring256(&uint256, 10, (char *)(G_io_apdu_buffer + 100), - 100); - i = 0; - while (G_io_apdu_buffer[100 + i]) { - i++; - } - adjustDecimals((char *)(G_io_apdu_buffer + 100), i, - (char *)G_io_apdu_buffer, 100, WEI_TO_ETHER); - i = 0; - fullAmount[0] = 'E'; - fullAmount[1] = 'T'; - fullAmount[2] = 'H'; - fullAmount[3] = ' '; - while (G_io_apdu_buffer[i]) { - fullAmount[4 + i] = G_io_apdu_buffer[i]; - i++; - } - fullAmount[4 + i] = '\0'; - // Add gas price in ethers - convertUint256BE(txContent.gasprice.value, - txContent.gasprice.length, &uint256); - tostring256(&uint256, 10, (char *)(G_io_apdu_buffer + 100), - 100); - i = 0; - while (G_io_apdu_buffer[100 + i]) { - i++; - } - adjustDecimals((char *)(G_io_apdu_buffer + 100), i, - (char *)G_io_apdu_buffer, 100, WEI_TO_ETHER); - i = 0; - gasPrice[0] = 'E'; - gasPrice[1] = 'T'; - gasPrice[2] = 'H'; - gasPrice[3] = ' '; - while (G_io_apdu_buffer[i]) { - gasPrice[4 + i] = G_io_apdu_buffer[i]; - i++; - } - gasPrice[4 + i] = '\0'; - // Add gas limit in native format - convertUint256BE(txContent.startgas.value, - txContent.startgas.length, &uint256); - tostring256(&uint256, 10, (char *)G_io_apdu_buffer, 100); - i = 0; - while (G_io_apdu_buffer[i]) { - startgas[i] = G_io_apdu_buffer[i]; - i++; - } - startgas[i] = '\0'; - - if (os_seph_features() & - SEPROXYHAL_TAG_SESSION_START_EVENT_FEATURE_SCREEN_BIG) { - UX_DISPLAY(ui_approval_blue, NULL); - } else { - ux_step = 0; - ux_step_count = 5; - // io_seproxyhal_setup_ticker(2000); - UX_DISPLAY(ui_approval_nanos, ui_approval_prepro); - } - - flags |= IO_ASYNCH_REPLY; - } break; - - case 0xFF: // return to dashboard - goto return_to_dashboard; - - default: - THROW(0x6D00); - break; - } - } - CATCH_OTHER(e) { - switch (e & 0xF000) { - case 0x6000: - // Wipe the transaction context and report the exception - sw = e; - os_memset(&txContext, 0, sizeof(txContext)); - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - break; - } - // Unexpected exception => report - G_io_apdu_buffer[tx] = sw >> 8; - G_io_apdu_buffer[tx + 1] = sw; - tx += 2; - } - FINALLY { - } - } - END_TRY; - } - -return_to_dashboard: - return; -} - -void io_seproxyhal_display(const bagl_element_t *element) { - return io_seproxyhal_display_default((bagl_element_t *)element); -} - -unsigned char io_event(unsigned char channel) { - // nothing done with the event, throw an error on the transport layer if - // needed - - // can't have more than one tag in the reply, not supported yet. - switch (G_io_seproxyhal_spi_buffer[0]) { - case SEPROXYHAL_TAG_FINGER_EVENT: - UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); - break; - - case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: - UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); - break; - - case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: - if (UX_DISPLAYED()) { - // TODO perform actions after all screen elements have been - // displayed - } else { - UX_DISPLAY_PROCESSED_EVENT(); - } - break; - - case SEPROXYHAL_TAG_TICKER_EVENT: - // prepare next screen - ux_step = (ux_step + 1) % ux_step_count; - // redisplay screen - UX_REDISPLAY(); - break; - - // unknown events are acknowledged - default: - break; - } - - // close the event if not done previously (by a display or whatever) - if (!io_seproxyhal_spi_is_status_sent()) { - io_seproxyhal_general_status(); - } - - // command has been processed, DO NOT reset the current APDU transport - return 1; -} - -void app_exit(void) { - BEGIN_TRY_L(exit) { - TRY_L(exit) { - os_sched_exit(-1); - } - FINALLY_L(exit) { - } - } - END_TRY_L(exit); -} - -__attribute__((section(".boot"))) int main(void) { - // exit critical section - __asm volatile("cpsie i"); - - os_memset(&txContext, 0, sizeof(txContext)); - os_memset(&splitContext, 0, sizeof(splitContext)); - - UX_INIT(); - - // ensure exception will work as planned - os_boot(); - - BEGIN_TRY { - TRY { - io_seproxyhal_init(); - - USB_power(1); - - ui_idle(); - - sample_main(); - } - CATCH_OTHER(e) { - } - FINALLY { - } - } - END_TRY; - - app_exit(); - - return 0; -} diff --git a/src_daosend/main.c b/src_daosend/main.c deleted file mode 100644 index 509d9f1..0000000 --- a/src_daosend/main.c +++ /dev/null @@ -1,981 +0,0 @@ -/******************************************************************************* -* Ledger Blue -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ - -#include "os.h" -#include "cx.h" -#include -#include "app_cx_sha3.h" -#include "ethUstream.h" -#include "ethUtils.h" -#include "uint256.h" - -#include "os_io_seproxyhal.h" -#include "string.h" -unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; - -unsigned char usb_enable_request; // request to turn on USB -unsigned char uiDone; // notification to come back to the APDU event loop -unsigned int - currentUiElement; // currently displayed UI element in a set of elements -unsigned char - element_displayed; // notification of something displayed in a touch handler - -// UI currently displayed -enum UI_STATE { UI_IDLE, UI_ADDRESS, UI_APPROVAL }; - -enum UI_STATE uiState; - -void io_usb_enable(unsigned char enabled); -void os_boot(void); - -unsigned int io_seproxyhal_touch_exit(bagl_element_t *e); -unsigned int io_seproxyhal_touch_tx_ok(bagl_element_t *e); -unsigned int io_seproxyhal_touch_tx_cancel(bagl_element_t *e); -unsigned int io_seproxyhal_touch_address_ok(bagl_element_t *e); -unsigned int io_seproxyhal_touch_address_cancel(bagl_element_t *e); - -uint32_t set_result_get_publicKey(void); - -#define MAX_BIP32_PATH 10 - -#define CLA 0xE0 -#define INS_GET_PUBLIC_KEY 0x02 -#define INS_SIGN 0x04 -#define INS_ADD_SELF 0x06 -#define P1_CONFIRM 0x01 -#define P1_NON_CONFIRM 0x00 -#define P1_FIRST 0x00 -#define P1_MORE 0x80 - -#define OFFSET_CLA 0 -#define OFFSET_INS 1 -#define OFFSET_P1 2 -#define OFFSET_P2 3 -#define OFFSET_LC 4 -#define OFFSET_CDATA 5 - -#define DAO_TOKENS_UNIT 16 - -typedef struct publicKeyContext_t { - cx_ecfp_public_key_t publicKey; - uint8_t address[41]; -} publicKeyContext_t; - -typedef struct transactionContext_t { - uint8_t pathLength; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint8_t hash[32]; -} transactionContext_t; - -typedef struct daosendContext_t { - uint8_t data[4 + 32 + 32]; - uint32_t dataFieldPos; - uint8_t selfAddress[20]; - bool selfAddressProvided; -} daosendContext_t; - -char lineBuffer[50]; -union { - publicKeyContext_t publicKeyContext; - transactionContext_t transactionContext; -} tmpCtx; -txContext_t txContext; -txContent_t txContent; -daosendContext_t daoContext; -app_cx_sha3_t sha3; -volatile char addressSummary[21]; -volatile char address1[21]; -volatile char address2[21]; -volatile char fullAmount[50]; - -static const uint8_t const DAO_TRANSFER_ID[] = {0xa9, 0x05, 0x9c, 0xbb}; -static const uint8_t const DAO_ADDRESS[] = { - 0xbb, 0x9b, 0xc2, 0x44, 0xd7, 0x98, 0x12, 0x3f, 0xde, 0x78, - 0x3f, 0xcc, 0x1c, 0x72, 0xd3, 0xbb, 0x8c, 0x18, 0x94, 0x13}; - -// blank the screen -static const bagl_element_t const bagl_ui_erase_all[] = { - {{BAGL_RECTANGLE, 0x00, 0, 60, 320, 420, 0, 0, BAGL_FILL, 0xf9f9f9, - 0xf9f9f9, 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; - -bagl_element_t const bagl_ui_address[] = { - // type id x y w h s r fill - // fg bg font icon text, out, over, touch - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 60, 0, 0, BAGL_FILL, 0x1d2028, 0x1d2028, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 20, 0, 320, 60, 0, 0, BAGL_FILL, 0xFFFFFF, 0x1d2028, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_MIDDLE, 0}, - "TheDAO send token", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 35, 385, 120, 40, 0, 6, - BAGL_FILL, 0xcccccc, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CANCEL", - 0, - 0x37ae99, - 0xF9F9F9, - (bagl_element_callback_t)io_seproxyhal_touch_address_cancel, - NULL, - NULL}, - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 165, 385, 120, 40, 0, 6, - BAGL_FILL, 0x41ccb4, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CONFIRM", - 0, - 0x37ae99, - 0xF9F9F9, - (bagl_element_callback_t)io_seproxyhal_touch_address_ok, - NULL, - NULL}, - - {{BAGL_LABEL, 0x00, 0, 147, 320, 32, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm address", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 280, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 310, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address1, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 330, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address2, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; - -// UI to approve or deny the signature proposal -static const bagl_element_t const bagl_ui_approval[] = { - - // type id x y w h s r fill - // fg bg font icon text, out, over, touch - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 60, 0, 0, BAGL_FILL, 0x1d2028, 0x1d2028, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 20, 0, 320, 60, 0, 0, BAGL_FILL, 0xFFFFFF, 0x1d2028, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_MIDDLE, 0}, - "TheDAO send token", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 35, 385, 120, 40, 0, 6, - BAGL_FILL, 0xcccccc, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CANCEL", - 0, - 0x37ae99, - 0xF9F9F9, - (bagl_element_callback_t)io_seproxyhal_touch_tx_cancel, - NULL, - NULL}, - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 165, 385, 120, 40, 0, 6, - BAGL_FILL, 0x41ccb4, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "CONFIRM", - 0, - 0x37ae99, - 0xF9F9F9, - (bagl_element_callback_t)io_seproxyhal_touch_tx_ok, - NULL, - NULL}, - - {{BAGL_LABEL, 0x00, 0, 87, 320, 32, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "CONFIRM THEDAO TOKENS SEND", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 125, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)fullAmount, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 175, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_16px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)addressSummary, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 205, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address1, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABEL, 0x00, 0, 225, 320, 33, 0, 0, 0, 0x000000, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (const char *)address2, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - -}; - -// UI displayed when no signature proposal has been received -static const bagl_element_t const bagl_ui_idle[] = { - - {{BAGL_RECTANGLE, 0x00, 0, 0, 320, 60, 0, 0, BAGL_FILL, 0x1d2028, 0x1d2028, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABEL, 0x00, 20, 0, 320, 60, 0, 0, BAGL_FILL, 0xFFFFFF, 0x1d2028, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_MIDDLE, 0}, - "TheDAO send token", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_BUTTON | BAGL_FLAG_TOUCHABLE, 0x00, 190, 215, 120, 40, 0, 6, - BAGL_FILL, 0x41ccb4, 0xF9F9F9, - BAGL_FONT_OPEN_SANS_LIGHT_14px | BAGL_FONT_ALIGNMENT_CENTER | - BAGL_FONT_ALIGNMENT_MIDDLE, - 0}, - "Exit", - 0, - 0x37ae99, - 0xF9F9F9, - (bagl_element_callback_t)io_seproxyhal_touch_exit, - NULL, - NULL} - -}; - -// TODO : replace with 1.2 SDK -int app_cx_ecfp_init_private_key(cx_curve_t curve, unsigned char WIDE *rawkey, - int key_len, cx_ecfp_private_key_t *key) { - key->curve = curve; - key->d_len = key_len; - if (rawkey != NULL) { - os_memmove(key->d, rawkey, key_len); - } - return key_len; -} - -unsigned int io_seproxyhal_touch_exit(bagl_element_t *e) { - // Go back to the dashboard - os_sched_exit(0); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_address_ok(bagl_element_t *e) { - uint32_t tx = set_result_get_publicKey(); - uiDone = 1; - G_io_apdu_buffer[tx++] = 0x90; - G_io_apdu_buffer[tx++] = 0x00; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - // Display back the original UX - uiState = UI_IDLE; - currentUiElement = 0; - io_seproxyhal_display(&bagl_ui_erase_all[0]); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_address_cancel(bagl_element_t *e) { - uiDone = 1; - G_io_apdu_buffer[0] = 0x69; - G_io_apdu_buffer[1] = 0x85; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); - // Display back the original UX - uiState = UI_IDLE; - currentUiElement = 0; - io_seproxyhal_display(&bagl_ui_erase_all[0]); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_tx_ok(bagl_element_t *e) { - uint8_t privateKeyData[32]; - uint8_t signature[100]; - uint8_t signatureLength; - cx_ecfp_private_key_t privateKey; - uint32_t tx = 0; - uint8_t rLength, sLength, rOffset, sOffset; - os_perso_derive_seed_bip32(tmpCtx.transactionContext.bip32Path, - tmpCtx.transactionContext.pathLength, - privateKeyData, NULL); - app_cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, - &privateKey); - os_memset(privateKeyData, 0, sizeof(privateKeyData)); - signatureLength = - cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - tmpCtx.transactionContext.hash, - sizeof(tmpCtx.transactionContext.hash), signature); - os_memset(&privateKey, 0, sizeof(privateKey)); - // Parity is present in the sequence tag in the legacy API - G_io_apdu_buffer[0] = 27 + (signature[0] & 0x01); - rLength = signature[3]; - sLength = signature[4 + rLength + 1]; - rOffset = (rLength == 33 ? 1 : 0); - sOffset = (sLength == 33 ? 1 : 0); - os_memmove(G_io_apdu_buffer + 1, signature + 4 + rOffset, 32); - os_memmove(G_io_apdu_buffer + 1 + 32, signature + 4 + rLength + 2 + sOffset, - 32); - tx = 65; - uiDone = 1; - G_io_apdu_buffer[tx++] = 0x90; - G_io_apdu_buffer[tx++] = 0x00; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - // Display back the original UX - uiState = UI_IDLE; - currentUiElement = 0; - io_seproxyhal_display(&bagl_ui_erase_all[0]); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_tx_cancel(bagl_element_t *e) { - uiDone = 1; - G_io_apdu_buffer[0] = 0x69; - G_io_apdu_buffer[1] = 0x85; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); - // Display back the original UX - uiState = UI_IDLE; - currentUiElement = 0; - io_seproxyhal_display(&bagl_ui_erase_all[0]); - return 0; // do not redraw the widget -} - -void reset(void) { -} - -unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { - switch (channel & ~(IO_FLAGS)) { - case CHANNEL_KEYBOARD: - break; - - // multiplexed io exchange over a SPI channel and TLV encapsulated protocol - case CHANNEL_SPI: - if (tx_len) { - io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); - - if (channel & IO_RESET_AFTER_REPLIED) { - reset(); - } - return 0; // nothing received from the master so far (it's a tx - // transaction) - } else { - return io_seproxyhal_spi_recv(G_io_apdu_buffer, - sizeof(G_io_apdu_buffer), 0); - } - - default: - THROW(INVALID_PARAMETER); - } - return 0; -} - -uint32_t set_result_get_publicKey() { - uint32_t tx = 0; - G_io_apdu_buffer[tx++] = 65; - os_memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.publicKey.W, 65); - tx += 65; - G_io_apdu_buffer[tx++] = 40; - os_memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.address, 40); - tx += 40; - return tx; -} - -void convertUint256BE(uint8_t *data, uint32_t length, uint256_t *target) { - uint8_t tmp[32]; - os_memset(tmp, 0, 32); - os_memmove(tmp + 32 - length, data, length); - readu256BE(tmp, target); -} - -bool customProcessor(txContext_t *context) { - if (context->currentField != TX_RLP_DATA) { - return false; - } - if (context->currentFieldLength != sizeof(daoContext.data)) { - screen_printf("Invalid length for RLP_DATA\n"); - THROW(EXCEPTION); - } - if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = - (context->commandLength < - ((context->currentFieldLength - context->currentFieldPos)) - ? context->commandLength - : context->currentFieldLength - context->currentFieldPos); - copyTxData(context, daoContext.data + context->currentFieldPos, - copySize); - } - if (context->currentFieldPos == context->currentFieldLength) { - context->currentField++; - context->processingField = false; - } - - return true; -} - -void sample_main(void) { - volatile unsigned int rx = 0; - volatile unsigned int tx = 0; - volatile unsigned int flags = 0; - - // DESIGN NOTE: the bootloader ignores the way APDU are fetched. The only - // goal is to retrieve APDU. - // When APDU are to be fetched from multiple IOs, like NFC+USB+BLE, make - // sure the io_event is called with a - // switch event, before the apdu is replied to the bootloader. This avoid - // APDU injection faults. - for (;;) { - volatile unsigned short sw = 0; - - BEGIN_TRY { - TRY { - rx = tx; - tx = 0; // ensure no race in catch_other if io_exchange throws - // an error - rx = io_exchange(CHANNEL_APDU | flags, rx); - - // no apdu received, well, reset the session, and reset the - // bootloader configuration - if (rx == 0) { - THROW(0x6982); - } - - if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { - THROW(0x6E00); - } - - switch (G_io_apdu_buffer[OFFSET_INS]) { - case INS_GET_PUBLIC_KEY: { - uint8_t privateKeyData[32]; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = G_io_apdu_buffer[OFFSET_CDATA]; - uint8_t p1 = G_io_apdu_buffer[OFFSET_P1]; - uint8_t *dataBuffer = G_io_apdu_buffer + OFFSET_CDATA + 1; - cx_ecfp_private_key_t privateKey; - - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - screen_printf("Invalid path\n"); - THROW(0x6a80); - } - if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { - THROW(0x6B00); - } - if (G_io_apdu_buffer[OFFSET_P2] != 0) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = (dataBuffer[0] << 24) | - (dataBuffer[1] << 16) | - (dataBuffer[2] << 8) | (dataBuffer[3]); - dataBuffer += 4; - } - os_perso_derive_seed_bip32(bip32Path, bip32PathLength, - privateKeyData, NULL); - app_cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, - 32, &privateKey); - cx_ecfp_generate_pair(CX_CURVE_256K1, - &tmpCtx.publicKeyContext.publicKey, - &privateKey, 1); - os_memset(&privateKey, 0, sizeof(privateKey)); - os_memset(privateKeyData, 0, sizeof(privateKeyData)); - getEthAddressStringFromKey( - &tmpCtx.publicKeyContext.publicKey, - tmpCtx.publicKeyContext.address, &sha3); - if (p1 == P1_NON_CONFIRM) { - tx = set_result_get_publicKey(); - THROW(0x9000); - } else { - os_memmove((unsigned char *)addressSummary, - tmpCtx.publicKeyContext.address, 5); - os_memmove((unsigned char *)(addressSummary + 5), - " ... ", 5); - os_memmove((unsigned char *)(addressSummary + 10), - tmpCtx.publicKeyContext.address + 40 - 5, 5); - addressSummary[15] = '\0'; - os_memmove((unsigned char *)address1, - tmpCtx.publicKeyContext.address, 20); - address1[20] = '\0'; - os_memmove((unsigned char *)address2, - tmpCtx.publicKeyContext.address + 20, 20); - address2[20] = '\0'; - uiState = UI_ADDRESS; - currentUiElement = 0; - uiDone = 0; - io_seproxyhal_display(&bagl_ui_erase_all[0]); - // Pump SPI events until the UI has been displayed, then - // go - // back to the original event loop - while (!uiDone) { - unsigned int rx_len; - rx_len = io_seproxyhal_spi_recv( - G_io_seproxyhal_spi_buffer, - sizeof(G_io_seproxyhal_spi_buffer), 0); - if (io_seproxyhal_handle_event()) { - io_seproxyhal_general_status(); - continue; - } - io_event(CHANNEL_SPI); - } - continue; - } - } - - break; - - case INS_ADD_SELF: { - uint8_t privateKeyData[32]; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = G_io_apdu_buffer[OFFSET_CDATA]; - uint8_t *dataBuffer = G_io_apdu_buffer + OFFSET_CDATA + 1; - cx_ecfp_private_key_t privateKey; - - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - screen_printf("Invalid path\n"); - THROW(0x6a80); - } - if ((G_io_apdu_buffer[OFFSET_P1] != 0) || - (G_io_apdu_buffer[OFFSET_P2] != 0)) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = (dataBuffer[0] << 24) | - (dataBuffer[1] << 16) | - (dataBuffer[2] << 8) | (dataBuffer[3]); - dataBuffer += 4; - } - os_perso_derive_seed_bip32(bip32Path, bip32PathLength, - privateKeyData, NULL); - app_cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, - 32, &privateKey); - cx_ecfp_generate_pair(CX_CURVE_256K1, - &tmpCtx.publicKeyContext.publicKey, - &privateKey, 1); - os_memset(&privateKey, 0, sizeof(privateKey)); - os_memset(privateKeyData, 0, sizeof(privateKeyData)); - getEthAddressFromKey(&tmpCtx.publicKeyContext.publicKey, - daoContext.selfAddress, &sha3); - daoContext.selfAddressProvided = true; - THROW(0x9000); - } break; - - case INS_SIGN: { - uint8_t commandLength = G_io_apdu_buffer[OFFSET_LC]; - uint8_t *workBuffer = G_io_apdu_buffer + OFFSET_CDATA; - parserStatus_e txResult; - uint256_t uint256; - uint32_t i; - uint8_t address[41]; - if (G_io_apdu_buffer[OFFSET_P1] == P1_FIRST) { - tmpCtx.transactionContext.pathLength = workBuffer[0]; - if ((tmpCtx.transactionContext.pathLength < 0x01) || - (tmpCtx.transactionContext.pathLength > - MAX_BIP32_PATH)) { - screen_printf("Invalid path\n"); - THROW(0x6a80); - } - workBuffer++; - commandLength--; - for (i = 0; i < tmpCtx.transactionContext.pathLength; - i++) { - tmpCtx.transactionContext.bip32Path[i] = - (workBuffer[0] << 24) | (workBuffer[1] << 16) | - (workBuffer[2] << 8) | (workBuffer[3]); - workBuffer += 4; - commandLength -= 4; - } - initTx(&txContext, &sha3, &txContent, customProcessor, - NULL); - } else if (G_io_apdu_buffer[OFFSET_P1] != P1_MORE) { - THROW(0x6B00); - } - if (G_io_apdu_buffer[OFFSET_P2] != 0) { - THROW(0x6B00); - } - if (txContext.currentField == TX_RLP_NONE) { - screen_printf("Parser not initialized\n"); - THROW(0x6985); - } - txResult = processTx(&txContext, workBuffer, commandLength); - switch (txResult) { - case USTREAM_FINISHED: - break; - case USTREAM_PROCESSING: - THROW(0x9000); - case USTREAM_FAULT: - THROW(0x6A80); - default: - screen_printf("Unexpected parser status\n"); - THROW(0x6A80); - } - - // Store the hash - app_cx_hash((cx_hash_t *)&sha3, CX_LAST, - tmpCtx.transactionContext.hash, 0, - tmpCtx.transactionContext.hash); - // Abort if not sending to the DAO - if (os_memcmp(txContent.destination, DAO_ADDRESS, 20) != - 0) { - screen_printf("Invalid target address\n"); - THROW(0x6A80); - } - // Abort if sending an amount - if (txContent.value.length != 0) { - screen_printf("Invalid amount\n"); - THROW(0x6A80); - } - // Abort if not calling the transfer function - if (os_memcmp(daoContext.data, DAO_TRANSFER_ID, 4) != 0) { - screen_printf("Invalid contract call ID\n"); - THROW(0x6A80); - } - if (daoContext.selfAddressProvided && - os_memcmp(daoContext.selfAddress, - daoContext.data + 4 + 12, 20) == 0) { - os_memmove((unsigned char *)addressSummary, "Self", 5); - address1[0] = '\0'; - address2[0] = '\0'; - } else { - // Add address - getEthAddressStringFromBinary(daoContext.data + 4 + 12, - address, &sha3); - os_memmove((unsigned char *)addressSummary, address, 5); - os_memmove((unsigned char *)(addressSummary + 5), - " ... ", 5); - os_memmove((unsigned char *)(addressSummary + 10), - address + 40 - 5, 5); - addressSummary[15] = '\0'; - os_memmove((unsigned char *)address1, address, 20); - address1[20] = '\0'; - os_memmove((unsigned char *)address2, address + 20, 20); - address2[20] = '\0'; - } - // Add token amount - convertUint256BE(daoContext.data + 4 + 32, 32, &uint256); - tostring256(&uint256, 10, (char *)(G_io_apdu_buffer + 100), - 100); - i = 0; - while (G_io_apdu_buffer[100 + i]) { - i++; - } - adjustDecimals((char *)(G_io_apdu_buffer + 100), i, - (char *)G_io_apdu_buffer, 100, - DAO_TOKENS_UNIT); - i = 0; - fullAmount[0] = 'D'; - fullAmount[1] = 'A'; - fullAmount[2] = 'O'; - fullAmount[3] = ' '; - while (G_io_apdu_buffer[i]) { - fullAmount[4 + i] = G_io_apdu_buffer[i]; - i++; - } - fullAmount[4 + i] = '\0'; - - uiState = UI_APPROVAL; - currentUiElement = 0; - uiDone = 0; - io_seproxyhal_display(&bagl_ui_erase_all[0]); - // Pump SPI events until the UI has been displayed, then go - // back to the original event loop - while (!uiDone) { - unsigned int rx_len; - rx_len = io_seproxyhal_spi_recv( - G_io_seproxyhal_spi_buffer, - sizeof(G_io_seproxyhal_spi_buffer), 0); - if (io_seproxyhal_handle_event()) { - io_seproxyhal_general_status(); - continue; - } - io_event(CHANNEL_SPI); - } - continue; - } break; - - case 0xFF: // return to dashboard - goto return_to_dashboard; - - default: - THROW(0x6D00); - break; - } - } - CATCH_OTHER(e) { - switch (e & 0xF000) { - case 0x6000: - // Wipe the transaction context and report the exception - sw = e; - os_memset(&txContext, 0, sizeof(txContext)); - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - break; - } - // Unexpected exception => report - G_io_apdu_buffer[tx] = sw >> 8; - G_io_apdu_buffer[tx + 1] = sw; - tx += 2; - } - FINALLY { - } - } - END_TRY; - } - -return_to_dashboard: - return; -} - -void io_seproxyhal_display(const bagl_element_t *element) { - element_displayed = 1; - return io_seproxyhal_display_default((bagl_element_t *)element); -} - -unsigned char io_event(unsigned char channel) { - // nothing done with the event, throw an error on the transport layer if - // needed - unsigned int offset = 0; - - // can't have more than one tag in the reply, not supported yet. - switch (G_io_seproxyhal_spi_buffer[0]) { - case SEPROXYHAL_TAG_FINGER_EVENT: { - bagl_element_t *elements = NULL; - unsigned int elementsSize = 0; - if (uiState == UI_IDLE) { - elements = (bagl_element_t *)bagl_ui_idle; - elementsSize = sizeof(bagl_ui_idle) / sizeof(bagl_element_t); - } else if (uiState == UI_ADDRESS) { - elements = (bagl_element_t *)bagl_ui_address; - elementsSize = sizeof(bagl_ui_address) / sizeof(bagl_element_t); - } else if (uiState == UI_APPROVAL) { - elements = (bagl_element_t *)bagl_ui_approval; - elementsSize = sizeof(bagl_ui_approval) / sizeof(bagl_element_t); - } - if (elements != NULL) { - io_seproxyhal_touch(elements, elementsSize, - (G_io_seproxyhal_spi_buffer[4] << 8) | - (G_io_seproxyhal_spi_buffer[5] & 0xFF), - (G_io_seproxyhal_spi_buffer[6] << 8) | - (G_io_seproxyhal_spi_buffer[7] & 0xFF), - G_io_seproxyhal_spi_buffer[3]); - if (!element_displayed) { - goto general_status; - } - } else { - goto general_status; - } - } break; - -#ifdef HAVE_BLE - // Make automatically discoverable again when disconnected - - case SEPROXYHAL_TAG_BLE_CONNECTION_EVENT: - if (G_io_seproxyhal_spi_buffer[3] == 0) { - // TODO : cleaner reset sequence - // first disable BLE before turning it off - G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_BLE_RADIO_POWER; - G_io_seproxyhal_spi_buffer[1] = 0; - G_io_seproxyhal_spi_buffer[2] = 1; - G_io_seproxyhal_spi_buffer[3] = 0; - io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 4); - // send BLE power on (default parameters) - G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_BLE_RADIO_POWER; - G_io_seproxyhal_spi_buffer[1] = 0; - G_io_seproxyhal_spi_buffer[2] = 1; - G_io_seproxyhal_spi_buffer[3] = 3; // ble on & advertise - io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 5); - } - goto general_status; -#endif - - case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: - if (uiState == UI_IDLE) { - if (currentUiElement < - (sizeof(bagl_ui_idle) / sizeof(bagl_element_t))) { - io_seproxyhal_display(&bagl_ui_idle[currentUiElement++]); - break; - } - } else if (uiState == UI_ADDRESS) { - if (currentUiElement < - (sizeof(bagl_ui_address) / sizeof(bagl_element_t))) { - io_seproxyhal_display(&bagl_ui_address[currentUiElement++]); - break; - } - } else if (uiState == UI_APPROVAL) { - if (currentUiElement < - (sizeof(bagl_ui_approval) / sizeof(bagl_element_t))) { - io_seproxyhal_display(&bagl_ui_approval[currentUiElement++]); - break; - } - } else { - screen_printf("Unknown UI state\n"); - } - if (usb_enable_request) { - io_usb_enable(1); - usb_enable_request = 0; - } - goto general_status; - - // unknown events are acknowledged - default: - general_status: - // send a general status last command - offset = 0; - G_io_seproxyhal_spi_buffer[offset++] = SEPROXYHAL_TAG_GENERAL_STATUS; - G_io_seproxyhal_spi_buffer[offset++] = 0; - G_io_seproxyhal_spi_buffer[offset++] = 2; - G_io_seproxyhal_spi_buffer[offset++] = - SEPROXYHAL_TAG_GENERAL_STATUS_LAST_COMMAND >> 8; - G_io_seproxyhal_spi_buffer[offset++] = - SEPROXYHAL_TAG_GENERAL_STATUS_LAST_COMMAND; - io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, offset); - element_displayed = 0; - break; - } - // command has been processed, DO NOT reset the current APDU transport - return 1; -} - -__attribute__((section(".boot"))) int main(void) { - // exit critical section - __asm volatile("cpsie i"); - - usb_enable_request = 0; - element_displayed = 0; - uiState = UI_IDLE; - currentUiElement = 0; - os_memset(&txContext, 0, sizeof(txContext)); - - // ensure exception will work as planned - os_boot(); - - BEGIN_TRY { - TRY { - io_seproxyhal_init(); - -#ifdef HAVE_BLE - - // send BLE power on (default parameters) - G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_BLE_RADIO_POWER; - G_io_seproxyhal_spi_buffer[1] = 0; - G_io_seproxyhal_spi_buffer[2] = 1; - G_io_seproxyhal_spi_buffer[3] = 3; // ble on & advertise - io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 4); -#endif - - usb_enable_request = 1; - io_seproxyhal_display(&bagl_ui_erase_all[0]); - - sample_main(); - } - CATCH_OTHER(e) { - } - FINALLY { - } - } - END_TRY; -} diff --git a/src_genericwallet/main.c b/src_genericwallet/main.c index 0c86c06..63c7090 100644 --- a/src_genericwallet/main.c +++ b/src_genericwallet/main.c @@ -125,6 +125,7 @@ union { } dataContext; volatile uint8_t dataAllowed; +volatile uint8_t contractDetails; volatile char addressSummary[32]; volatile bool dataPresent; volatile bool tokenProvisioned; @@ -138,6 +139,7 @@ unsigned int ux_step_count; typedef struct internalStorage_t { unsigned char dataAllowed; + unsigned char contractDetails; uint8_t initialized; } internalStorage_t; @@ -259,6 +261,7 @@ const ux_menu_entry_t menu_main[]; const ux_menu_entry_t menu_settings[]; //const ux_menu_entry_t menu_settings_browser[]; const ux_menu_entry_t menu_settings_data[]; +const ux_menu_entry_t menu_settings_details[]; #ifdef HAVE_U2F @@ -270,20 +273,39 @@ void menu_settings_data_change(unsigned int enabled) { UX_MENU_DISPLAY(0, menu_settings, NULL); } +void menu_settings_details_change(unsigned int enabled) { + contractDetails = enabled; + nvm_write(&N_storage.contractDetails, (void*)&contractDetails, sizeof(uint8_t)); + // go back to the menu entry + UX_MENU_DISPLAY(0, menu_settings, NULL); +} + // show the currently activated entry void menu_settings_data_init(unsigned int ignored) { UNUSED(ignored); UX_MENU_DISPLAY(N_storage.dataAllowed?1:0, menu_settings_data, NULL); } +void menu_settings_details_init(unsigned int ignored) { + UNUSED(ignored); + UX_MENU_DISPLAY(N_storage.contractDetails?1:0, menu_settings_details, NULL); +} + const ux_menu_entry_t menu_settings_data[] = { {NULL, menu_settings_data_change, 0, NULL, "No", NULL, 0, 0}, {NULL, menu_settings_data_change, 1, NULL, "Yes", NULL, 0, 0}, UX_MENU_END }; +const ux_menu_entry_t menu_settings_details[] = { + {NULL, menu_settings_details_change, 0, NULL, "No", NULL, 0, 0}, + {NULL, menu_settings_details_change, 1, NULL, "Yes", NULL, 0, 0}, + UX_MENU_END +}; + const ux_menu_entry_t menu_settings[] = { {NULL, menu_settings_data_init, 0, NULL, "Contract data", NULL, 0, 0}, + {NULL, menu_settings_details_init, 0, NULL, "Display data", NULL, 0, 0}, {menu_main, NULL, 1, &C_icon_back, "Back", NULL, 61, 40}, UX_MENU_END }; @@ -319,6 +341,19 @@ const bagl_element_t * ui_settings_blue_toggle_data(const bagl_element_t * e) { return 0; } +const bagl_element_t * ui_settings_blue_toggle_details(const bagl_element_t * e) { + // swap setting and request redraw of settings elements + uint8_t setting = N_storage.contractDetails?0:1; + nvm_write(&N_storage.contractDetails, (void*)&setting, sizeof(uint8_t)); + + // only refresh settings mutable drawn elements + UX_REDISPLAY_IDX(7); + + // won't redisplay the bagl_none + return 0; +} + + // don't perform any draw/color change upon finger event over settings const bagl_element_t* ui_settings_out_over(const bagl_element_t* e) { return NULL; @@ -348,6 +383,13 @@ const bagl_element_t ui_settings_blue[] = { {{BAGL_LABELINE , 0x00, 30, 126, 260, 30, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX, 0 }, "Allow contract data in transactions", 0, 0, 0, NULL, NULL, NULL}, {{BAGL_NONE | BAGL_FLAG_TOUCHABLE , 0x00, 0, 78, 320, 68, 0, 0, BAGL_FILL, 0xFFFFFF, 0x000000, 0 , 0 }, NULL, 0, 0xEEEEEE, 0x000000, ui_settings_blue_toggle_data, ui_settings_out_over, ui_settings_out_over }, + {{BAGL_RECTANGLE, 0x00, 30, 146, 260, 1, 1, 0, 0, 0xEEEEEE, COLOR_BG_1, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x00, 30, 174, 160, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX, 0}, "Display data", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x00, 30, 195, 260, 30, 0, 0, BAGL_FILL, 0x999999, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_8_11PX, 0}, "Display contract data details", 0, 0, 0, NULL, NULL, NULL}, + + {{BAGL_NONE | BAGL_FLAG_TOUCHABLE, 0x00, 0, 147, 320, 68, 0, 0, BAGL_FILL, 0xFFFFFF, 0x000000, 0, 0}, NULL, 0, 0xEEEEEE, 0x000000, ui_settings_blue_toggle_details, ui_settings_out_over, ui_settings_out_over}, + + {{BAGL_ICON, 0x02, 258, 167, 32, 18, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, {{BAGL_ICON , 0x01, 258, 98, 32, 18, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, 0, 0 }, NULL, 0, 0, 0, NULL, NULL, NULL}, }; @@ -369,6 +411,15 @@ const bagl_element_t * ui_settings_blue_prepro(const bagl_element_t * e) { tmp_element.text = &C_icon_toggle_reset; } break; + case 0x02: + // swap icon content + if (N_storage.contractDetails) { + tmp_element.text = &C_icon_toggle_set; + } + else { + tmp_element.text = &C_icon_toggle_reset; + } + break; } } return &tmp_element; @@ -549,6 +600,10 @@ const bagl_element_t ui_approval_blue[] = { {{BAGL_NONE | BAGL_FLAG_TOUCHABLE , 0x00, 0, 266, 320, 48, 0, 9, BAGL_FILL, 0xFFFFFF, 0x000000, 0 , 0 }, NULL, 0, 0xEEEEEE, 0x000000, ui_approval_blue_3_details, ui_menu_item_out_over, ui_menu_item_out_over }, {{BAGL_RECTANGLE , 0x22, 0, 266, 5, 48, 0, 0, BAGL_FILL, COLOR_BG_1, COLOR_BG_1, 0 , 0 }, NULL, 0, 0x41CCB4, 0, NULL, NULL, NULL }, + {{BAGL_RECTANGLE, 0x90, 30, 314, 260, 1, 1, 0, 0, 0xEEEEEE, COLOR_BG_1, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x90, 30, 343, 120, 30, 0, 0, BAGL_FILL, 0x000000, COLOR_BG_1, BAGL_FONT_OPEN_SANS_SEMIBOLD_8_11PX, 0}, "CONTRACT DATA", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x90, 133, 343, 140, 30, 0, 0, BAGL_FILL, 0x666666, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_10_13PX | BAGL_FONT_ALIGNMENT_RIGHT, 0}, "Present", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_ICON, 0x90, 278, 333, 12, 12, 0, 0, BAGL_FILL, 0, COLOR_BG_1, 0, 0}, &C_icon_warning, 0, 0, 0, NULL, NULL, NULL}, {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 40, 414, 115, 36, 0,18, BAGL_FILL, 0xCCCCCC, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_11_14PX|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, "REJECT", 0, 0xB7B7B7, COLOR_BG_1, ui_approval_blue_cancel_callback, NULL, NULL}, {{BAGL_RECTANGLE | BAGL_FLAG_TOUCHABLE, 0x00, 165, 414, 115, 36, 0,18, BAGL_FILL, 0x41ccb4, COLOR_BG_1, BAGL_FONT_OPEN_SANS_REGULAR_11_14PX|BAGL_FONT_ALIGNMENT_CENTER|BAGL_FONT_ALIGNMENT_MIDDLE, 0 }, "CONFIRM", 0, 0x3ab7a2, COLOR_BG_1, ui_approval_blue_ok_callback, NULL, NULL}, @@ -619,6 +674,9 @@ const bagl_element_t* ui_approval_blue_prepro(const bagl_element_t* element) { // horizontal delimiter case 0x30: return ui_approval_blue_details_name[G_ui_approval_blue_state][element->component.userid&0xF]!=NULL?&tmp_element:NULL; + + case 0x90: + return (dataPresent && !N_storage.contractDetails); } } return &tmp_element; @@ -722,14 +780,17 @@ const bagl_element_t ui_approval_nanos[] = { {{BAGL_LABELINE , 0x01, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Confirm", 0, 0, 0, NULL, NULL, NULL }, {{BAGL_LABELINE , 0x01, 0, 26, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "transaction", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE , 0x02, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Amount", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE , 0x02, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 26 }, (char*)strings.common.fullAmount, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, "WARNING", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, "Data present", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE , 0x03, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Address", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE , 0x03, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 50 }, (char*)strings.common.fullAddress, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x03, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Amount", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x03, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 26 }, (char*)strings.common.fullAmount, 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE , 0x04, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Maximum fees", 0, 0, 0, NULL, NULL, NULL }, - {{BAGL_LABELINE , 0x04, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 26 }, (char*)strings.common.maxFee, 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x04, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Address", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x04, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 50 }, (char*)strings.common.fullAddress, 0, 0, 0, NULL, NULL, NULL }, + + {{BAGL_LABELINE , 0x05, 0, 12, 128, 32, 0, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, "Maximum fees", 0, 0, 0, NULL, NULL, NULL }, + {{BAGL_LABELINE , 0x05, 23, 26, 82, 12, 0x80|10, 0, 0 , 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 26 }, (char*)strings.common.maxFee, 0, 0, 0, NULL, NULL, NULL }, }; @@ -743,7 +804,13 @@ unsigned int ui_approval_prepro(const bagl_element_t* element) { UX_CALLBACK_SET_INTERVAL(2000); break; case 2: - UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); + if (dataPresent && !N_storage.contractDetails) { + UX_CALLBACK_SET_INTERVAL(3000); + } + else { + display = 0; + ux_step++; // display the next step + } break; case 3: UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); @@ -751,6 +818,9 @@ unsigned int ui_approval_prepro(const bagl_element_t* element) { case 4: UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); break; + case 5: + UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000+bagl_label_roundtrip_duration_ms(element, 7))); + break; } } } @@ -843,75 +913,14 @@ unsigned int ui_data_selector_blue_button(unsigned int button_mask, unsigned int const bagl_element_t ui_data_selector_nanos[] = { // type userid x y w h str rad // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS}, NULL, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK}, NULL, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, "Confirm", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, "selector", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - //{{BAGL_ICON , 0x01, 31, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_EYE_BADGE }, NULL, 0, 0, 0, - //NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "selector", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Selector", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)strings.tmp.tmp, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, "Selector", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, (char *)strings.tmp.tmp, 0, 0, 0, NULL, NULL, NULL}, }; unsigned int ui_data_selector_prepro(const bagl_element_t *element) { @@ -1011,75 +1020,16 @@ unsigned int ui_data_parameter_blue_button(unsigned int button_mask, unsigned in const bagl_element_t ui_data_parameter_nanos[] = { // type userid x y w h str rad // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL, 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS}, NULL, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK}, NULL, 0, 0, 0, NULL, NULL, NULL}, - //{{BAGL_ICON , 0x01, 31, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_EYE_BADGE }, NULL, 0, 0, 0, - //NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "parameter", - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, "Confirm", 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, "parameter", 0, 0, 0, NULL, NULL, NULL}, - {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (char*)strings.tmp.tmp2, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)strings.tmp.tmp, - 0, - 0, - 0, - NULL, - NULL, - NULL}, + {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, (char*)strings.tmp.tmp2, 0, 0, 0, NULL, NULL, NULL}, + {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, (char *)strings.tmp.tmp, 0, 0, 0, NULL, NULL, NULL}, }; unsigned int ui_data_parameter_prepro(const bagl_element_t *element) { @@ -1636,7 +1586,7 @@ customStatus_e customProcessor(txContext_t *context) { dataPresent = true; // If handling a new contract rather than a function call, abort immediately if (tmpContent.txContent.destinationLength == 0) { - return CUSTOM_HANDLED; + return CUSTOM_NOT_HANDLED; } if (context->currentFieldPos == 0) { // If handling the beginning of the data field, assume that the function selector is present @@ -1677,6 +1627,9 @@ customStatus_e customProcessor(txContext_t *context) { PRINTF("Data field forbidden\n"); return CUSTOM_FAULT; } + if (!N_storage.contractDetails) { + return CUSTOM_NOT_HANDLED; + } dataContext.rawDataContext.fieldIndex = 0; dataContext.rawDataContext.fieldOffset = 0; blockSize = 4; @@ -1931,7 +1884,7 @@ void finalizeParsing(bool direct) { ui_approval_transaction_blue_init(); #elif defined(TARGET_NANOS) ux_step = 0; - ux_step_count = 4; + ux_step_count = 5; UX_DISPLAY(ui_approval_nanos, ui_approval_prepro); #endif // #if TARGET_ID } @@ -2358,10 +2311,12 @@ __attribute__((section(".boot"))) int main(int arg0) { if (N_storage.initialized != 0x01) { internalStorage_t storage; storage.dataAllowed = 0x00; + storage.contractDetails = 0x00; storage.initialized = 0x01; nvm_write(&N_storage, (void*)&storage, sizeof(internalStorage_t)); } dataAllowed = N_storage.dataAllowed; + contractDetails = N_storage.contractDetails; USB_power(0); USB_power(1); diff --git a/src_genericwallet/tokens.c b/src_genericwallet/tokens.c index 2ae1e62..b5a88f6 100644 --- a/src_genericwallet/tokens.c +++ b/src_genericwallet/tokens.c @@ -22,12 +22,15 @@ const tokenDefinition_t const TOKENS_AKROMA[NUM_TOKENS_AKROMA] = {}; const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x4E,0x84,0xE9,0xe5,0xfb,0x0A,0x97,0x26,0x28,0xCf,0x45,0x68,0xc4,0x03,0x16,0x7E,0xF1,0xD4,0x04,0x31}, "$FFC ", 18}, {{0xa0,0x24,0xe8,0x05,0x7e,0xec,0x47,0x4a,0x9b,0x23,0x56,0x83,0x37,0x07,0xdd,0x05,0x79,0xe2,0x6e,0xf3}, "$FYX ", 18}, + {{0xcd,0xb7,0xec,0xfd,0x34,0x03,0xee,0xf3,0x88,0x2c,0x65,0xb7,0x61,0xef,0x9b,0x50,0x54,0x89,0x0a,0x47}, "$HUR ", 18}, + {{0x0d,0xb8,0xd8,0xb7,0x6b,0xc3,0x61,0xba,0xcb,0xb7,0x2e,0x2c,0x49,0x1e,0x06,0x08,0x5a,0x97,0xab,0x31}, "$IQN ", 18}, {{0x7d,0xd7,0xf5,0x6d,0x69,0x7c,0xc0,0xf2,0xb5,0x2b,0xd5,0x5c,0x05,0x7f,0x37,0x8f,0x1f,0xe6,0xab,0x4b}, "$TEAK ", 18}, {{0xB6,0xeD,0x76,0x44,0xC6,0x94,0x16,0xd6,0x7B,0x52,0x2e,0x20,0xbC,0x29,0x4A,0x9a,0x9B,0x40,0x5B,0x31}, "0xBTC ", 8}, {{0xAf,0x30,0xD2,0xa7,0xE9,0x0d,0x7D,0xC3,0x61,0xc8,0xC4,0x58,0x5e,0x9B,0xB7,0xD2,0xF6,0xf1,0x5b,0xc7}, "1ST ", 18}, {{0xfd,0xbc,0x1a,0xdc,0x26,0xf0,0xf8,0xf8,0x60,0x6a,0x5d,0x63,0xb7,0xd3,0xa3,0xcd,0x21,0xc2,0x2b,0x23}, "1WO ", 8}, {{0x9f,0xC0,0x58,0x32,0x20,0xeB,0x44,0xfA,0xeE,0x9e,0x2d,0xc1,0xE6,0x3F,0x39,0x20,0x4D,0xDD,0x90,0x90}, "2DC ", 18}, {{0xaE,0xc9,0x8A,0x70,0x88,0x10,0x41,0x48,0x78,0xc3,0xBC,0xDF,0x46,0xAa,0xd3,0x1d,0xEd,0x4a,0x45,0x57}, "300 ", 18}, + {{0x43,0x02,0x41,0x36,0x8c,0x1D,0x29,0x3f,0xdA,0x21,0xDB,0xa8,0xBb,0x7a,0xF3,0x20,0x07,0xc5,0x91,0x09}, "3LT ", 8}, {{0xBD,0xe8,0xf7,0x82,0x0b,0x55,0x44,0xa4,0x9D,0x34,0xF9,0xdD,0xea,0xCA,0xbE,0xDC,0x7C,0x0B,0x5a,0xdc}, "A18 ", 0}, {{0xb9,0x8d,0x4c,0x97,0x42,0x5d,0x99,0x08,0xe6,0x6e,0x53,0xa6,0xfd,0xf6,0x73,0xac,0xca,0x0b,0xe9,0x86}, "ABT ", 18}, {{0x0e,0x8d,0x6b,0x47,0x1e,0x33,0x2f,0x14,0x0e,0x7d,0x9d,0xbb,0x99,0xe5,0xe3,0x82,0x2f,0x72,0x8d,0xa6}, "ABYSS ", 18}, @@ -43,11 +46,13 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x4C,0xEd,0xA7,0x90,0x6a,0x5E,0xd2,0x17,0x97,0x85,0xCd,0x3A,0x40,0xA6,0x9e,0xe8,0xbc,0x99,0xC4,0x66}, "AION ", 8}, {{0x27,0xdc,0xe1,0xec,0x4d,0x3f,0x72,0xc3,0xe4,0x57,0xcc,0x50,0x35,0x4f,0x1f,0x97,0x5d,0xde,0xf4,0x88}, "AIR ", 8}, {{0x10,0x63,0xce,0x52,0x42,0x65,0xd5,0xa3,0xA6,0x24,0xf4,0x91,0x4a,0xcd,0x57,0x3d,0xD8,0x9c,0xe9,0x88}, "AIX ", 18}, + {{0x1c,0xa4,0x3a,0x17,0x0b,0xad,0x61,0x93,0x22,0xe6,0xf5,0x4d,0x46,0xb5,0x7e,0x50,0x4d,0xb6,0x63,0xaa}, "AKC ", 18}, {{0x18,0x1a,0x63,0x74,0x6d,0x3a,0xdc,0xf3,0x56,0xcb,0xc7,0x3a,0xce,0x22,0x83,0x2f,0xfb,0xb1,0xee,0x5a}, "ALCO ", 8}, {{0xEA,0x61,0x0B,0x11,0x53,0x47,0x77,0x20,0x74,0x8D,0xC1,0x3E,0xD3,0x78,0x00,0x39,0x41,0xd8,0x4f,0xAB}, "ALIS ", 18}, {{0x63,0x8a,0xc1,0x49,0xea,0x8e,0xf9,0xa1,0x28,0x6c,0x41,0xb9,0x77,0x01,0x7a,0xa7,0x35,0x9e,0x6c,0xfa}, "ALTS ", 18}, {{0x4d,0xc3,0x64,0x3d,0xbc,0x64,0x2b,0x72,0xc1,0x58,0xe7,0xf3,0xd2,0xff,0x23,0x2d,0xf6,0x1c,0xb6,0xce}, "AMB ", 18}, {{0x94,0x9b,0xed,0x88,0x6c,0x73,0x9f,0x1a,0x32,0x73,0x62,0x9b,0x33,0x20,0xdb,0x0c,0x50,0x24,0xc7,0x19}, "AMIS ", 9}, + {{0xca,0x0e,0x72,0x69,0x60,0x0d,0x35,0x3f,0x70,0xb1,0x4a,0xd1,0x18,0xa4,0x95,0x75,0x45,0x5c,0x0f,0x2f}, "AMLT ", 18}, {{0x73,0x7f,0x98,0xac,0x8c,0xa5,0x9f,0x2c,0x68,0xad,0x65,0x8e,0x3c,0x3d,0x8c,0x89,0x63,0xe4,0x0a,0x4c}, "AMN ", 18}, {{0x38,0xc8,0x7a,0xa8,0x9b,0x2b,0x8c,0xd9,0xb9,0x5b,0x73,0x6e,0x1f,0xa7,0xb6,0x12,0xea,0x97,0x21,0x69}, "AMO ", 18}, {{0x84,0x93,0x6c,0xF7,0x63,0x0A,0xA3,0xe2,0x7D,0xd9,0xAf,0xF9,0x68,0xb1,0x40,0xd5,0xAE,0xE4,0x9F,0x5a}, "AMTC ", 8}, @@ -72,7 +77,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xeD,0x24,0x79,0x80,0x39,0x6B,0x10,0x16,0x9B,0xB1,0xd3,0x6f,0x6e,0x27,0x8e,0xD1,0x67,0x00,0xa6,0x0f}, "AVA ", 4}, {{0x0d,0x88,0xed,0x6e,0x74,0xbb,0xfd,0x96,0xb8,0x31,0x23,0x16,0x38,0xb6,0x6c,0x05,0x57,0x1e,0x82,0x4f}, "AVT ", 18}, {{0xcd,0x4b,0x4b,0x0f,0x32,0x84,0xa3,0x3a,0xc4,0x9c,0x67,0x96,0x1e,0xc6,0xe1,0x11,0x70,0x83,0x18,0xcf}, "AX1 ", 5}, - {{0x9a,0xf2,0xc6,0xB1,0xA2,0x8D,0x3d,0x6B,0xC0,0x84,0xbd,0x26,0x7F,0x70,0xe9,0x0d,0x49,0x74,0x1D,0x5B}, "AXP ", 8}, + {{0xC3,0x9E,0x62,0x6A,0x04,0xC5,0x97,0x1D,0x77,0x0e,0x31,0x97,0x60,0xD7,0x92,0x65,0x02,0x97,0x5e,0x47}, "AXPR ", 18}, {{0xf8,0x7f,0x0d,0x91,0x53,0xfe,0xa5,0x49,0xc7,0x28,0xad,0x61,0xcb,0x80,0x15,0x95,0xa6,0x8b,0x73,0xde}, "BANX ", 18}, {{0x0D,0x87,0x75,0xF6,0x48,0x43,0x06,0x79,0xA7,0x09,0xE9,0x8d,0x2b,0x0C,0xb6,0x25,0x0d,0x28,0x87,0xEF}, "BAT ", 18}, {{0x4a,0x60,0x58,0x66,0x6c,0xf1,0x05,0x7e,0xaC,0x3C,0xD3,0xA5,0xa6,0x14,0x62,0x05,0x47,0x55,0x9f,0xc9}, "BBK ", 18}, @@ -87,6 +92,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x74,0xC1,0xE4,0xb8,0xca,0xE5,0x92,0x69,0xec,0x1D,0x85,0xD3,0xD4,0xF3,0x24,0x39,0x60,0x48,0xF4,0xac}, "BeerCoin ", 0}, {{0x6a,0xeb,0x95,0xf0,0x6c,0xda,0x84,0xca,0x34,0x5c,0x2d,0xe0,0xf3,0xb7,0xf9,0x69,0x23,0xa4,0x4f,0x4c}, "BERRY ", 14}, {{0x8a,0xA3,0x3A,0x78,0x99,0xFC,0xC8,0xeA,0x5f,0xBe,0x6A,0x60,0x8A,0x10,0x9c,0x38,0x93,0xA1,0xB8,0xb2}, "BET ", 18}, + {{0x14,0xC9,0x26,0xF2,0x29,0x00,0x44,0xB6,0x47,0xe1,0xBf,0x20,0x72,0xe6,0x7B,0x49,0x5e,0xff,0x19,0x05}, "BETHER ", 18}, {{0x76,0x31,0x86,0xeb,0x8d,0x48,0x56,0xd5,0x36,0xed,0x44,0x78,0x30,0x29,0x71,0x21,0x4f,0xeb,0xc6,0xa9}, "BETR ", 18}, {{0xb2,0xbf,0xeb,0x70,0xb9,0x03,0xf1,0xba,0xac,0x7f,0x2b,0xa2,0xc6,0x29,0x34,0xc7,0xe5,0xb9,0x74,0xc4}, "BKB ", 8}, {{0x3c,0xf9,0xe0,0xc3,0x85,0xa5,0xab,0xec,0x9f,0xd2,0xa7,0x17,0x90,0xaa,0x34,0x4c,0x4e,0x8e,0x35,0x70}, "BKRx ", 18}, @@ -107,8 +113,9 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xCc,0x34,0x36,0x6E,0x38,0x42,0xcA,0x1B,0xD3,0x6c,0x1f,0x32,0x4d,0x15,0x25,0x79,0x60,0xfC,0xC8,0x01}, "BON ", 18}, {{0x7f,0x1e,0x2c,0x7d,0x6a,0x69,0xbf,0x34,0x82,0x4d,0x72,0xc5,0x3b,0x45,0x50,0xe8,0x95,0xc0,0xd8,0xc2}, "BOP ", 8}, {{0xC2,0xC6,0x3F,0x23,0xec,0x5E,0x97,0xef,0xbD,0x75,0x65,0xdF,0x9E,0xc7,0x64,0xFD,0xc7,0xd4,0xe9,0x1d}, "BOU ", 18}, + {{0xe1,0xA1,0x78,0xB6,0x81,0xBD,0x05,0x96,0x4d,0x3e,0x3E,0xd3,0x3A,0xE7,0x31,0x57,0x7d,0x9d,0x96,0xdD}, "BOX ", 18}, {{0x32,0x76,0x82,0x77,0x9b,0xAB,0x2B,0xF4,0xd1,0x33,0x7e,0x89,0x74,0xab,0x9d,0xE8,0x27,0x5A,0x7C,0xa8}, "BPT ", 18}, - {{0x5A,0xf2,0xBe,0x19,0x3a,0x6A,0xBC,0xa9,0xc8,0x81,0x70,0x01,0xF4,0x57,0x44,0x77,0x7D,0xb3,0x07,0x56}, "BQX ", 8}, + {{0x5A,0xf2,0xBe,0x19,0x3a,0x6A,0xBC,0xa9,0xc8,0x81,0x70,0x01,0xF4,0x57,0x44,0x77,0x7D,0xb3,0x07,0x56}, "ETHOS ", 8}, {{0x9E,0x77,0xD5,0xa1,0x25,0x1b,0x6F,0x7D,0x45,0x67,0x22,0xA6,0xea,0xC6,0xD2,0xd5,0x98,0x0b,0xd8,0x91}, "BRAT ", 8}, {{0x55,0x8e,0xc3,0x15,0x2e,0x2e,0xb2,0x17,0x49,0x05,0xcd,0x19,0xae,0xa4,0xe3,0x4a,0x23,0xde,0x9a,0xd6}, "BRD ", 18}, {{0xf2,0x6e,0xf5,0xe0,0x54,0x53,0x84,0xb7,0xdc,0xc0,0xf2,0x97,0xf2,0x67,0x41,0x89,0x58,0x68,0x30,0xdf}, "BSDC ", 18}, @@ -117,7 +124,6 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x5a,0xcD,0x19,0xb9,0xc9,0x1e,0x59,0x6b,0x1f,0x06,0x2f,0x18,0xe3,0xD0,0x2d,0xa7,0xeD,0x8D,0x1e,0x50}, "BTCL ", 8}, {{0x73,0xdd,0x06,0x9c,0x29,0x9a,0x5d,0x69,0x1e,0x98,0x36,0x24,0x3b,0xca,0xec,0x9c,0x8c,0x1d,0x87,0x34}, "BTE ", 8}, {{0xfa,0xd5,0x72,0xdb,0x56,0x6e,0x52,0x34,0xac,0x9f,0xc3,0xd5,0x70,0xc4,0xed,0xc0,0x05,0x0e,0xaa,0x92}, "BTH ", 18}, - {{0x14,0xC9,0x26,0xF2,0x29,0x00,0x44,0xB6,0x47,0xe1,0xBf,0x20,0x72,0xe6,0x7B,0x49,0x5e,0xff,0x19,0x05}, "BETHER ", 18}, {{0xdb,0x86,0x46,0xf5,0xb4,0x87,0xb5,0xdd,0x97,0x9f,0xac,0x61,0x83,0x50,0xe8,0x50,0x18,0xf5,0x57,0xd4}, "BTK ", 18}, {{0x2a,0xcc,0xaB,0x9c,0xb7,0xa4,0x8c,0x3E,0x82,0x28,0x6F,0x0b,0x2f,0x87,0x98,0xD2,0x01,0xF4,0xeC,0x3f}, "Battle ", 18}, {{0x92,0x68,0x5E,0x93,0x95,0x65,0x37,0xc2,0x5B,0xb7,0x5D,0x5d,0x47,0xfc,0xa4,0x26,0x6d,0xd6,0x28,0xB8}, "Bitlle ", 4}, @@ -125,12 +131,14 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x16,0xB0,0xE6,0x2a,0xC1,0x3a,0x2f,0xAe,0xD3,0x6D,0x18,0xbc,0xe2,0x35,0x6d,0x25,0xAb,0x3C,0xfA,0xD3}, "BTQ ", 18}, {{0x08,0x0a,0xa0,0x7e,0x2c,0x71,0x85,0x15,0x0d,0x7e,0x4d,0xa9,0x88,0x38,0xa8,0xd2,0xfe,0xac,0x3d,0xfc}, "Bit eth ", 0}, {{0xFA,0x45,0x6C,0xf5,0x52,0x50,0xA8,0x39,0x08,0x8b,0x27,0xEE,0x32,0xA4,0x24,0xd7,0xDA,0xcB,0x54,0xFf}, "BlkTrade ", 18}, + {{0xE5,0xf8,0x67,0xdE,0x1E,0xA8,0x13,0x46,0xdf,0x51,0x81,0xb8,0xb4,0x8D,0xD6,0xB0,0xBB,0x33,0x57,0xB0}, "BTZ ", 18}, {{0xca,0x3c,0x18,0xa6,0x5b,0x80,0x2e,0xc2,0x67,0xf8,0xf4,0x80,0x25,0x45,0xe7,0xf5,0x3d,0x24,0xc7,0x5e}, "BUC ", 18}, {{0x26,0xE7,0x53,0x07,0xFc,0x0C,0x02,0x14,0x72,0xfE,0xb8,0xF7,0x27,0x83,0x95,0x31,0xF1,0x12,0xf3,0x17}, "C20 ", 18}, {{0xd4,0x2d,0xeb,0xE4,0xeD,0xc9,0x2B,0xd5,0xa3,0xFB,0xb4,0x24,0x3e,0x1e,0xcC,0xf6,0xd6,0x3A,0x4A,0x5d}, "C8 ", 18}, {{0x7d,0x4b,0x8C,0xce,0x05,0x91,0xC9,0x04,0x4a,0x22,0xee,0x54,0x35,0x33,0xb7,0x2E,0x97,0x6E,0x36,0xC3}, "CAG ", 18}, {{0x1d,0x46,0x24,0x14,0xfe,0x14,0xcf,0x48,0x9c,0x7A,0x21,0xCa,0xC7,0x85,0x09,0xf4,0xbF,0x8C,0xD7,0xc0}, "CAN ", 6}, {{0x42,0x3e,0x43,0x22,0xcd,0xda,0x29,0x15,0x6b,0x49,0xa1,0x7d,0xfb,0xd2,0xac,0xc4,0xb2,0x80,0x60,0x0d}, "CAR ", 9}, + {{0x4d,0x9e,0x23,0xa3,0x84,0x2f,0xe7,0xeb,0x76,0x82,0xb9,0x72,0x5c,0xf6,0xc5,0x07,0xc4,0x24,0xa4,0x1b}, "Carblock ", 18}, {{0xa5,0x17,0xa4,0x6b,0xaa,0xd6,0xb0,0x54,0xa7,0x6b,0xd1,0x9c,0x46,0x84,0x4f,0x71,0x7f,0xe6,0x9f,0xea}, "CARB ", 8}, {{0xB0,0x7e,0xc2,0xc2,0x88,0x34,0xB8,0x89,0xb1,0xCE,0x52,0x7C,0xa0,0xF1,0x93,0x64,0xcD,0x38,0x93,0x5c}, "CARD ", 18}, {{0xbf,0x18,0xf2,0x46,0xb9,0x30,0x1f,0x23,0x1e,0x95,0x61,0xb3,0x5a,0x38,0x79,0x76,0x9b,0xb4,0x63,0x75}, "CARE ", 18}, @@ -149,6 +157,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x6f,0xFF,0x38,0x06,0xBb,0xac,0x52,0xA2,0x0e,0x0d,0x79,0xBC,0x53,0x8d,0x52,0x7f,0x6a,0x22,0xc9,0x6b}, "CDX Net ", 18}, {{0xb0,0x56,0xc3,0x8f,0x6b,0x7d,0xc4,0x06,0x43,0x67,0x40,0x3e,0x26,0x42,0x4c,0xd2,0xc6,0x06,0x55,0xe1}, "CEEK ", 18}, {{0xf6,0x60,0xca,0x1e,0x22,0x8e,0x7b,0xe1,0xfa,0x8b,0x4f,0x55,0x83,0x14,0x5e,0x31,0x14,0x7f,0xb5,0x77}, "CET ", 18}, + {{0x5d,0xff,0x89,0xa2,0xca,0xa4,0xd7,0x6b,0xc2,0x86,0xf7,0x4d,0x67,0xbd,0x71,0x8e,0xb8,0x34,0xda,0x61}, "CFC ", 18}, {{0x12,0xFE,0xF5,0xe5,0x7b,0xF4,0x58,0x73,0xCd,0x9B,0x62,0xE9,0xDB,0xd7,0xBF,0xb9,0x9e,0x32,0xD7,0x3e}, "CFI ", 18}, {{0x69,0x56,0x98,0x3f,0x8b,0x3c,0xe1,0x73,0xb4,0xab,0x84,0x36,0x1a,0xa0,0xad,0x52,0xf3,0x8d,0x93,0x6f}, "CFTY ", 8}, {{0xba,0x9d,0x41,0x99,0xfa,0xb4,0xf2,0x6e,0xfe,0x35,0x51,0xd4,0x90,0xe3,0x82,0x14,0x86,0xf1,0x35,0xba}, "CHSB ", 8}, @@ -177,6 +186,8 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xAe,0xf3,0x8f,0xBF,0xBF,0x93,0x2D,0x1A,0xeF,0x3B,0x80,0x8B,0xc8,0xfB,0xd8,0xCd,0x8E,0x1f,0x8B,0xC5}, "CRB ", 8}, {{0x67,0x2a,0x1A,0xD4,0xf6,0x67,0xFB,0x18,0xA3,0x33,0xAf,0x13,0x66,0x7a,0xa0,0xAf,0x1F,0x5b,0x5b,0xDD}, "CRED ", 18}, {{0x4e,0x06,0x03,0xe2,0xa2,0x7a,0x30,0x48,0x0e,0x5e,0x3a,0x4f,0xe5,0x48,0xe2,0x9e,0xf1,0x2f,0x64,0xbe}, "CREDO ", 18}, + {{0xf4,0x9c,0xdd,0x50,0xad,0x40,0x8d,0x38,0x7d,0x61,0x1f,0x88,0xa6,0x47,0x17,0x9c,0x3d,0xe3,0x49,0x2b}, "CRGO ", 18}, + {{0x92,0x38,0xbf,0xb7,0x81,0xa5,0x5e,0xac,0xc3,0xcf,0x05,0xf7,0xdf,0x94,0x03,0x8c,0x19,0x8c,0xd9,0xb9}, "CRMT ", 8}, {{0x80,0xa7,0xe0,0x48,0xf3,0x7a,0x50,0x50,0x03,0x51,0xc2,0x04,0xcb,0x40,0x77,0x66,0xfa,0x3b,0xae,0x7f}, "CRPT ", 18}, {{0xF0,0xda,0x11,0x86,0xa4,0x97,0x72,0x26,0xb9,0x13,0x5d,0x06,0x13,0xee,0x72,0xe2,0x29,0xEC,0x3F,0x4d}, "CRT ", 18}, {{0xE4,0xc9,0x4d,0x45,0xf7,0xAe,0xf7,0x01,0x8a,0x5D,0x66,0xf4,0x4a,0xF7,0x80,0xec,0x60,0x23,0x37,0x8e}, "CrCarbon ", 6}, @@ -186,10 +197,12 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xbf,0x4c,0xfd,0x7d,0x1e,0xde,0xee,0xa5,0xf6,0x60,0x08,0x27,0x41,0x1b,0x41,0xa2,0x1e,0xb0,0x8a,0xbd}, "CTL ", 2}, {{0xE3,0xFa,0x17,0x7A,0xce,0xcf,0xB8,0x67,0x21,0xCf,0x6f,0x9f,0x42,0x06,0xbd,0x3B,0xd6,0x72,0xD7,0xd5}, "CTT ", 18}, {{0x66,0x2a,0xBc,0xAd,0x0b,0x7f,0x34,0x5A,0xB7,0xFf,0xB1,0xb1,0xfb,0xb9,0xDf,0x78,0x94,0xf1,0x8e,0x66}, "CTX ", 18}, + {{0x05,0xc3,0x61,0x7c,0xbf,0x13,0x04,0xb9,0x26,0x0a,0xa6,0x1e,0xc9,0x60,0xf1,0x15,0xd6,0x7b,0xec,0xea}, "Cubrix ", 18}, {{0xdA,0x6c,0xb5,0x8A,0x0D,0x0C,0x01,0x61,0x0a,0x29,0xc5,0xA6,0x5c,0x30,0x3e,0x13,0xe8,0x85,0x88,0x7C}, "cV ", 18}, {{0x41,0xe5,0x56,0x00,0x54,0x82,0x4e,0xa6,0xb0,0x73,0x2e,0x65,0x6e,0x3a,0xd6,0x4e,0x20,0xe9,0x4e,0x45}, "CVC ", 8}, {{0x21,0x34,0x05,0x7c,0x0b,0x46,0x1f,0x89,0x8d,0x37,0x5c,0xea,0xd6,0x52,0xac,0xae,0x62,0xb5,0x95,0x41}, "CXC ", 18}, {{0xb6,0xEE,0x96,0x68,0x77,0x1a,0x79,0xbe,0x79,0x67,0xee,0x29,0xa6,0x3D,0x41,0x84,0xF8,0x09,0x71,0x43}, "CXO ", 18}, + {{0x3f,0x06,0xB5,0xD7,0x84,0x06,0xcD,0x97,0xbd,0xf1,0x0f,0x5C,0x42,0x0B,0x24,0x1D,0x32,0x75,0x9c,0x80}, "CYFM ", 18}, {{0xda,0xb0,0xC3,0x1B,0xF3,0x4C,0x89,0x7F,0xb0,0xFe,0x90,0xD1,0x2E,0xC9,0x40,0x1c,0xaf,0x5c,0x36,0xEc}, "DAB ", 0}, {{0xfb,0x2f,0x26,0xf2,0x66,0xfb,0x28,0x05,0xa3,0x87,0x23,0x0f,0x2a,0xa0,0xa3,0x31,0xb4,0xd9,0x6f,0xba}, "DADI ", 18}, {{0x89,0xd2,0x4A,0x6b,0x4C,0xcB,0x1B,0x6f,0xAA,0x26,0x25,0xfE,0x56,0x2b,0xDD,0x9a,0x23,0x26,0x03,0x59}, "DAI ", 18}, @@ -199,20 +212,24 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x81,0xc9,0x15,0x1d,0xe0,0xc8,0xba,0xfc,0xd3,0x25,0xa5,0x7e,0x3d,0xb5,0xa5,0xdf,0x1c,0xeb,0xf7,0x9c}, "DAT ", 18}, {{0x1b,0x5f,0x21,0xee,0x98,0xee,0xd4,0x8d,0x29,0x2e,0x8e,0x2d,0x3e,0xd8,0x2b,0x40,0xa9,0x72,0x8a,0x22}, "DATABrkr ", 18}, {{0x0c,0xf0,0xee,0x63,0x78,0x8a,0x08,0x49,0xfe,0x52,0x97,0xf3,0x40,0x7f,0x70,0x1e,0x12,0x2c,0xc0,0x23}, "DATACoin ", 18}, - {{0x61,0x72,0x5f,0x3d,0xb4,0x00,0x4a,0xfe,0x01,0x47,0x45,0xb2,0x1d,0xab,0x1e,0x16,0x77,0xcc,0x32,0x8b}, "DAXT ", 18}, {{0xd8,0x2D,0xf0,0xAB,0xD3,0xf5,0x14,0x25,0xEb,0x15,0xef,0x75,0x80,0xfD,0xA5,0x57,0x27,0x87,0x5f,0x14}, "DAV ", 18}, + {{0x61,0x72,0x5f,0x3d,0xb4,0x00,0x4a,0xfe,0x01,0x47,0x45,0xb2,0x1d,0xab,0x1e,0x16,0x77,0xcc,0x32,0x8b}, "DAXT ", 18}, {{0x38,0x6F,0xaa,0x47,0x03,0xa3,0x4a,0x7F,0xdb,0x19,0xBe,0xc2,0xe1,0x4F,0xd4,0x27,0xC9,0x63,0x84,0x16}, "DCA ", 18}, + {{0xff,0xa9,0x3a,0xac,0xf4,0x92,0x97,0xd5,0x1e,0x21,0x18,0x17,0x45,0x28,0x39,0x05,0x2f,0xdf,0xb9,0x61}, "DCC ", 18}, {{0x39,0x9A,0x0e,0x6F,0xbE,0xb3,0xd7,0x4c,0x85,0x35,0x74,0x39,0xf4,0xc8,0xAe,0xD9,0x67,0x8a,0x5c,0xbF}, "DCL ", 3}, {{0x08,0xd3,0x2b,0x0d,0xa6,0x3e,0x2C,0x3b,0xcF,0x80,0x19,0xc9,0xc5,0xd8,0x49,0xd7,0xa9,0xd7,0x91,0xe6}, "DCN ", 0}, {{0xcC,0x4e,0xF9,0xEE,0xAF,0x65,0x6a,0xC1,0xa2,0xAb,0x88,0x67,0x43,0xE9,0x8e,0x97,0xE0,0x90,0xed,0x38}, "DDF ", 18}, {{0x15,0x12,0x02,0xC9,0xc1,0x8e,0x49,0x56,0x56,0xf3,0x72,0x28,0x1F,0x49,0x3E,0xB7,0x69,0x89,0x61,0xD5}, "DEB ", 18}, {{0x35,0x97,0xbf,0xd5,0x33,0xa9,0x9c,0x9a,0xa0,0x83,0x58,0x7b,0x07,0x44,0x34,0xe6,0x1e,0xb0,0xa2,0x58}, "DENT ", 8}, {{0x7c,0xF2,0x71,0x96,0x6F,0x36,0x34,0x3B,0xf0,0x15,0x0F,0x25,0xE5,0x36,0x4f,0x79,0x61,0xc5,0x82,0x01}, "DEPO ", 0}, + {{0x89,0xcb,0xea,0xc5,0xe8,0xa1,0x3f,0x0e,0xbb,0x4c,0x74,0xfa,0xdf,0xc6,0x9b,0xe8,0x1a,0x50,0x11,0x06}, "DeposNet ", 18}, {{0xdd,0x94,0xDe,0x9c,0xFE,0x06,0x35,0x77,0x05,0x1A,0x5e,0xb7,0x46,0x5D,0x08,0x31,0x7d,0x88,0x08,0xB6}, "Devcon2 ", 0}, {{0xE0,0xB7,0x92,0x7c,0x4a,0xF2,0x37,0x65,0xCb,0x51,0x31,0x4A,0x0E,0x05,0x21,0xA9,0x64,0x5F,0x0E,0x2A}, "DGD ", 9}, {{0xf6,0xcF,0xe5,0x3d,0x6F,0xEb,0xaE,0xEA,0x05,0x1f,0x40,0x0f,0xf5,0xfc,0x14,0xF0,0xcB,0xBD,0xac,0xA1}, "DGPT ", 18}, {{0x6a,0xED,0xbF,0x8d,0xFF,0x31,0x43,0x72,0x20,0xdF,0x35,0x19,0x50,0xBa,0x2a,0x33,0x62,0x16,0x8d,0x1b}, "DGS ", 8}, - {{0x55,0xb9,0xa1,0x1c,0x2e,0x83,0x51,0xb4,0xFf,0xc7,0xb1,0x15,0x61,0x14,0x8b,0xfa,0xC9,0x97,0x78,0x55}, "DGX ", 9}, + {{0x1c,0x83,0x50,0x14,0x78,0xf1,0x32,0x09,0x77,0x04,0x70,0x08,0x49,0x6d,0xac,0xbd,0x60,0xbb,0x15,0xef}, "DGTX ", 18}, + {{0x4f,0x3a,0xfe,0xc4,0xe5,0xa3,0xf2,0xa6,0xa1,0xa4,0x11,0xde,0xf7,0xd7,0xdf,0xe5,0x0e,0xe0,0x57,0xbf}, "DGX ", 9}, + {{0x55,0xb9,0xa1,0x1c,0x2e,0x83,0x51,0xb4,0xFf,0xc7,0xb1,0x15,0x61,0x14,0x8b,0xfa,0xC9,0x97,0x78,0x55}, "DGX1 ", 9}, {{0x2e,0x07,0x1D,0x29,0x66,0xAa,0x7D,0x8d,0xEC,0xB1,0x00,0x58,0x85,0xbA,0x19,0x77,0xD6,0x03,0x8A,0x65}, "DICE ", 16}, {{0xc7,0x19,0xd0,0x10,0xB6,0x3E,0x5b,0xbF,0x2C,0x05,0x51,0x87,0x2C,0xD5,0x31,0x6E,0xD2,0x6A,0xcD,0x83}, "DecInsur ", 18}, {{0x13,0xf1,0x1C,0x99,0x05,0xA0,0x8c,0xa7,0x6e,0x3e,0x85,0x3b,0xE6,0x3D,0x4f,0x09,0x44,0x32,0x6C,0x72}, "DIVX ", 18}, @@ -227,12 +244,13 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x3c,0x75,0x22,0x65,0x55,0xFC,0x49,0x61,0x68,0xd4,0x8B,0x88,0xDF,0x83,0xB9,0x5F,0x16,0x77,0x1F,0x37}, "DROPlex ", 0}, {{0x62,0x1d,0x78,0xf2,0xef,0x2f,0xd9,0x37,0xbf,0xca,0x69,0x6c,0xab,0xaf,0x9a,0x77,0x9f,0x59,0xb3,0xed}, "DRP ", 2}, {{0x27,0x99,0xd9,0x0c,0x6d,0x44,0xcb,0x9a,0xa5,0xfb,0xc3,0x77,0x17,0x7f,0x16,0xc3,0x3e,0x05,0x6b,0x82}, "DripCoin ", 0}, + {{0x62,0xd4,0xc0,0x46,0x44,0x31,0x4f,0x35,0x86,0x8b,0xa4,0xc6,0x5c,0xc2,0x7a,0x77,0x68,0x1d,0xe7,0xa9}, "DRVH ", 18}, {{0x1e,0x09,0xBD,0x8C,0xad,0xb4,0x41,0x63,0x2e,0x44,0x1D,0xb3,0xe1,0xD7,0x99,0x09,0xEE,0x0A,0x22,0x56}, "DSC ", 1}, {{0x5a,0xdc,0x96,0x1D,0x6A,0xC3,0xf7,0x06,0x2D,0x2e,0xA4,0x5F,0xEF,0xB8,0xD8,0x16,0x7d,0x44,0xb1,0x90}, "DTH ", 18}, {{0xd2,0x34,0xbf,0x24,0x10,0xa0,0x00,0x9d,0xf9,0xc3,0xc6,0x3b,0x61,0x0c,0x09,0x73,0x8f,0x18,0xcc,0xd7}, "DTR ", 8}, {{0xf9,0xF7,0xc2,0x9C,0xFd,0xf1,0x9F,0xCf,0x1f,0x2A,0xA6,0xB8,0x4a,0xA3,0x67,0xBc,0xf1,0xbD,0x16,0x76}, "DTT ", 18}, - {{0x82,0xfd,0xed,0xfB,0x76,0x35,0x44,0x1a,0xA5,0xA9,0x27,0x91,0xD0,0x01,0xfA,0x73,0x88,0xda,0x80,0x25}, "DTx ", 18}, {{0x76,0x5f,0x0c,0x16,0xd1,0xdd,0xc2,0x79,0x29,0x5c,0x1a,0x7c,0x24,0xb0,0x88,0x3f,0x62,0xd3,0x3f,0x75}, "DTX ", 18}, + {{0x82,0xfd,0xed,0xfB,0x76,0x35,0x44,0x1a,0xA5,0xA9,0x27,0x91,0xD0,0x01,0xfA,0x73,0x88,0xda,0x80,0x25}, "DTx ", 18}, {{0x9c,0x6F,0xa4,0x22,0x09,0x16,0x9b,0xCe,0xA0,0x32,0xe4,0x01,0x18,0x8a,0x6f,0xc3,0xe9,0xC9,0xf5,0x9c}, "DUBI ", 18}, {{0x99,0x4f,0x0d,0xff,0xdb,0xae,0x0b,0xbf,0x09,0xb6,0x52,0xd6,0xf1,0x1a,0x49,0x3f,0xd3,0x3f,0x42,0xb9}, "EAGLE ", 18}, {{0xaf,0xc3,0x97,0x88,0xc5,0x1f,0x0c,0x1f,0xf7,0xb5,0x53,0x17,0xf3,0xe7,0x02,0x99,0xe5,0x21,0xff,0xf6}, "eBCH ", 8}, @@ -242,6 +260,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xfa,0x1d,0xe2,0xee,0x97,0xe4,0xc1,0x0c,0x94,0xc9,0x1c,0xb2,0xb5,0x06,0x2b,0x89,0xfb,0x14,0x0b,0x82}, "EDC ", 6}, {{0x08,0x71,0x1D,0x3B,0x02,0xC8,0x75,0x8F,0x2F,0xB3,0xab,0x4e,0x80,0x22,0x84,0x18,0xa7,0xF8,0xe3,0x9c}, "EDG ", 0}, {{0xce,0xd4,0xe9,0x31,0x98,0x73,0x4d,0xda,0xff,0x84,0x92,0xd5,0x25,0xbd,0x25,0x8d,0x49,0xeb,0x38,0x8e}, "EDO ", 18}, + {{0xc5,0x28,0xc2,0x8F,0xEC,0x0A,0x90,0xC0,0x83,0x32,0x8B,0xC4,0x5f,0x58,0x7e,0xE2,0x15,0x76,0x0A,0x0F}, "EDR ", 18}, {{0x2a,0x22,0xe5,0xcc,0xa0,0x0a,0x3d,0x63,0x30,0x8f,0xa3,0x9f,0x29,0x20,0x2e,0xb1,0xb3,0x9e,0xef,0x52}, "EDU ", 18}, {{0xb5,0x3a,0x96,0xbc,0xbd,0xd9,0xcf,0x78,0xdf,0xf2,0x0b,0xab,0x6c,0x2b,0xe7,0xba,0xec,0x8f,0x00,0xf8}, "eGAS ", 8}, {{0x8e,0x1b,0x44,0x8E,0xC7,0xaD,0xFc,0x7F,0xa3,0x5F,0xC2,0xe8,0x85,0x67,0x8b,0xD3,0x23,0x17,0x6E,0x34}, "EGT ", 18}, @@ -249,6 +268,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xbf,0x21,0x79,0x85,0x9f,0xc6,0xd5,0xbe,0xe9,0xbf,0x91,0x58,0x63,0x2d,0xc5,0x16,0x78,0xa4,0x10,0x0e}, "ELF ", 18}, {{0xc8,0xC6,0xA3,0x1A,0x4A,0x80,0x6d,0x37,0x10,0xA7,0xB3,0x8b,0x7B,0x29,0x6D,0x2f,0xAB,0xCC,0xDB,0xA8}, "ELIX ", 18}, {{0x44,0x19,0x7a,0x4c,0x44,0xd6,0xa0,0x59,0x29,0x7c,0xaf,0x6b,0xe4,0xf7,0xe1,0x72,0xbd,0x56,0xca,0xaf}, "ELTCOIN ", 8}, + {{0xa9,0x55,0x92,0xDC,0xFf,0xA3,0xC0,0x80,0xB4,0xB4,0x0E,0x45,0x9c,0x5f,0x56,0x92,0xF6,0x7D,0xB7,0xF8}, "ELY ", 18}, {{0xb6,0x7b,0x88,0xa2,0x57,0x08,0xa3,0x5a,0xe7,0xc2,0xd7,0x36,0xd3,0x98,0xd2,0x68,0xce,0x4f,0x7f,0x83}, "EMON ", 8}, {{0x95,0xda,0xaa,0xb9,0x80,0x46,0x84,0x6b,0xf4,0xb2,0x85,0x3e,0x23,0xcb,0xa2,0x36,0xfa,0x39,0x4a,0x31}, "EMONT ", 8}, {{0x95,0x01,0xBF,0xc4,0x88,0x97,0xDC,0xEE,0xad,0xf7,0x31,0x13,0xEF,0x63,0x5d,0x2f,0xF7,0xee,0x4B,0x97}, "EMT ", 18}, @@ -266,14 +286,15 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x3a,0x26,0x74,0x6D,0xdb,0x79,0xB1,0xB8,0xe4,0x45,0x0e,0x3F,0x4F,0xFE,0x32,0x85,0xA3,0x07,0x38,0x7E}, "ETHB ", 8}, {{0x69,0x27,0xC6,0x9f,0xb4,0xda,0xf2,0x04,0x3f,0xbB,0x1C,0xb7,0xb8,0x6c,0x56,0x61,0x41,0x6b,0xea,0x29}, "ETR ", 18}, {{0xab,0xdf,0x14,0x78,0x70,0x23,0x5f,0xcf,0xc3,0x41,0x53,0x82,0x8c,0x76,0x9a,0x70,0xb3,0xfa,0xe0,0x1f}, "EURT ", 6}, - {{0x52,0x36,0x30,0x97,0x6e,0xB6,0x14,0x76,0x21,0xB5,0xc3,0x1c,0x78,0x1e,0xBe,0x2E,0xc2,0xa8,0x06,0xE0}, "eUSD ", 18}, {{0x92,0x31,0x08,0xa4,0x39,0xC4,0xe8,0xC2,0x31,0x5c,0x4f,0x65,0x21,0xE5,0xcE,0x95,0xB4,0x4e,0x9B,0x4c}, "EVE ", 18}, {{0xd7,0x80,0xAe,0x2B,0xf0,0x4c,0xD9,0x6E,0x57,0x7D,0x3D,0x01,0x47,0x62,0xf8,0x31,0xd9,0x71,0x29,0xd0}, "EVN ", 18}, {{0xf3,0xdb,0x5f,0xa2,0xc6,0x6b,0x7a,0xf3,0xeb,0x0c,0x0b,0x78,0x25,0x10,0x81,0x6c,0xbe,0x48,0x13,0xb8}, "EVX ", 4}, {{0xc9,0x8e,0x06,0x39,0xc6,0xd2,0xec,0x03,0x7a,0x61,0x53,0x41,0xc3,0x69,0x66,0x6b,0x11,0x0e,0x80,0xe5}, "EXMR ", 8}, - {{0xb6,0x77,0x34,0x52,0x1e,0xAb,0xBE,0x9C,0x77,0x37,0x29,0xdB,0x73,0xE1,0x6C,0xC2,0xdf,0xb2,0x0A,0x58}, "E₹ ", 2}, + {{0x5c,0x74,0x3a,0x35,0xe9,0x03,0xf6,0xc5,0x84,0x51,0x4e,0xc6,0x17,0xac,0xee,0x06,0x11,0xcf,0x44,0xf3}, "EXY ", 18}, + {{0xb6,0x77,0x34,0x52,0x1e,0xAb,0xBE,0x9C,0x77,0x37,0x29,0xdB,0x73,0xE1,0x6C,0xC2,0xdf,0xb2,0x0A,0x58}, "ERupee ", 2}, {{0x19,0x0e,0x56,0x9b,0xE0,0x71,0xF4,0x0c,0x70,0x4e,0x15,0x82,0x5F,0x28,0x54,0x81,0xCB,0x74,0xB6,0xcC}, "FAM ", 12}, - {{0x7f,0x67,0x15,0xc3,0xfc,0x47,0x40,0xa0,0x2f,0x70,0xde,0x85,0xb9,0xfd,0x50,0xac,0x60,0x01,0xfe,0xd9}, "FANX ", 18}, + {{0x90,0x16,0x2f,0x41,0x88,0x6c,0x09,0x46,0xd0,0x99,0x99,0x73,0x6f,0x1c,0x15,0xc8,0xa1,0x05,0xa4,0x21}, "FAN ", 18}, + {{0x7d,0xcb,0x3b,0x23,0x56,0xc8,0x22,0xd3,0x57,0x7d,0x4d,0x06,0x0d,0x0d,0x5d,0x78,0xc8,0x60,0x48,0x8c}, "FANX ", 18}, {{0x00,0x9e,0x86,0x49,0x23,0xb4,0x92,0x63,0xc7,0xF1,0x0D,0x19,0xB7,0xf8,0xAb,0x7a,0x9A,0x5A,0xAd,0x33}, "FKX ", 18}, {{0xf0,0x4a,0x8a,0xc5,0x53,0xFc,0xeD,0xB5,0xBA,0x99,0xA6,0x47,0x99,0x15,0x58,0x26,0xC1,0x36,0xb0,0xBe}, "FLIXX ", 18}, {{0x04,0xcC,0x78,0x3b,0x45,0x0b,0x8D,0x11,0xF3,0xC7,0xd0,0x0D,0xD0,0x3f,0xDF,0x7F,0xB5,0x1f,0xE9,0xF2}, "FLMC ", 18}, @@ -286,6 +307,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xe6,0xf7,0x4d,0xcf,0xa0,0xe2,0x08,0x83,0x00,0x8d,0x8c,0x16,0xb6,0xd9,0xa3,0x29,0x18,0x9d,0x0c,0x30}, "FTC ", 2}, {{0x20,0x23,0xDC,0xf7,0xc4,0x38,0xc8,0xC8,0xC0,0xB0,0xF2,0x8d,0xBa,0xE1,0x55,0x20,0xB4,0xf3,0xEe,0x20}, "FTR ", 18}, {{0x2A,0xEC,0x18,0xc5,0x50,0x0f,0x21,0x35,0x9C,0xE1,0xBE,0xA5,0xDc,0x17,0x77,0x34,0x4d,0xF4,0xC0,0xDc}, "FTT ", 18}, + {{0x41,0x87,0x5c,0x23,0x32,0xb0,0x87,0x7c,0xdf,0xaa,0x69,0x9b,0x64,0x14,0x02,0xb7,0xd4,0x64,0x2c,0x32}, "FTXT ", 8}, {{0x65,0xbe,0x44,0xc7,0x47,0x98,0x8f,0xbf,0x60,0x62,0x07,0x69,0x8c,0x94,0x4d,0xf4,0x44,0x2e,0xfe,0x19}, "FUCK ", 4}, {{0xEA,0x38,0xeA,0xa3,0xC8,0x6c,0x8F,0x9B,0x75,0x15,0x33,0xBa,0x2E,0x56,0x2d,0xeb,0x9a,0xcD,0xED,0x40}, "FUEL ", 18}, {{0x41,0x9D,0x0d,0x8B,0xdD,0x9a,0xF5,0xe6,0x06,0xAe,0x22,0x32,0xed,0x28,0x5A,0xff,0x19,0x0E,0x71,0x1b}, "FUN ", 8}, @@ -312,18 +334,22 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xB7,0x08,0x35,0xD7,0x82,0x2e,0xBB,0x94,0x26,0xB5,0x65,0x43,0xE3,0x91,0x84,0x6C,0x10,0x7b,0xd3,0x2C}, "GTC ", 18}, {{0x02,0x5a,0xba,0xd9,0xe5,0x18,0x51,0x6f,0xda,0xaf,0xbd,0xcd,0xb9,0x70,0x1b,0x37,0xfb,0x7e,0xf0,0xfa}, "GTKT ", 0}, {{0xc5,0xbb,0xae,0x50,0x78,0x1b,0xe1,0x66,0x93,0x06,0xb9,0xe0,0x01,0xef,0xf5,0x7a,0x29,0x57,0xb0,0x9d}, "GTO ", 5}, + {{0x98,0x47,0x34,0x5d,0xe8,0xb6,0x14,0xc9,0x56,0x14,0x6b,0xbe,0xa5,0x49,0x33,0x6d,0x9c,0x8d,0x26,0xb6}, "GULD ", 8}, {{0xf7,0xB0,0x98,0x29,0x8f,0x7C,0x69,0xFc,0x14,0x61,0x0b,0xf7,0x1d,0x5e,0x02,0xc6,0x07,0x92,0x89,0x4C}, "GUP ", 3}, {{0x10,0x3c,0x3A,0x20,0x9d,0xa5,0x9d,0x3E,0x7C,0x4A,0x89,0x30,0x7e,0x66,0x52,0x1e,0x08,0x1C,0xFD,0xF0}, "GVT ", 18}, {{0x58,0xca,0x30,0x65,0xc0,0xf2,0x4c,0x7c,0x96,0xae,0xe8,0xd6,0x05,0x6b,0x5b,0x5d,0xec,0xf9,0xc2,0xf8}, "GXC ", 10}, {{0x22,0xF0,0xAF,0x8D,0x78,0x85,0x1b,0x72,0xEE,0x79,0x9e,0x05,0xF5,0x4A,0x77,0x00,0x15,0x86,0xB1,0x8A}, "GXVC ", 10}, {{0x8C,0x65,0xe9,0x92,0x29,0x7d,0x5f,0x09,0x2A,0x75,0x6d,0xEf,0x24,0xF4,0x78,0x1a,0x28,0x01,0x98,0xFf}, "GZE ", 18}, {{0xE6,0x38,0xdc,0x39,0xb6,0xaD,0xBE,0xE8,0x52,0x6b,0x5C,0x22,0x38,0x0b,0x4b,0x45,0xdA,0xf4,0x6d,0x8e}, "GZR ", 6}, + {{0x5a,0x56,0x7e,0x28,0xdb,0xfa,0x2b,0xbd,0x3e,0xf1,0x3c,0x0a,0x01,0xbe,0x11,0x47,0x45,0x34,0x96,0x57}, "HAPPY ", 2}, {{0x90,0x02,0xD4,0x48,0x5b,0x75,0x94,0xe3,0xE8,0x50,0xF0,0xa2,0x06,0x71,0x3B,0x30,0x51,0x13,0xf6,0x9e}, "HAT ", 12}, {{0xC0,0x11,0xA7,0x24,0x00,0xE5,0x8e,0xcD,0x99,0xEe,0x49,0x7C,0xF8,0x9E,0x37,0x75,0xd4,0xbd,0x73,0x2F}, "HAV ", 18}, {{0xff,0xe8,0x19,0x6b,0xc2,0x59,0xe8,0xde,0xdc,0x54,0x4d,0x93,0x57,0x86,0xaa,0x47,0x09,0xec,0x3e,0x64}, "HDG ", 18}, + {{0x95,0xC4,0xbe,0x85,0x34,0xd6,0x9C,0x24,0x8C,0x06,0x23,0xc4,0xC9,0xa7,0xA2,0xa0,0x01,0xc1,0x73,0x37}, "HDL ", 18}, {{0xe9,0xff,0x07,0x80,0x9c,0xcf,0xf0,0x5d,0xae,0x74,0x99,0x0e,0x25,0x83,0x1d,0x0b,0xc5,0xcb,0xe5,0x75}, "Hdp ", 18}, - {{0x84,0x54,0x3f,0x86,0x8e,0xc1,0xb1,0xfa,0xc5,0x10,0xd4,0x9d,0x13,0xc0,0x69,0xf6,0x4c,0xd2,0xd5,0xf9}, "Hdp.ф ", 18}, + {{0x84,0x54,0x3f,0x86,0x8e,0xc1,0xb1,0xfa,0xc5,0x10,0xd4,0x9d,0x13,0xc0,0x69,0xf6,0x4c,0xd2,0xd5,0xf9}, "Hdp2 ", 18}, {{0xba,0x21,0x84,0x52,0x0A,0x1c,0xC4,0x9a,0x61,0x59,0xc5,0x7e,0x61,0xE1,0x84,0x4E,0x08,0x56,0x15,0xB6}, "HGT ", 8}, + {{0x9b,0xb1,0xdb,0x14,0x45,0xb8,0x32,0x13,0xa5,0x6d,0x90,0xd3,0x31,0x89,0x4b,0x3f,0x26,0x21,0x8e,0x4e}, "HIBT ", 18}, {{0xa9,0x24,0x0f,0xBC,0xAC,0x1F,0x0b,0x9A,0x6a,0xDf,0xB0,0x4a,0x53,0xc8,0xE3,0xB0,0xcC,0x1D,0x14,0x44}, "HIG ", 18}, {{0x14,0xF3,0x7B,0x57,0x42,0x42,0xD3,0x66,0x55,0x8d,0xB6,0x1f,0x33,0x35,0x28,0x9a,0x50,0x35,0xc5,0x06}, "HKG ", 3}, {{0x88,0xac,0x94,0xd5,0xd1,0x75,0x13,0x03,0x47,0xfc,0x95,0xe1,0x09,0xd7,0x7a,0xc0,0x9d,0xbf,0x5a,0xb7}, "HKY ", 18}, @@ -334,7 +360,6 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x9a,0xf8,0x39,0x68,0x7f,0x6c,0x94,0x54,0x2a,0xc5,0xec,0xe2,0xe3,0x17,0xda,0xae,0x35,0x54,0x93,0xa1}, "Hydro ", 18}, {{0x55,0x4C,0x20,0xB7,0xc4,0x86,0xbe,0xeE,0x43,0x92,0x77,0xb4,0x54,0x0A,0x43,0x45,0x66,0xdC,0x4C,0x02}, "HST ", 18}, {{0xC0,0xEb,0x85,0x28,0x5d,0x83,0x21,0x7C,0xD7,0xc8,0x91,0x70,0x2b,0xcb,0xC0,0xFC,0x40,0x1E,0x2D,0x9D}, "HVN ", 8}, - {{0xC1,0xE2,0x09,0x7d,0x78,0x8d,0x33,0x70,0x1B,0xA3,0xCc,0x27,0x73,0xBF,0x67,0x15,0x5e,0xc9,0x3F,0xC4}, "IAD ", 18}, {{0x5a,0x84,0x96,0x9b,0xb6,0x63,0xfb,0x64,0xF6,0xd0,0x15,0xDc,0xF9,0xF6,0x22,0xAe,0xdc,0x79,0x67,0x50}, "ICE ", 18}, {{0x88,0x86,0x66,0xCA,0x69,0xE0,0xf1,0x78,0xDE,0xD6,0xD7,0x5b,0x57,0x26,0xCe,0xe9,0x9A,0x87,0xD6,0x98}, "ICN ", 18}, {{0xa3,0x3e,0x72,0x9b,0xf4,0xfd,0xeb,0x86,0x8b,0x53,0x4e,0x1f,0x20,0x52,0x34,0x63,0xd9,0xc4,0x6b,0xee}, "ICO ", 10}, @@ -356,6 +381,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x6f,0xb3,0xe0,0xa2,0x17,0x40,0x7e,0xff,0xf7,0xca,0x06,0x2d,0x46,0xc2,0x6e,0x5d,0x60,0xa1,0x4d,0x69}, "IOTX ", 18}, {{0x64,0xCd,0xF8,0x19,0xd3,0xE7,0x5A,0xc8,0xeC,0x21,0x7B,0x34,0x96,0xd7,0xcE,0x16,0x7B,0xe4,0x2e,0x80}, "IPL ", 18}, {{0x00,0x1f,0x0a,0xa5,0xda,0x15,0x58,0x5e,0x5b,0x23,0x05,0xdb,0xab,0x2b,0xac,0x42,0x5e,0xa7,0x10,0x07}, "IPSX ", 18}, + {{0x0c,0xf7,0x13,0xb1,0x1c,0x9b,0x98,0x6e,0xc4,0x0d,0x65,0xbd,0x4f,0x7f,0xbd,0x50,0xf6,0xff,0x2d,0x64}, "IST34 ", 18}, {{0x5e,0x6b,0x6d,0x9a,0xba,0xd9,0x09,0x3f,0xdc,0x86,0x1e,0xa1,0x60,0x0e,0xba,0x1b,0x35,0x5c,0xd9,0x40}, "ITC ", 18}, {{0x0a,0xeF,0x06,0xDc,0xCC,0xC5,0x31,0xe5,0x81,0xf0,0x44,0x00,0x59,0xE6,0xFf,0xCC,0x20,0x60,0x39,0xEE}, "ITT ", 8}, {{0xfc,0xa4,0x79,0x62,0xd4,0x5a,0xdf,0xdf,0xd1,0xab,0x2d,0x97,0x23,0x15,0xdb,0x4c,0xe7,0xcc,0xf0,0x94}, "IXT ", 8}, @@ -379,7 +405,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xfD,0x10,0x7B,0x47,0x3A,0xB9,0x0e,0x8F,0xbd,0x89,0x87,0x21,0x44,0xa3,0xDC,0x92,0xC4,0x0F,0xa8,0xC9}, "LALA ", 18}, {{0x51,0x02,0x79,0x1c,0xa0,0x2f,0xc3,0x59,0x53,0x98,0x40,0x0b,0xfe,0x0e,0x33,0xd7,0xb6,0xc8,0x22,0x67}, "LDC ", 18}, {{0x5b,0x26,0xC5,0xD0,0x77,0x2E,0x5b,0xba,0xC8,0xb3,0x18,0x2A,0xE9,0xa1,0x3f,0x9B,0xB2,0xD0,0x37,0x65}, "LEDU ", 8}, - {{0xB5,0xAE,0x84,0x8E,0xdB,0x29,0x6C,0x21,0x25,0x9b,0x74,0x67,0x33,0x14,0x67,0xd2,0x64,0x7e,0xEc,0xDf}, "LEMO ", 18}, + {{0x60,0xC2,0x44,0x07,0xd0,0x17,0x82,0xC2,0x17,0x5D,0x32,0xfe,0x7C,0x89,0x21,0xed,0x73,0x23,0x71,0xD1}, "LEMO ", 18}, {{0x80,0xfB,0x78,0x4B,0x7e,0xD6,0x67,0x30,0xe8,0xb1,0xDB,0xd9,0x82,0x0a,0xFD,0x29,0x93,0x1a,0xab,0x03}, "LEND ", 18}, {{0xc7,0x98,0xcd,0x1c,0x49,0xdb,0x0e,0x29,0x73,0x12,0xe4,0xc6,0x82,0x75,0x26,0x68,0xce,0x1d,0xb2,0xad}, "LFR ", 5}, {{0x12,0x3a,0xb1,0x95,0xdd,0x38,0xb1,0xb4,0x05,0x10,0xd4,0x67,0xa6,0xa3,0x59,0xb2,0x01,0xaf,0x05,0x6f}, "LGO ", 8}, @@ -395,7 +421,8 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x5e,0x33,0x46,0x44,0x40,0x10,0x13,0x53,0x22,0x26,0x8a,0x46,0x30,0xd2,0xed,0x5f,0x8d,0x09,0x44,0x6c}, "LOC ", 18}, {{0x9c,0x23,0xd6,0x7a,0xea,0x7b,0x95,0xd8,0x09,0x42,0xe3,0x83,0x6b,0xcd,0xf7,0xe7,0x08,0xa7,0x47,0xc2}, "LOCI ", 18}, {{0xC6,0x45,0x00,0xDD,0x7B,0x0f,0x17,0x94,0x80,0x7e,0x67,0x80,0x2F,0x8A,0xbb,0xf5,0xF8,0xFf,0xb0,0x54}, "LOCUS ", 18}, - {{0x21,0xae,0x23,0xb8,0x82,0xa3,0x40,0xa2,0x22,0x82,0x16,0x20,0x86,0xbc,0x98,0xd3,0xe2,0xb7,0x30,0x18}, "LOK ", 18}, + {{0x25,0x3c,0x7d,0xd0,0x74,0xf4,0xba,0xcb,0x30,0x53,0x87,0xf9,0x22,0x22,0x5a,0x4f,0x73,0x7c,0x08,0xbd}, "LOOK ", 18}, + {{0x21,0xae,0x23,0xb8,0x82,0xa3,0x40,0xa2,0x22,0x82,0x16,0x20,0x86,0xbc,0x98,0xd3,0xe2,0xb7,0x30,0x18}, "LOOK old ", 18}, {{0xa4,0xe8,0xc3,0xec,0x45,0x61,0x07,0xea,0x67,0xd3,0x07,0x5b,0xf9,0xe3,0xdf,0x3a,0x75,0x82,0x3d,0xb0}, "LOOM ", 18}, {{0xEF,0x68,0xe7,0xC6,0x94,0xF4,0x0c,0x82,0x02,0x82,0x1e,0xDF,0x52,0x5d,0xE3,0x78,0x24,0x58,0x63,0x9f}, "LRC ", 18}, {{0x5d,0xbe,0x29,0x6f,0x97,0xb2,0x3c,0x4a,0x6a,0xa6,0x18,0x3d,0x73,0xe5,0x74,0xd0,0x2b,0xa5,0xc7,0x19}, "LUC ", 18}, @@ -415,6 +442,8 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x01,0xf2,0xac,0xf2,0x91,0x48,0x60,0x33,0x1c,0x1c,0xb1,0xa9,0xac,0xec,0xda,0x74,0x75,0xe0,0x6a,0xf8}, "MESH ", 18}, {{0x5b,0x8d,0x43,0xff,0xde,0x4a,0x29,0x82,0xb9,0xa5,0x38,0x7c,0xdf,0x21,0xd5,0x4e,0xad,0x64,0xac,0x8d}, "MEST ", 18}, {{0x67,0x10,0xc6,0x34,0x32,0xa2,0xde,0x02,0x95,0x4f,0xc0,0xf8,0x51,0xdb,0x07,0x14,0x6a,0x6c,0x03,0x12}, "MFG ", 18}, + {{0xDF,0x2C,0x72,0x38,0x19,0x8A,0xd8,0xB3,0x89,0x66,0x65,0x74,0xf2,0xd8,0xbc,0x41,0x1A,0x4b,0x74,0x28}, "MFT ", 18}, + {{0x05,0xD4,0x12,0xCE,0x18,0xF2,0x40,0x40,0xbB,0x3F,0xa4,0x5C,0xF2,0xC6,0x9e,0x50,0x65,0x86,0xD8,0xe8}, "MFTU ", 18}, {{0x40,0x39,0x50,0x44,0xac,0x3c,0x0c,0x57,0x05,0x19,0x06,0xda,0x93,0x8b,0x54,0xbd,0x65,0x57,0xf2,0x12}, "MGO ", 8}, {{0xe2,0x3c,0xd1,0x60,0x76,0x1f,0x63,0xFC,0x3a,0x1c,0xF7,0x8A,0xa0,0x34,0xb6,0xcd,0xF9,0x7d,0x3E,0x0C}, "Mainstrt ", 18}, {{0xad,0x8d,0xd4,0xc7,0x25,0xde,0x1d,0x31,0xb9,0xe8,0xf8,0xd1,0x46,0x08,0x9e,0x9d,0xc6,0x88,0x20,0x93}, "Mychat ", 6}, @@ -429,7 +458,8 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x21,0xf0,0xF0,0xfD,0x31,0x41,0xEe,0x9E,0x11,0xB3,0xd7,0xf1,0x3a,0x10,0x28,0xCD,0x51,0x5f,0x45,0x9c}, "MRP ", 18}, {{0xAB,0x6C,0xF8,0x7a,0x50,0xF1,0x7d,0x7F,0x5E,0x1F,0xEa,0xf8,0x1B,0x6f,0xE9,0xFf,0xBe,0x8E,0xBF,0x84}, "MRV ", 18}, {{0x68,0xAA,0x3F,0x23,0x2d,0xA9,0xbd,0xC2,0x34,0x34,0x65,0x54,0x57,0x94,0xef,0x3e,0xEa,0x52,0x09,0xBD}, "MSP ", 18}, - {{0x90,0x5E,0x33,0x7c,0x6c,0x86,0x45,0x26,0x3D,0x35,0x21,0x20,0x5A,0xa3,0x7b,0xf4,0xd0,0x34,0xe7,0x45}, "MTC ", 18}, + {{0xdf,0xdc,0x0d,0x82,0xd9,0x6f,0x8f,0xd4,0x0c,0xa0,0xcf,0xb4,0xa2,0x88,0x95,0x5b,0xec,0xec,0x20,0x88}, "MTC Mesh ", 18}, + {{0x90,0x5E,0x33,0x7c,0x6c,0x86,0x45,0x26,0x3D,0x35,0x21,0x20,0x5A,0xa3,0x7b,0xf4,0xd0,0x34,0xe7,0x45}, "MTC Med ", 18}, {{0xaF,0x4D,0xcE,0x16,0xDa,0x28,0x77,0xf8,0xc9,0xe0,0x05,0x44,0xc9,0x3B,0x62,0xAc,0x40,0x63,0x1F,0x16}, "MTH ", 5}, {{0xF4,0x33,0x08,0x93,0x66,0x89,0x9D,0x83,0xa9,0xf2,0x6A,0x77,0x3D,0x59,0xec,0x7e,0xCF,0x30,0x35,0x5e}, "MTL ", 8}, {{0x41,0xdb,0xec,0xc1,0xcd,0xc5,0x51,0x7c,0x6f,0x76,0xf6,0xa6,0xe8,0x36,0xad,0xbe,0xe2,0x75,0x4d,0xe3}, "MTN ", 18}, @@ -454,6 +484,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x17,0x76,0xe1,0xF2,0x6f,0x98,0xb1,0xA5,0xdF,0x9c,0xD3,0x47,0x95,0x3a,0x26,0xdd,0x3C,0xb4,0x66,0x71}, "NMR ", 18}, {{0xec,0x46,0xf8,0x20,0x7d,0x76,0x60,0x12,0x45,0x4c,0x40,0x8d,0xe2,0x10,0xbc,0xbc,0x22,0x43,0xe7,0x1c}, "NOX ", 18}, {{0x4c,0xe6,0xb3,0x62,0xbc,0x77,0xa2,0x49,0x66,0xdd,0xa9,0x07,0x8f,0x9c,0xef,0x81,0xb3,0xb8,0x86,0xa7}, "NPER ", 18}, + {{0x24,0x5e,0xf4,0x7d,0x4d,0x05,0x05,0xec,0xf3,0xac,0x46,0x3f,0x4d,0x81,0xf4,0x1a,0xde,0x8f,0x1f,0xd1}, "NUG ", 18}, {{0xb9,0x13,0x18,0xf3,0x5b,0xdb,0x26,0x2e,0x94,0x23,0xbc,0x7c,0x7c,0x2a,0x3a,0x93,0xdd,0x93,0xc9,0x2c}, "NULS ", 18}, {{0x57,0xAb,0x1E,0x02,0xfE,0xE2,0x37,0x74,0x58,0x0C,0x11,0x97,0x40,0x12,0x9e,0xAC,0x70,0x81,0xe9,0xD3}, "nUSD ", 18}, {{0x45,0xe4,0x2D,0x65,0x9D,0x9f,0x94,0x66,0xcD,0x5D,0xF6,0x22,0x50,0x60,0x33,0x14,0x5a,0x9b,0x89,0xBc}, "NxC ", 3}, @@ -462,20 +493,23 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x5e,0x88,0x8B,0x83,0xB7,0x28,0x7E,0xED,0x4f,0xB7,0xDA,0x7b,0x7d,0x0A,0x0D,0x4c,0x73,0x5d,0x94,0xb3}, "OAK ", 18}, {{0x70,0x1C,0x24,0x4b,0x98,0x8a,0x51,0x3c,0x94,0x59,0x73,0xdE,0xFA,0x05,0xde,0x93,0x3b,0x23,0xFe,0x1D}, "OAX ", 18}, {{0x02,0x35,0xfe,0x62,0x4e,0x04,0x4a,0x05,0xee,0xd7,0xa4,0x3e,0x16,0xe3,0x08,0x3b,0xc8,0xa4,0x28,0x7a}, "OCC ", 18}, + {{0xbf,0x52,0xf2,0xab,0x39,0xe2,0x6e,0x09,0x51,0xd2,0xa0,0x2b,0x49,0xb7,0x70,0x2a,0xbe,0x30,0x40,0x6a}, "ODE ", 18}, {{0x6f,0x53,0x9a,0x94,0x56,0xa5,0xbc,0xb6,0x33,0x4a,0x1a,0x41,0x20,0x7c,0x37,0x88,0xf5,0x82,0x52,0x07}, "OHNI ", 18}, - {{0xbe,0xef,0x54,0x6a,0xc8,0xa4,0xe0,0xa8,0x0d,0xc1,0xe2,0xd6,0x96,0x96,0x8e,0xf5,0x41,0x38,0xf1,0xd4}, "OJX ", 18}, {{0xc6,0x6e,0xa8,0x02,0x71,0x7b,0xfb,0x98,0x33,0x40,0x02,0x64,0xdd,0x12,0xc2,0xbc,0xea,0xa3,0x4a,0x6d}, "OLD_MKR ", 18}, + {{0x64,0xA6,0x04,0x93,0xD8,0x88,0x72,0x8C,0xf4,0x26,0x16,0xe0,0x34,0xa0,0xdf,0xEA,0xe3,0x8E,0xFC,0xF0}, "OLT ", 18}, {{0xd2,0x61,0x14,0xcd,0x6E,0xE2,0x89,0xAc,0xcF,0x82,0x35,0x0c,0x8d,0x84,0x87,0xfe,0xdB,0x8A,0x0C,0x07}, "OMG ", 18}, {{0xb2,0x3b,0xe7,0x35,0x73,0xbc,0x7e,0x03,0xdb,0x6e,0x5d,0xfc,0x62,0x40,0x53,0x68,0x71,0x6d,0x28,0xa8}, "ONEK ", 18}, {{0xd3,0x41,0xd1,0x68,0x0e,0xee,0xe3,0x25,0x5b,0x8c,0x4c,0x75,0xbc,0xce,0x7e,0xb5,0x7f,0x14,0x4d,0xae}, "onG ", 18}, {{0x69,0xc4,0xBB,0x24,0x0c,0xF0,0x5D,0x51,0xee,0xab,0x69,0x85,0xBa,0xb3,0x55,0x27,0xd0,0x4a,0x8C,0x64}, "OPEN ", 8}, {{0x43,0x55,0xfC,0x16,0x0f,0x74,0x32,0x8f,0x9b,0x38,0x3d,0xF2,0xEC,0x58,0x9b,0xB3,0xdF,0xd8,0x2B,0xa0}, "OPT ", 18}, {{0xff,0x56,0xCc,0x6b,0x1E,0x6d,0xEd,0x34,0x7a,0xA0,0xB7,0x67,0x6C,0x85,0xAB,0x0B,0x3D,0x08,0xB0,0xFA}, "ORBS ", 18}, + {{0x6F,0x59,0xe0,0x46,0x1A,0xe5,0xE2,0x79,0x9F,0x1f,0xB3,0x84,0x7f,0x05,0xa6,0x3B,0x16,0xd0,0xDb,0xF8}, "ORCA ", 18}, {{0x2C,0x4e,0x8f,0x2D,0x74,0x61,0x13,0xd0,0x69,0x6c,0xE8,0x9B,0x35,0xF0,0xd8,0xbF,0x88,0xE0,0xAE,0xcA}, "OST ", 18}, + {{0x17,0x0b,0x27,0x5c,0xed,0x08,0x9f,0xff,0xae,0xbf,0xe9,0x27,0xf4,0x45,0xa3,0x50,0xed,0x91,0x60,0xdc}, "OWN ", 8}, {{0x65,0xa1,0x50,0x14,0x96,0x4f,0x21,0x02,0xff,0x58,0x64,0x7e,0x16,0xa1,0x6a,0x6b,0x9e,0x14,0xbc,0xf6}, "Ox Fina ", 3}, {{0xfe,0xDA,0xE5,0x64,0x26,0x68,0xf8,0x63,0x6A,0x11,0x98,0x7F,0xf3,0x86,0xbf,0xd2,0x15,0xF9,0x42,0xEE}, "PAL ", 18}, + {{0x77,0x76,0x1e,0x63,0xc0,0x5a,0xee,0x66,0x48,0xfd,0xae,0xaa,0x9b,0x94,0x24,0x83,0x51,0xaf,0x9b,0xcd}, "PASS ", 18}, {{0xea,0x5f,0x88,0xe5,0x4d,0x98,0x2c,0xbb,0x0c,0x44,0x1c,0xde,0x4e,0x79,0xbc,0x30,0x5e,0x5b,0x43,0xbc}, "PARETO ", 18}, - {{0xBB,0x1f,0xA4,0xFd,0xEB,0x34,0x59,0x73,0x3b,0xF6,0x7E,0xbC,0x6f,0x89,0x30,0x03,0xfA,0x97,0x6a,0x82}, "XPAT ", 18}, {{0x69,0x44,0x04,0x59,0x5e,0x30,0x75,0xa9,0x42,0x39,0x7f,0x46,0x6a,0xac,0xd4,0x62,0xff,0x1a,0x7b,0xd0}, "PATENTS ", 18}, {{0xF8,0x13,0xF3,0x90,0x2b,0xBc,0x00,0xA6,0xDC,0xe3,0x78,0x63,0x4d,0x3B,0x79,0xD8,0x4F,0x98,0x03,0xd7}, "PATH ", 18}, {{0xB9,0x70,0x48,0x62,0x8D,0xB6,0xB6,0x61,0xD4,0xC2,0xaA,0x83,0x3e,0x95,0xDb,0xe1,0xA9,0x05,0xB2,0x80}, "PAY ", 18}, @@ -484,6 +518,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xfc,0xAC,0x7A,0x75,0x15,0xe9,0xA9,0xd7,0x61,0x9f,0xA7,0x7A,0x1f,0xa7,0x38,0x11,0x1f,0x66,0x72,0x7e}, "PCH ", 18}, {{0x36,0x18,0x51,0x6F,0x45,0xCD,0x3c,0x91,0x3F,0x81,0xF9,0x98,0x7A,0xF4,0x10,0x77,0x93,0x2B,0xc4,0x0d}, "PCL ", 8}, {{0x53,0x14,0x8B,0xb4,0x55,0x17,0x07,0xed,0xF5,0x1a,0x1e,0x8d,0x7A,0x93,0x69,0x8d,0x18,0x93,0x12,0x25}, "PCLOLD ", 8}, + {{0x8A,0xe5,0x6a,0x68,0x50,0xa7,0xcb,0xea,0xC3,0xc3,0xAb,0x2c,0xB3,0x11,0xe7,0x62,0x01,0x67,0xeA,0xC8}, "PEG ", 18}, {{0x58,0x84,0x96,0x9E,0xc0,0x48,0x05,0x56,0xE1,0x1d,0x11,0x99,0x80,0x13,0x6a,0x4C,0x17,0xeD,0xDE,0xd1}, "PET ", 18}, {{0xec,0x18,0xf8,0x98,0xb4,0x07,0x6a,0x3e,0x18,0xf1,0x08,0x9d,0x33,0x37,0x6c,0xc3,0x80,0xbd,0xe6,0x1d}, "PETRO ", 18}, {{0x55,0xc2,0xA0,0xC1,0x71,0xD9,0x20,0x84,0x35,0x60,0x59,0x4d,0xE3,0xd6,0xEE,0xcC,0x09,0xeF,0xc0,0x98}, "PEXT ", 4}, @@ -519,6 +554,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x61,0x8e,0x75,0xac,0x90,0xb1,0x2c,0x60,0x49,0xba,0x3b,0x27,0xf5,0xd5,0xf8,0x65,0x1b,0x00,0x37,0xf6}, "QASH ", 6}, {{0x67,0x1A,0xbB,0xe5,0xCE,0x65,0x24,0x91,0x98,0x53,0x42,0xe8,0x54,0x28,0xEB,0x1b,0x07,0xbC,0x6c,0x64}, "QAU ", 8}, {{0x24,0x67,0xaa,0x6b,0x5a,0x23,0x51,0x41,0x6f,0xd4,0xc3,0xde,0xf8,0x46,0x2d,0x84,0x1f,0xee,0xec,0xec}, "QBX ", 18}, + {{0x4a,0x22,0x0E,0x60,0x96,0xB2,0x5E,0xAD,0xb8,0x83,0x58,0xcb,0x44,0x06,0x8A,0x32,0x48,0x25,0x46,0x75}, "QNT ", 18}, {{0xFF,0xAA,0x5f,0xfc,0x45,0x5d,0x91,0x31,0xf8,0xA2,0x71,0x3A,0x74,0x1f,0xD1,0x96,0x03,0x30,0x50,0x8B}, "QRG ", 18}, {{0x69,0x7b,0xea,0xc2,0x8B,0x09,0xE1,0x22,0xC4,0x33,0x2D,0x16,0x39,0x85,0xe8,0xa7,0x31,0x21,0xb9,0x7F}, "QRL ", 8}, {{0x99,0xea,0x4d,0xB9,0xEE,0x77,0xAC,0xD4,0x0B,0x11,0x9B,0xD1,0xdC,0x4E,0x33,0xe1,0xC0,0x70,0xb8,0x0d}, "QSP ", 18}, @@ -531,8 +567,9 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x76,0x7b,0xA2,0x91,0x5E,0xC3,0x44,0x01,0x5a,0x79,0x38,0xE3,0xeE,0xDf,0xeC,0x27,0x85,0x19,0x5D,0x05}, "REA ", 18}, {{0x5f,0x53,0xf7,0xa8,0x07,0x56,0x14,0xb6,0x99,0xba,0xad,0x0b,0xc2,0xc8,0x99,0xf4,0xba,0xd8,0xfb,0xbf}, "REBL ", 18}, {{0x76,0x96,0x0d,0xcc,0xd5,0xa1,0xfe,0x79,0x9f,0x7c,0x29,0xbe,0x9f,0x19,0xce,0xb4,0x62,0x7a,0xeb,0x2f}, "RED ", 18}, + {{0xB5,0x63,0x30,0x0A,0x3B,0xAc,0x79,0xFC,0x09,0xB9,0x3b,0x6F,0x84,0xCE,0x0d,0x44,0x65,0xA2,0xAC,0x27}, "REDC ", 18}, {{0x40,0x8e,0x41,0x87,0x6c,0xCC,0xDC,0x0F,0x92,0x21,0x06,0x00,0xef,0x50,0x37,0x26,0x56,0x05,0x2a,0x38}, "REN ", 18}, - {{0xE9,0x43,0x27,0xD0,0x7F,0xc1,0x79,0x07,0xb4,0xDB,0x78,0x8E,0x5a,0xDf,0x2e,0xd4,0x24,0xad,0xDf,0xf6}, "REP ", 18}, + {{0x19,0x85,0x36,0x5e,0x9f,0x78,0x35,0x9a,0x9B,0x6A,0xD7,0x60,0xe3,0x24,0x12,0xf4,0xa4,0x45,0xE8,0x62}, "REP ", 18}, {{0x8f,0x82,0x21,0xaF,0xbB,0x33,0x99,0x8d,0x85,0x84,0xA2,0xB0,0x57,0x49,0xbA,0x73,0xc3,0x7a,0x93,0x8a}, "REQ ", 18}, {{0xf0,0x5a,0x93,0x82,0xA4,0xC3,0xF2,0x9E,0x27,0x84,0x50,0x27,0x54,0x29,0x3D,0x88,0xb8,0x35,0x10,0x9C}, "REX ", 18}, {{0xd0,0x92,0x9d,0x41,0x19,0x54,0xc4,0x74,0x38,0xdc,0x1d,0x87,0x1d,0xd6,0x08,0x1f,0x5c,0x5e,0x14,0x9c}, "RFR ", 4}, @@ -571,6 +608,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x6E,0x34,0xd8,0xd8,0x47,0x64,0xD4,0x0f,0x6D,0x7b,0x39,0xcd,0x56,0x9F,0xd0,0x17,0xbF,0x53,0x17,0x7D}, "SKRP 1 ", 18}, {{0x32,0x4a,0x48,0xeb,0xcb,0xb4,0x6e,0x61,0x99,0x39,0x31,0xef,0x9d,0x35,0xf6,0x69,0x7c,0xd2,0x90,0x1b}, "SKRP 1-E ", 18}, {{0x7A,0x5f,0xF2,0x95,0xDc,0x82,0x39,0xd5,0xC2,0x37,0x4E,0x4D,0x89,0x42,0x02,0xaA,0xF0,0x29,0xCa,0xb6}, "SLT ", 3}, + {{0x79,0x28,0xc8,0xaB,0xF1,0xF7,0x4e,0xF9,0xF9,0x6D,0x4D,0x0a,0x44,0xe3,0xb4,0x20,0x9d,0x36,0x07,0x85}, "SLY ", 18}, {{0x6F,0x6D,0xEb,0x5d,0xb0,0xC4,0x99,0x4A,0x82,0x83,0xA0,0x1D,0x6C,0xFe,0xEB,0x27,0xFc,0x3b,0xBe,0x9C}, "SMART ", 0}, {{0x2d,0xcf,0xaa,0xc1,0x1c,0x9e,0xeb,0xd8,0xc6,0xc4,0x21,0x03,0xfe,0x9e,0x2a,0x6a,0xd2,0x37,0xaf,0x27}, "SmartNod ", 18}, {{0x55,0xf9,0x39,0x85,0x43,0x1f,0xc9,0x30,0x40,0x77,0x68,0x7a,0x35,0xa1,0xba,0x10,0x3d,0xc1,0xe0,0x81}, "SmartMsh ", 18}, @@ -592,7 +630,6 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x68,0xd5,0x7c,0x9a,0x1C,0x35,0xf6,0x3E,0x2c,0x83,0xeE,0x8e,0x49,0xA6,0x4e,0x9d,0x70,0x52,0x8D,0x25}, "SRN ", 18}, {{0xbb,0xFF,0x86,0x2d,0x90,0x6E,0x34,0x8E,0x99,0x46,0xBf,0xb2,0x13,0x2e,0xcB,0x15,0x7D,0xa3,0xD4,0xb4}, "SS shard ", 18}, {{0x6e,0x20,0x50,0xCB,0xFB,0x3e,0xD8,0xA4,0xd3,0x9b,0x64,0xcC,0x9f,0x47,0xE7,0x11,0xa0,0x3a,0x5a,0x89}, "SSH ", 18}, - {{0x4A,0x89,0xcD,0x48,0x6f,0xA9,0x96,0xad,0x50,0xc0,0xa6,0x3C,0x35,0xc7,0x87,0x02,0xf5,0x42,0x2a,0x50}, "STABIT ", 3}, {{0x9a,0x00,0x5c,0x9a,0x89,0xbd,0x72,0xa4,0xbd,0x27,0x72,0x1e,0x7a,0x09,0xa3,0xc1,0x1d,0x2b,0x03,0xc4}, "STAC ", 18}, {{0xF7,0x0a,0x64,0x2b,0xD3,0x87,0xF9,0x43,0x80,0xfF,0xb9,0x04,0x51,0xC2,0xc8,0x1d,0x4E,0xb8,0x2C,0xBc}, "STAR ", 18}, {{0x62,0x9a,0xEe,0x55,0xed,0x49,0x58,0x1C,0x33,0xab,0x27,0xf9,0x40,0x3F,0x79,0x92,0xA2,0x89,0xff,0xd5}, "STC ", 18}, @@ -614,32 +651,38 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xc2,0x7a,0x2f,0x05,0xfa,0x57,0x7a,0x83,0xba,0x0f,0xdb,0x4c,0x38,0x44,0x3c,0x07,0x18,0x35,0x65,0x01}, "TAU ", 18}, {{0xFA,0xCC,0xD5,0xFc,0x83,0xc3,0xE4,0xC3,0xc1,0xAC,0x1E,0xF3,0x5D,0x15,0xad,0xf0,0x6b,0xCF,0x20,0x9C}, "TBC2 ", 8}, {{0xAF,0xe6,0x05,0x11,0x34,0x1a,0x37,0x48,0x8d,0xe2,0x5B,0xef,0x35,0x19,0x52,0x56,0x2E,0x31,0xfC,0xc1}, "TBT ", 8}, + {{0xfA,0x0e,0xF5,0xE0,0x34,0xCa,0xE1,0xAE,0x75,0x2d,0x59,0xbd,0xb8,0xaD,0xcD,0xe3,0x7E,0xd7,0xaB,0x97}, "TCA ", 18}, {{0x2a,0x1d,0xba,0xbe,0x65,0xc5,0x95,0xB0,0x02,0x2e,0x75,0x20,0x8C,0x34,0x01,0x41,0x39,0xd5,0xd3,0x57}, "TDH ", 18}, {{0x85,0xe0,0x76,0x36,0x1c,0xc8,0x13,0xa9,0x08,0xff,0x67,0x2f,0x9b,0xad,0x15,0x41,0x47,0x44,0x02,0xb2}, "TEL ", 2}, {{0xa7,0xf9,0x76,0xC3,0x60,0xeb,0xBe,0xD4,0x46,0x5c,0x28,0x55,0x68,0x4D,0x1A,0xAE,0x52,0x71,0xeF,0xa9}, "TFL ", 8}, {{0x38,0x83,0xf5,0xe1,0x81,0xfc,0xca,0xf8,0x41,0x0f,0xa6,0x1e,0x12,0xb5,0x9b,0xad,0x96,0x3f,0xb6,0x45}, "THETA ", 18}, {{0xfe,0x7B,0x91,0x5A,0x0b,0xAA,0x0E,0x79,0xf8,0x5c,0x55,0x53,0x26,0x65,0x13,0xF7,0xC1,0xc0,0x3E,0xd0}, "THUG ", 18}, + {{0xa5,0xdb,0x1d,0x6f,0x7a,0x0d,0x5b,0xcc,0xc1,0x7d,0x0b,0xfd,0x39,0xd7,0xaf,0x32,0xd5,0xe5,0xed,0xc6}, "TICO ", 5}, {{0x65,0x31,0xf1,0x33,0xe6,0xDe,0xeB,0xe7,0xF2,0xdc,0xE5,0xA0,0x44,0x1a,0xA7,0xef,0x33,0x0B,0x4e,0x53}, "TIME ", 8}, {{0x80,0xbc,0x55,0x12,0x56,0x1c,0x7f,0x85,0xa3,0xa9,0x50,0x8c,0x7d,0xf7,0x90,0x1b,0x37,0x0f,0xa1,0xdf}, "TIO ", 18}, {{0xEa,0x1f,0x34,0x6f,0xaF,0x02,0x3F,0x97,0x4E,0xb5,0xad,0xaf,0x08,0x8B,0xbC,0xdf,0x02,0xd7,0x61,0xF4}, "TIX ", 18}, {{0xaA,0xAf,0x91,0xD9,0xb9,0x0d,0xF8,0x00,0xDf,0x4F,0x55,0xc2,0x05,0xfd,0x69,0x89,0xc9,0x77,0xE7,0x3a}, "TKN ", 8}, + {{0xb3,0x61,0x65,0x50,0xab,0xc8,0xaf,0x79,0xc7,0xa5,0x90,0x2d,0xef,0x9e,0xfa,0x3b,0xc9,0xa9,0x52,0x00}, "TLX ", 8}, {{0x08,0xf5,0xa9,0x23,0x5b,0x08,0x17,0x3b,0x75,0x69,0xf8,0x36,0x45,0xd2,0xc7,0xfb,0x55,0xe8,0xcc,0xd8}, "TNT ", 8}, {{0x8e,0xb9,0x65,0xee,0x9c,0xCF,0xBC,0xE7,0x6c,0x0a,0x06,0x26,0x44,0x92,0xc0,0xaf,0xEf,0xc2,0x82,0x6d}, "TOOR ", 18}, {{0xcB,0x3F,0x90,0x2b,0xf9,0x76,0x26,0x39,0x1b,0xF8,0xbA,0x87,0x26,0x4b,0xbC,0x3D,0xC1,0x34,0x69,0xbe}, "TRC ", 18}, {{0x56,0x6F,0xd7,0x99,0x9B,0x1F,0xc3,0x98,0x80,0x22,0xbD,0x38,0x50,0x7A,0x48,0xF0,0xbC,0xf2,0x2c,0x77}, "TRCN ", 18}, {{0xcb,0x94,0xbe,0x6f,0x13,0xa1,0x18,0x2e,0x4a,0x4b,0x61,0x40,0xcb,0x7b,0xf2,0x02,0x5d,0x28,0xe4,0x1b}, "TRST ", 6}, {{0xf2,0x30,0xb7,0x90,0xe0,0x53,0x90,0xfc,0x82,0x95,0xf4,0xd3,0xf6,0x03,0x32,0xc9,0x3b,0xed,0x42,0xe2}, "TRX ", 6}, + {{0x6B,0x87,0x99,0x9b,0xE8,0x73,0x58,0x06,0x5b,0xBd,0xE4,0x1e,0x8a,0x0f,0xe0,0xB7,0xb1,0xcd,0x25,0x14}, "TSW ", 18}, {{0x2e,0xF1,0xaB,0x8a,0x26,0x18,0x7C,0x58,0xBB,0x8a,0xAe,0xB1,0x1B,0x2f,0xC6,0xD2,0x5C,0x5c,0x07,0x16}, "TWN ", 18}, - {{0xfb,0xd0,0xd1,0xc7,0x7b,0x50,0x17,0x96,0xa3,0x5d,0x86,0xcf,0x91,0xd6,0x5d,0x97,0x78,0xee,0xe6,0x95}, "TWNKL ", 3}, + {{0xfb,0xd0,0xd1,0xc7,0x7b,0x50,0x17,0x96,0xa3,0x5d,0x86,0xcf,0x91,0xd6,0x5d,0x97,0x78,0xee,0xe6,0x95}, "MOVED ", 3}, {{0x24,0x69,0x27,0x91,0xbc,0x44,0x4c,0x5c,0xd0,0xb8,0x1e,0x3c,0xbc,0xab,0xa4,0xb0,0x4a,0xcd,0x1f,0x3b}, "UKG ", 18}, {{0x8e,0x5a,0xfc,0x69,0xf6,0x22,0x7a,0x3a,0xd7,0x5e,0xd3,0x46,0xc8,0x72,0x3b,0xc6,0x2c,0xe9,0x71,0x23}, "UMKA ", 4}, {{0x89,0x20,0x5A,0x3A,0x3b,0x2A,0x69,0xDe,0x6D,0xbf,0x7f,0x01,0xED,0x13,0xB2,0x10,0x8B,0x2c,0x43,0xe7}, "Unicorn ", 0}, {{0xd0,0x1d,0xb7,0x3e,0x04,0x78,0x55,0xef,0xb4,0x14,0xe6,0x20,0x20,0x98,0xc4,0xbe,0x4c,0xd2,0x42,0x3b}, "UQC ", 18}, + {{0x93,0x16,0x84,0x13,0x9f,0x75,0x6C,0x24,0xeC,0x07,0x31,0xE9,0xF7,0x4F,0xE5,0x0e,0x55,0x48,0xdD,0xeF}, "URB ", 18}, {{0xD7,0x60,0xAD,0xdF,0xb2,0x4D,0x9C,0x01,0xFe,0x4B,0xfe,0xa7,0x47,0x5C,0x5e,0x36,0x36,0x68,0x40,0x58}, "USDM ", 2}, {{0xda,0xc1,0x7f,0x95,0x8d,0x2e,0xe5,0x23,0xa2,0x20,0x62,0x06,0x99,0x45,0x97,0xc1,0x3d,0x83,0x1e,0xc7}, "USDT ", 6}, {{0x70,0xa7,0x28,0x33,0xd6,0xbf,0x7f,0x50,0x8c,0x82,0x24,0xce,0x59,0xea,0x1e,0xf3,0xd0,0xea,0x3a,0x38}, "UTK ", 18}, {{0x9e,0x33,0x19,0x63,0x6e,0x21,0x26,0xe3,0xc0,0xbc,0x9e,0x31,0x34,0xAE,0xC5,0xe1,0x50,0x8A,0x46,0xc7}, "UTN-P ", 18}, {{0x35,0x43,0x63,0x8e,0xD4,0xa9,0x00,0x6E,0x48,0x40,0xB1,0x05,0x94,0x42,0x71,0xBc,0xea,0x15,0x60,0x5D}, "UUU ", 18}, + {{0x57,0xC7,0x5E,0xCC,0xc8,0x55,0x71,0x36,0xD3,0x26,0x19,0xa1,0x91,0xfB,0xCD,0xc8,0x85,0x60,0xd7,0x11}, "VDG ", 0}, {{0x82,0xBD,0x52,0x6b,0xDB,0x71,0x8C,0x6d,0x4D,0xD2,0x29,0x1E,0xd0,0x13,0xA5,0x18,0x6c,0xAE,0x2D,0xCa}, "VDOC ", 18}, {{0x34,0x0d,0x2b,0xde,0x5e,0xb2,0x8c,0x1e,0xed,0x91,0xb2,0xf7,0x90,0x72,0x3e,0x3b,0x16,0x06,0x13,0xb7}, "VEE ", 18}, {{0xEb,0xeD,0x4f,0xF9,0xfe,0x34,0x41,0x3d,0xb8,0xfC,0x82,0x94,0x55,0x6B,0xBD,0x15,0x28,0xa4,0xDA,0xca}, "VENUS ", 3}, @@ -657,6 +700,7 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0x92,0xe7,0x8d,0xae,0x13,0x15,0x06,0x7a,0x88,0x19,0xef,0xd6,0xdc,0xa4,0x32,0xde,0x9d,0xcd,0xe2,0xe9}, "VRS ", 6}, {{0x5c,0x54,0x3e,0x7A,0xE0,0xA1,0x10,0x4f,0x78,0x40,0x6C,0x34,0x0E,0x9C,0x64,0xFD,0x9f,0xCE,0x51,0x70}, "VSL ", 18}, {{0x28,0x6B,0xDA,0x14,0x13,0xa2,0xDf,0x81,0x73,0x1D,0x49,0x30,0xce,0x2F,0x86,0x2a,0x35,0xA6,0x09,0xfE}, "WaBi ", 18}, + {{0x82,0x9A,0x4c,0xA1,0x30,0x33,0x83,0xF1,0x08,0x2B,0x6B,0x1f,0xB9,0x37,0x11,0x6e,0x4b,0x3b,0x56,0x05}, "WATT ", 18}, {{0x39,0xBb,0x25,0x9F,0x66,0xE1,0xC5,0x9d,0x5A,0xBE,0xF8,0x83,0x75,0x97,0x9b,0x4D,0x20,0xD9,0x80,0x22}, "WAX ", 8}, {{0x74,0x95,0x1B,0x67,0x7d,0xe3,0x2D,0x59,0x6E,0xE8,0x51,0xA2,0x33,0x33,0x69,0x26,0xe6,0xA2,0xcd,0x09}, "WBA ", 7}, {{0x6a,0x0a,0x97,0xe4,0x7d,0x15,0xaa,0xd1,0xd1,0x32,0xa1,0xac,0x79,0xa4,0x80,0xe3,0xf2,0x07,0x90,0x63}, "WCT ", 18}, @@ -668,9 +712,9 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xD3,0xC0,0x07,0x72,0xB2,0x4D,0x99,0x7A,0x81,0x22,0x49,0xca,0x63,0x7a,0x92,0x1e,0x81,0x35,0x77,0x01}, "WILD ", 18}, {{0x66,0x70,0x88,0xb2,0x12,0xce,0x3d,0x06,0xa1,0xb5,0x53,0xa7,0x22,0x1E,0x1f,0xD1,0x90,0x00,0xd9,0xaF}, "WINGS ", 18}, {{0xF6,0xB5,0x5a,0xcB,0xBC,0x49,0xf4,0x52,0x4A,0xa4,0x8D,0x19,0x28,0x1A,0x9A,0x77,0xc5,0x4D,0xE1,0x0f}, "WLK ", 18}, + {{0xbf,0xbe,0x53,0x32,0xf1,0x72,0xd7,0x78,0x11,0xbc,0x6c,0x27,0x28,0x44,0xf3,0xe5,0x4a,0x7b,0x23,0xbb}, "WMK ", 18}, + {{0xd7,0x3A,0x66,0xB8,0xFB,0x26,0xBe,0x8B,0x0A,0xcD,0x7c,0x52,0xBd,0x32,0x50,0x54,0xAc,0x7d,0x46,0x8b}, "WNK ", 18}, {{0x72,0x87,0x81,0xE7,0x57,0x35,0xdc,0x09,0x62,0xDf,0x3a,0x51,0xd7,0xEf,0x47,0xE7,0x98,0xA7,0x10,0x7E}, "WOLK ", 18}, - {{0xd1,0x8e,0x45,0x4d,0x84,0x4e,0xb0,0x00,0x9d,0x32,0xe0,0x7a,0x0c,0xde,0x89,0xe1,0x8d,0x64,0xcf,0xb4}, "WORK ", 18}, - {{0x62,0x08,0x72,0x45,0x08,0x71,0x25,0xd3,0xdb,0x5b,0x9a,0x3d,0x71,0x3d,0x78,0xe7,0xbb,0xc3,0x1e,0x54}, "WPC ", 18}, {{0x4C,0xF4,0x88,0x38,0x7F,0x03,0x5F,0xF0,0x8c,0x37,0x15,0x15,0x56,0x2C,0xBa,0x71,0x2f,0x90,0x15,0xd4}, "WPR ", 18}, {{0x71,0xe8,0xd7,0x4f,0xf1,0xc9,0x23,0xe3,0x69,0xd0,0xe7,0x0d,0xfb,0x09,0x86,0x66,0x29,0xc4,0xdd,0x35}, "WRK ", 18}, {{0xb7,0xcb,0x1c,0x96,0xdb,0x6b,0x22,0xb0,0xd3,0xd9,0x53,0x6e,0x01,0x08,0xd0,0x62,0xbd,0x48,0x8f,0x74}, "WTC ", 18}, @@ -688,9 +732,10 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xBC,0x86,0x72,0x7E,0x77,0x0d,0xe6,0x8B,0x10,0x60,0xC9,0x1f,0x6B,0xB6,0x94,0x5c,0x73,0xe1,0x03,0x88}, "XNK ", 18}, {{0xab,0x95,0xe9,0x15,0xc1,0x23,0xfd,0xed,0x5b,0xdf,0xb6,0x32,0x5e,0x35,0xef,0x55,0x15,0xf1,0xea,0x69}, "XNN ", 18}, {{0x57,0x2e,0x6f,0x31,0x80,0x56,0xba,0x0c,0x5d,0x47,0xa4,0x22,0x65,0x31,0x13,0x84,0x3d,0x25,0x06,0x91}, "XNT ", 0}, + {{0xBB,0x1f,0xA4,0xFd,0xEB,0x34,0x59,0x73,0x3b,0xF6,0x7E,0xbC,0x6f,0x89,0x30,0x03,0xfA,0x97,0x6a,0x82}, "XPAT ", 18}, {{0xB2,0x47,0x54,0xbE,0x79,0x28,0x15,0x53,0xdc,0x1a,0xdC,0x16,0x0d,0xdF,0x5C,0xd9,0xb7,0x43,0x61,0xa4}, "XRL ", 9}, {{0x0F,0x51,0x3f,0xFb,0x49,0x26,0xff,0x82,0xD7,0xF6,0x0A,0x05,0x06,0x90,0x47,0xAc,0xA2,0x95,0xC4,0x13}, "XSC ", 18}, - {{0x6f,0x7a,0x4b,0xac,0x33,0x15,0xb5,0x08,0x2f,0x79,0x31,0x61,0xa2,0x2e,0x26,0x66,0x6d,0x22,0x71,0x7f}, "YEED ", 18}, + {{0xca,0x27,0x96,0xf9,0xf6,0x1d,0xc7,0xb2,0x38,0xaa,0xb0,0x43,0x97,0x1e,0x49,0xc6,0x16,0x4d,0xf3,0x75}, "YEED ", 18}, {{0x0F,0x33,0xbb,0x20,0xa2,0x82,0xA7,0x64,0x9C,0x7B,0x3A,0xFf,0x64,0x4F,0x08,0x4a,0x93,0x48,0xe9,0x33}, "YUPIE ", 18}, {{0x67,0x81,0xa0,0xf8,0x4c,0x7e,0x9e,0x84,0x6d,0xcb,0x84,0xa9,0xa5,0xbd,0x49,0x33,0x30,0x67,0xb1,0x04}, "ZAP ", 18}, {{0x05,0xf4,0xa4,0x2e,0x25,0x1f,0x2d,0x52,0xb8,0xed,0x15,0xE9,0xFE,0xdA,0xac,0xFc,0xEF,0x1F,0xAD,0x27}, "ZIL ", 12}, diff --git a/src_genericwallet/tokens.h b/src_genericwallet/tokens.h index c8d3518..c382a85 100644 --- a/src_genericwallet/tokens.h +++ b/src_genericwallet/tokens.h @@ -25,7 +25,7 @@ typedef struct tokenDefinition_t { #define NUM_TOKENS_AKROMA 0 #define NUM_TOKENS_ELLAISM 1 -#define NUM_TOKENS_ETHEREUM 677 +#define NUM_TOKENS_ETHEREUM 722 #define NUM_TOKENS_ETHEREUM_CLASSIC 0 #define NUM_TOKENS_ETHERSOCIAL 0 #define NUM_TOKENS_ETHER1 0