From 13a7a6fc79bad6c3365919a1560acea02e28bfa0 Mon Sep 17 00:00:00 2001 From: BTChip github Date: Mon, 27 Aug 2018 17:04:15 +0200 Subject: [PATCH 1/6] Fix contract deployment --- src_genericwallet/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_genericwallet/main.c b/src_genericwallet/main.c index 132903a..cf71287 100644 --- a/src_genericwallet/main.c +++ b/src_genericwallet/main.c @@ -1630,7 +1630,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 From b9e3cc89702bf76b3dd39283433d7023db28b147 Mon Sep 17 00:00:00 2001 From: BTChip github Date: Tue, 28 Aug 2018 09:12:20 +0200 Subject: [PATCH 2/6] Make contract parameters display optional --- src_genericwallet/main.c | 239 ++++++++++++++++----------------------- 1 file changed, 97 insertions(+), 142 deletions(-) diff --git a/src_genericwallet/main.c b/src_genericwallet/main.c index cf71287..e46de07 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) { @@ -1671,6 +1621,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; @@ -1925,7 +1878,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 } @@ -2352,10 +2305,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); From 9111629dbc721e8e8c7793616d1eadfb599f1f6a Mon Sep 17 00:00:00 2001 From: BTChip github Date: Tue, 28 Aug 2018 09:30:58 +0200 Subject: [PATCH 3/6] Update tokens list --- src_genericwallet/tokens.c | 89 ++++++++++++++++++++++++++++---------- src_genericwallet/tokens.h | 2 +- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/src_genericwallet/tokens.c b/src_genericwallet/tokens.c index c9a898a..00bfa62 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 6ab3082..23d9b22 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 From 624867528c76b90cbed7941a3a24026beb6ed3c1 Mon Sep 17 00:00:00 2001 From: BTChip github Date: Tue, 28 Aug 2018 09:32:20 +0200 Subject: [PATCH 4/6] Bump version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e878102..f780412 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) From b28d4a77360ea077449aa5016ef09e61cb80d604 Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Wed, 29 Aug 2018 18:53:02 +0200 Subject: [PATCH 5/6] remove obsolete src folders --- Makefile | 2 +- src_chainsplit/main.c | 1405 ----------------------------------------- src_daosend/main.c | 981 ---------------------------- 3 files changed, 1 insertion(+), 2387 deletions(-) delete mode 100644 src_chainsplit/main.c delete mode 100644 src_daosend/main.c diff --git a/Makefile b/Makefile index c8811fa..8bdf16c 100755 --- a/Makefile +++ b/Makefile @@ -193,7 +193,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 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; -} From be7b68c97f346dd63caf8745e0b945aeb9f8d95e Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Tue, 4 Sep 2018 14:13:54 +0200 Subject: [PATCH 6/6] updated icons for clones --- Makefile | 4 ++-- akroma.png | Bin 0 -> 2231 bytes atheios.png | Bin 0 -> 1824 bytes blue_app_akroma.gif | Bin 3477 -> 538 bytes blue_app_atheios.gif | Bin 405 -> 436 bytes blue_app_musicoin.gif | Bin 1449 -> 521 bytes blue_app_pirl.gif | Bin 880 -> 504 bytes musicoin.png | Bin 0 -> 2251 bytes nanos_app_akroma.gif | Bin 1337 -> 1134 bytes nanos_app_atheios.gif | Bin 68 -> 1129 bytes nanos_app_musicoin.gif | Bin 604 -> 1124 bytes nanos_app_pirl.gif | Bin 73 -> 1131 bytes pirl.png | Bin 0 -> 1559 bytes 13 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 akroma.png create mode 100644 atheios.png create mode 100644 musicoin.png create mode 100644 pirl.png diff --git a/Makefile b/Makefile index aac441f..1039b1a 100755 --- a/Makefile +++ b/Makefile @@ -112,7 +112,7 @@ DEFINES += CHAINID_UPCASE=\"ATHEIOS\" CHAINID_COINNAME=\"ATH\" CHAIN_KIND=CHAIN_ APPNAME = "Atheios" 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) +$(error Unsupported CHAIN - use ethereum, ethereum_classic, expanse, poa, rsk, rsk_testnet, ubiq, wanchain, kusd, musicoin, pirl, akroma, atheios, callisto, ethersocial, ellaism, ether1, ethergem) endif endif @@ -204,4 +204,4 @@ include $(BOLOS_SDK)/Makefile.rules 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 + @echo VARIANTS CHAIN ethereum ethereum_classic expanse poa rsk rsk_testnet ubiq wanchain kusd pirl akroma # musicoin atheios callisto ethersocial ellaism ether1 ethergem diff --git a/akroma.png b/akroma.png new file mode 100644 index 0000000000000000000000000000000000000000..22baa92a1c6bde6a39f139e65916a138a39891be GIT binary patch literal 2231 zcmV;o2uSydP)StCZJ3JnE;r8FahZV2@?Plzy=L>*WR_|q-lt=)1^{#bU8G~^5>Da>1T5iz!B|BZrsK?oYfBt}IAX3T$`nX{ z5ip4*2)L$`6}AW+i#fD$Wr+oheFmcy^`0ve24&z4NDAYeOo2qvmq7}p=M>1p)EY)B zkU9Cx$hys`)hq@i!UzjR2gr4V;SNd)WGC+p4UL!)VYrhv)2TTSmQBR~?q2pEa`c+y z)EUlK0EM^^@sHb4k zd64uiTgXAwQE)j>0ud&c7Lv7goBVQeLSLh3$$O^zISX;pN`IM5$WI?Xk~i1a&TpL^*{%zGWE-{Aex;*mJcx;>m zL^x9hiR<`551Pgg#1T=xpPrJZ+gq~n?j2cwUz|T6&TzMeL}69p2nX`w`sldg#VZ|( z{rcgP-fC4yxR0B8^$hH>?Q7CtP zcek+0my1UH{$*!}CIwkF3*6qu{(c?cYy*h5i6~jQIxQ60O7Izg`0wzL#vm&=ozAiV zX?X=AyR9`1#UM4Ft5t;00kRAyFa4%)Mx$lvt5G1{zM)FFMOW*Sfve+ibb4b*D3+k< z*>3nex=Oi4fgP?$c1LT55NT1FdbQi6 z%*u4xFgvS)l{7+}#Hv8Fi6e$q1-B&z`1K0Jksv@+Q@Ta&!KN1`pT{)C#&;@vwlWA1 zRXt*3C8h-;-d~i_VQ!^L>2E16i~ix;+g6s97Z+4kg$5&5!DP+V%Mi;>f5QN=XouKZ zR#xnh7gBJSDc3M%2lhs&6FoaB5KZHVDs};m*kqKyTbWRT0Wocdm{j01F<~&ELuUaV zZ!)4qZ<-7&KM=z-*0#O?h<|&%*Y?P_e&2ZM>S|bsZRgjb^&+10+wn0413&;JwoCFX zr>v?y7!Z~FX;`#SbTc%S{)RH=_+5n z=xW8h>70rWNqj7{&Jz@5vb*^!Dc&VYbyt=u-XJzSV(qWtDo8HkB5}kT#F*Mzh)rFQ z_qnV>59_eF^`Pi8u^urk7U$;c3&gUn;P;AXn?74rkCltOhxKz>lN7f7rS5O&Ig;Qm z3krd9<^ODWO^LUbV7jZ3ONLFCy z?o7NT4K)iC6Vi|KIz{XbgqpMhkW#kh(Y@mqN}%nK6cFkcSe8!3?Ly==TLCVL8@McN z8qg`jEkMbOq`Q3iD6EYabv}#O0Ex#KKrTti&jCR(2QXOy)g;Xo0l7#JWjPuRBC=cK~o3J_clwIGA}61iqFZG;+1 zFImQolbr#Qnu=KxaMG&lZF{EBH3NrZn|+B1g1q%0T$Xt2^w)0JdPXu&==MwuNNt`G z;tG(MAVAQP=Yq~J8knwAUU37n+CE##6(AXwhpL@EtBM1ud||xT1ZWHTeBjsflJ|)a8C<_qc%a=5`yNn<70ug{9jW{7uv;jG++VKF&QyIw0 zx-DBkSeoRhf40RRe>AgXunK*x6%;)F`?d6!=R?k-euB%4&Kpvti1KqBbrej-I?tf$ zM?D3TIbAmt{S*)zMqLGo9dq6&K3K9GF?+Bid*fl$n>RUB!N>%{pbW@#L~$#FW{zIt z<`0H#Bxi|jg)0Too<{pJGw zz{JJ3U|G@KyqB$CL6fRv&BZcLQ0>ofh{MX^!sMOIimjs7yu~)uYdJCo0k9p002ovPDHLk FV1iz50b~FG literal 0 HcmV?d00001 diff --git a/atheios.png b/atheios.png new file mode 100644 index 0000000000000000000000000000000000000000..22af8d272b175d1e3c940f5779fcc563b78aa842 GIT binary patch literal 1824 zcmV+*2jBRKP)eEC_piUzHFW?rjlqYY0|Cn-;8cR1hb(A!dFyhL2IL75B&_nbRssT& z5Oj;T4kkG@BqBfwn}UogqQl!h#?V$nAYxk#O%8l0<83z&F|~|Dz|iz%g%y!RFr`lSQZ`Tt;Y5HM4l9s3>CDJhI5ETAgg7$H zlEM;n92tnDh?u4)L}XKL0>{U?h;8yYMARAgU23Z}C0>ZCQ>H1z z)fswG7co9tA!0e?(8bIMR@7ydD1~ghI2prs?2skY(Q|KZ%)6mEL}XS!+j17~zxlGa^U+2A82n8A^xMDQ&UYvL@gJK=d2gI? z$wQVkOX+W4c***nZVy*?&v9V2W+z><`xUk6dX(xVohds?aKMU>xYk?d7pp%yWik>+_uy+ zE}4*J+cK&#ZhZeF@;LyuwMZq)G9gV{)$#3*e@nwp0JM z=+8N`_7I|0igYupxzI!&RRkVIOz`S^sRFnFg*2!i=qDe%8mcR9{P1Mz_UixOz0ijR zXjnnWwGYoHQb(Lh)IKN^GG8WjSgw+JAcU+DH8;aT6*pv3Nfr=c8#x2}zrtsf38|AN zX20e@3loGB##OTIawW#PhVtGhpZClLskjZVv!snQR(Tyy+3$BpJ(n9-V1%4 zl}OS~O`+i{`s)?l@OXUd3YCfUOB?L{ZLJ3K0&0>S1)yt}?4yr0Cgb-Nz zRzHc|2d9Pnw&Td3vra=QDQbDXkiCLIq^e`@@KIr(N_F3GY(<$^tO#}FwPvwF$?9cA zr~|{A)m^<8W%aVEtAmRq*ZO{c-e2=OP%%fTT4%Y4E@l!*n$ zY|_MHCe;x<`4_0>6BdfLdYLJ8=(1)_sKlhz%bYrBsYE*=u%xZ30}3&U>X22U7K?BW zCYI;56JpwY!a`9d7SpW`lh&;6V$p<&#hf~5sf3wS2c;q~O|fWFCE5rn%9_Q7X{%QY zAymvKw7JBfi3No8b=Mu1URZ1bgH~@J2pKwckWtAHl@LnStPYhJuzGz$jwi$XO98Q^muUuqm~;L^-`aJvM4TTvvo@0{eZ7W#ZbUyz3^z^$yk!GZKj zP>p9rFXGxdd>JmyoEG&>>RokWKKh9bsZB0|LdkhWahv|%giE}wA<0aDuhq3vRaj<$$x zB$C`uJ@b-^LkN>4l4(fds;qb#zA98jGDIw6k*J*JDuK(9yBpo-B!jDCh(d@&4BVW3 z-NiTcoUxH~<5Whl=y=1W#EDbejWlGWR*0mOhBvw&_^OM0bkP@=+M*L85!3QUx1er0 z4tzl6y_@HoJSc1Af|$(;D+Uy?kMWf%RMSEXWkAYW1u`;5E3)AHAI7(k<~?O5(@fIH24xa1bu)p6eY!f0t^6sz)#TV*su%$ O0000J^92YJGd;xuafPxPgH+&2O2?vRPfn6ClhzA^o zi4Fz;Vj4Gb0v!T=3W$6Hp^O~>d~cLZ4+xZfuA+dtQGsnV$VQ3+BW#&Q-FcBbPi4l zdbsUVziltY9E6unL9Rp>2nYi>W{9G5045GommVK}zth-g4!~Lt)Bl7g#EseSNt^VcHv(ocMv8 cNRI|JUhnt~Mn$g}#F=2Q93;eu-w^-+J5pZaegFUf literal 3477 zcmai#3pkT)AHeT1$0#Hz)Qm)7hm0AkVI)}&QAlOBVL5Eg)JQd>NUDWOI!$!ciF`#R zlv8JPqPG%Ci6R@DZP~Z=zV*J>cfDQTeO=G<+=t))bpQYV>sh+Y2kS~k12hl=&;wwT zz1`JT1&T{H;+Brb!2A2N2Z|T_GIQDp&sZ(hsxrB zm`a}DtQ$uHY30?CGdG2^XPgJwk}yjt6-k4S&x8 zqfm$}0Z5~O>{OAMXgLuAB)&i#>O24p6sN%VEFez@at>rLC2!0g2)Vfvo!#=Lx^Fp$ zq`R486}O~if-z@HMI(7K4@~y=%PKD^3W1CX?g5hQ3}0SXJ*o}Hi3G7b7>|rl6oEcq zt~d(m0Qfh+w%ec64Xj@PjL-nQ0`_t?qyen`GTlOUg#Qd+Zvc87Ab$X+Ux4-?nKOCZ za*_}3g76xU*a?sl=GqYmv=-2sKtBi ztTc1I{86j?B46>8EAcm1h`K-TJ~PZO9bu+RQknAF%hH2;WhaWn^(|r#EqPnJq^ief=u|v>HHL&FF}-MUbl)@Ua59wh@Akhdk+CfP;B&Q~^$sC8IWUHSVh_qx1i_T=z8A&je zMshSGg^hszUk!QYpVUW(q6ehjA(eK}(<| z(vsN8N*48tRo)Vb^b7x2wTX$p=wx;5B z%x17c7>tCUHy#+rU^9~A7)+R#m+FSGFk2FtLQhg{+WkX{rYr>-9L8xl8}n{E`IeeElJt9EMwf#@^&hXgI$yqc{_JT-d)t%8j~+g_f3LNrxvBB) zore0l+qJiD-l(a*e(gV1S1T*7T)uSiLizb~XV08IRaSbkL~!Exv7<+d4;LLec%ZN# ze?NcU-aUD{b9d!r@7$4<$;;qw-?lYP^dR1u1%HW{DfE6VF<$lY2m-=`Uy*xb#OBUnZ-Egj07iWyqA~Xt#aCER= zxWLYKzRf&qE4U?W?i>qqv)QvuXPV3~o^E7lFm0;7-V|LOZ7od=sJa>i0Luv|Pz`(4 zOZDpq+6u5m$K02>e+E-0>`ML8Os{D(5$r11{>|o5D_p{+se1Hj9^wy zFm(;0>@-=*Pj^Z;-5Bk?h=@+gGK$rmiAdATTNqnOE!Ib>*+q1X&a;kOWa(EHhdR@2 z=Dt-;A1w%P&lvE>j25u%mLEcv;0iZfJ-^}te*0$~BkLD0jo>-EX0JJD_o^r;KDcSZ zxjgblfdAKq3~%VH3hDvra~@Ux!`O8>HPW(7g9K+$3_#W%`+H{Lh@hcUw#hQagj~2b zG5`y9W>47}*8=T6>#K=3t7bJ2ny*NXq$C=;^ch#>1vc-Qi~iJX!__XkLurd_Uv9f! zuWL8zvhT=ArXNeQ#hUHD%PJ>ZM4p1Ir3OXJmVZ&>>5LlK?S=ZrgqfP>d(W}Wh)SMt};ci=}(K2&`_W77Xf+U%=tBhnoKpeJi%7oNKc}>M$ z)>F(<+Y)jh)eCww%`a}N!O+tw$S3Cry{P@E9m_QwY6`duxI5q8W6;9GuT5o z;{Fo4J^gTfceuUjy9aY0PmK+QxA*&9 zj7wEFdW*D99>lsd@X44;4{Yt(KFIP}qS5rP^6OnfOSFw;0^8$4E9dy?2fp zCNRS4F}BA8t*K3I+F#Yr+}Yvef{!yS7V)NLj@8@guy1wIc?+5aJ2L8c6{ztJ^XZDC z{bo?n9ca!G*ldE%s#5c=^SAlJnQx8Wlw9w)nvif!-CuqqYVJ!3y3K9ynOb zH~+Hb#M=WeUk_-1WM6-0n<_Ba@lj2~AakMb^OE~;NH0G7b3tEwT1%n()owGvc*agV zH>+>T*IMiSdHT*=gY*!dULCH>e|fo{M(xqc(}kO^pgnY2UazRqG*OH76*mrF+}ORo zaXQxhrr%++g$vF$S>;D%uD4dl?2FG)>;G8W8+wUB_RS#J*Jrt;!D+F)dwCy>yNQU2rKJ9B}r3kd;F7)gae}JB)p_U<>O# zO-jsZRv+SOR({tqn56f$6E6JNN*eR-qTUz-aGHdzvKS#gY+`hlYL}SZGek zU7^X-Qmffv-)!d>mmgTnkDRG_tkmr7g=pSG?GL)g@3kgZCKb;qk4Y}l-tDp$+Y_P| z4jk{DTfT*dICdgp{iNj1<3jsbd@3jK>O5nj%sK$)pWm9%QBa5{#$oQ>Z8S>% zQ1VzF=QO;lF8%mE*WQv>tJ5j~B+KZK#;LR4M#7PSB@IT4ELxqC$SaQ)uRL?Q%w{jH k=aS$c)MUyhO$3w>%3o!?IC55y^7#Ik#`Au+ z@UheNqRH|3`T76<|1pf`A^8LV00000EC2ui05SkF000F4u*peVU}C(@yZ3{@1XXD^ z08xBw%N7K1mZ@vsT|7&Hf&VuH>9hbEZwpi4$aD=S0AF+3F~}was+L25ZoiLf7Od?y zR@1`ba9E(51q*e6aM&FP&GbS&I06C!0S*UL7*hjwXa#n9Oc{F)2^|T4h*Ju9QX2+! z3S>V3k{^`-pf{Nan;e}EpQkONlPsmMECddwE}~<$oSrtRtFW~n{Y0)r}A3Kt+D5|PzJ1OPh?K)~(* literal 405 zcmV;G0c!q7Nk%w1VKM+R0J8u9^ZELJ+~uw4?$hz~=l1sw!_t@G={?NZ0Kd;}+2c~t z-7v}50Km}s`T76<{{X$uEC2ui05SkF000F4u*pdq5kakjp8p_-6pIoFM5V3`U>spA z&)#7G>}nKr?|TJ9ZZd%Vj=jSmH{c16oa1f**9fP_ zzyzX%BcuK)qLzcE3h0?N}2 z36~4CMIQ>-vH{;73b7ALZqpvLhr|T}mD21$&JNKC0rv~_AqtHE+;foNQx{a6R$Up< z#TcbzYWj6y)aVhE5@UFI5@Vu|r9lcxKhf)g!rze;7EOZq(nckXGNoLCSTkXrOb=xy zr1Zy7fxwxu*@a9X0%Y|En1dRYYu;!9S=B+2q45pV#~ z%Yw~ehb?ud zD9_b+tI#;jUa@?4sE&EXIpSK3D1wTY4ngcw#3}A6o({Gv^-|AJP+GP^fv|9Dw5@SK zK+C@+8vqD;MXO;)O#qJNnaQVs16=lm z7&wNYfC&LE006LfZ3)g6Z4i`v&}Qk4qbmd<7!@SsJTFjFEa1q5;TM-TD1k-9>I)|w z`GTmr=%oQw7J|U#c%)8?fd)lWNF&gX$R(#Y>nhe!WJ<+h?#>+x~&Qe|WCf^E~h8{dzrq0lv;_1Pq7)sUXM( z7{!Eyk$nV8fzG?St7QVASfnH;h>}yK9Lmh)>lAWoB8L*q3~>mNd5cm~{WImFb(x`& z!c4J{l}K@SBfF~E>NHuJNGTwz(O3t#ze1=id+{F9=0|#BseHAz~9gJOCN79PY-uDj;jls z<-BG!bCnar(Sc60w_CYlId$36FKm}kY{=G&tt>4TnVXS_1pGqN1t#<78RLww7&HoL zh%kV|bT9D{0qJ3Ld;0Z=AU}$N9#u-?-eFZ}ECjScp7NkuS!^s1;kp+e)&a9X_NjnVE$JmBl=g zHvwH$zOO_Yj27W+50>sd)KqfVs^kXRt`akr7^_D0AluF&fLZr?t*s*B`{lSs--$nIMN825L}@; zzN?pCKAuY!=C)2!kbcmdX4u9&SXv%GvEf{}JYV8}&$AP5Y=u`r4x{pMuf-KH)Hc3% z;VK$wjLj{5tG&RZhIs^jxRPYPZqQIWzBn`r4|zro81$0x*-1Ty$h4fJIo9ot=c>#} z>cR!^Xa40y3mFyRo{+Zu;tlw85wkLAj^Dl$Ss9Sh#@K$fqX1!slSRYK#;T20I*DQ? zV(^H2ZIA`7%@a;-q27$Ijhuj-W?Rk1OKAfgZ7`($$1>rLjE;U0t1|@fDxO%5X$uHH z6o~~G%SbiWQMALMHZKolZ-TzBV-Yt2dUOnOepd+xJ8^wrhHywFSC1Z)Q3L{vgdmnk zGfQdwjbx@c(M0!L)o~1?sQiY`m%gUig z1RN0Lbtc#&01jL%YHTZ#HWHlnP&hEm9TsLD^s8CbO@o|02*~9zMg`xzK&emwFc>k2 u02PJ+kmwjj0VWm-G|tOlOym^_jyIb#9egE@z$ql_l*R{4ii1_;Z#mZY2 zw?C}i^CN=!em%SLcJ9A_ ze~vw?-f}7J4f-EO&KWqqA}QGA*ka(po$A z&tc=8Cd_r=T;jg<3wI=sNMukJG-1`AM&}DN~#o(+3v5Cr9}2FDmzw(JKitP-1r%VD?LyvT)I1 zwX^dSN){D9=5(~4rW0gvxRb?AQnZg*DZ{mAsx}L2182apZ88GfE2^6oH2BREtX0}w z*mUs(6Ni|n?Jt1`N3)tZ6hyVIu9!SGbnb-N)x zg&Z%~EH-o;-?1}NT(&~WF-uil*T{z@VB5RN2b)?9f{a$&P1@U(>rk-a1mom2UFJ+> zcTO~3XH_&aO3L}x$;{IfusY8qYIXJvKd}#UeRqEp;M-C9x$ej<&q+6Sw_9t?v;L{i zJZ&PQ!6~J$HpQp>Lj|Va6%oq6YwLSJY~Ey6N8VHRyPhp+u5wf32>kKk-{Hi}U%R9g z8c(|ad&nkn(2MyP&voYdH5QJI)thG)xHPpmC>(Ne*~6fy)}|1oV8G>a!I8mKMS_FD F8UR@Vd*lEB diff --git a/musicoin.png b/musicoin.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6ec90d1f05153ee9340454adbaee15e8e8fe3f GIT binary patch literal 2251 zcmV;+2sHPJP)xBO3`QXtu*%ZyNDV%D$bF=i zA)FPhA<~E7?}*dYIENe2MGN@WKMSsN?&yve0GQXFh3ytgRWb@ z=Cn+h8V?;?K_Ec>`UV8o$kJV^)KV80KM%5m>j|UmDz7)O&z|4P4S@U&SK&hDth{z6vrWb!l zXIV7E^6q^m1x2&acLCvx*objMH1sF1AT&u+I?A7^n z^$0)_!xxH46p;Fi0Wxm1pm&y2zn6utN52F=57qtNGrIoyCG?h3fr`1*9-R z-*qH-9o2}9oA0n$#gL62A?|4k%1c3uAnuC7mKlI#5%fJLgFnD^bZq?5Am02ZVaCAu zG=znIu81W@0OIUEk-kEY5r3@L!b~DrmxMb(cPvAS5OfrEf@3}Z^e#_zH|E|CwN7N= z%mR{E(8cT4qbqqd7-iGDs##(NLxj6EQqYCahSex>7B#)Ql_KxAfF$0faV_@{llq_D z?bbB=EFf7#Iyq#eYtP4mVgbn^=p*~$1w9KWRDV?Tv?||R>|4-nr1#>n zk_Fn;@AfJZ^jKgrFl(qnmTEyCgjHKZvIx5PaL%&@3&_9(T^8CbLk1}5VrYB$xJ=I& zniR593i{~LO0c8SfS4%g)n-VZ3O&#AAPa~BL0`8FDUYD{v))&uZ7bVd@AOs%A|&;y2%xnoKz=&HP z6=!1Cwqu5%>jk6-#DVvU|LnLlHs=F8Mgqdt(qbiG5+fkE++pmle?@g;`{>qPjv2a< z@GPC|d2?y~0V}bfYXOAq$`i#3Y?*|ulJI~Gntc(@@wMu7ccmct47cww(ZinPlsAZxS5QLS9%i-{}@R8El zwxsq-*#%u0AjqafFgETs^xmPe#||pMkm6e>*y~UTRo?RV+MQ8FL01BZY;}jqN5G;5 zy&5xwGC&p!{X}tf$Le6_uBDG1l;0Ks$ePlx7?dLl+C)IJtpSiZ<>IQF9e4)NFX+hd zRu`%O$Q%G!DfADBfDK*^?MkyCZ<>eVT;&mgsTp)=%u}d>WFL`R@ECzin}vx7Np`5!0hE*97ON>JL?^C zkL1a~00g!P$7lKWBH8?Y`rTf2v||$k|7QG3&M0L1A;$GUeX!h})1cW|Vyy4YgTfR2(D6;-Oo5(IXFDgplg}8^jL6|xk;CJDsE9*|OS1?9 z^#-1vtxlTj_dO9AqV~87gc!_`uuZ^r6#nrnM4^dU(nZt>ws~BIc)|{lQhVSq>ju}m z#oI{Er&z%Vrd2npB;KOUQZO1JhHyZ}iOwUBurRKt3Fs210SI*kI=7gIuU=@9S>VVc z*(q)6S&{^jBrWc)LU~RMvj97y0MW~m;kM*s^Y{fCa&T_W-|V$WFbTQicFk(wbw_(Eo|XnmYMn}W~Mf{}?K0$ZB&x6iG=6YGp-);IOF za*==0L6rX1?;)Gz6?n6sH}}O5fi2^tdj$1G3j}G#rLnIVSq?jgQBv=hbfsEGNw5`T6x)^4G;-HQ#?Z(=KzgWfJM0b*SPcH_%>g|rquoy ZU;ykN%BC73ab5rb002ovPDHLkV1n_}E@A)x literal 0 HcmV?d00001 diff --git a/nanos_app_akroma.gif b/nanos_app_akroma.gif index fcb4e8820d64f4acf1d85ab38a2650defc4d9d9a..1ea56c56153600dd1bbcbd1537e250302c77d88c 100644 GIT binary patch delta 222 zcmdnV^^Rjh2;<}i#(CzxzE+-j#U+V($*G<$wn`Pb1$vp8DORo)E-oe}&gPEhPNs&2 zt`-)SPG**_uFft-rl!WGjz*K;G07-E6|EyGF<{z-nxq$-`@+B&v5CM%;JyQ6r8$iw$|0MSOx}b0Nrms A`Tzg` delta 418 zcmaFIv6E{<2%~aJvaM1^NlAf~zJ5VzQI1}IQM!IgvVLk#YHn&?NwL16p5bI~#^v=^ z&PAz-C8;hzY^!8sU}&LhV6JOq9%5)_WoTh#VySCjVr5{Uq)?GtVC9>il9^VCrqm+D zz|hLb(#qIU*T?{&G_@o#C9x!tkYZ7Vlw_;4{G!~%5?iIr+{E-${q)SV$!{5D6x6v-9O7C~? zS5nAKu~iB;^)>JRtPXT0NVp4u-iLDaQ zr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UOYH)E#WkITb zP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)yucqiS6q^qmz?V9Vygr+M=vuo#mdOQ%-Gb_($Ue}(bdq<)xyHk$;{H#)!D_! z)YRD2(Fms3B|o_|H#M&WrZ)wl*9oUyP=d%U0NU)5T9jFqn&MWJpQ`}&xK$=@w^-mb z52`l>w_7Z6>eUB2MjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx z&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYl zOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_?b zGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)m9c=D}yxvFq)13 literal 68 zcmZ?wbh9u|6krfwXkcUjg8%>j>wsvG2m_OHPyfo(>=!On8=jF|*?RTC(#nO#bt>vp TA8uW>rbBH8XW!jg5e91jx8xWi diff --git a/nanos_app_musicoin.gif b/nanos_app_musicoin.gif index 94b61958030f7867d28bb94f1e92d15c467ec5cc..34778b215fb8c079973c996461d0797dbf1d23f8 100644 GIT binary patch delta 635 zcmaKnKTE?v7{*g^a1jcEpn{xnQPA97HE9xUrA<=l5YW=W#UUnF8f|j%a%!Ebqfn84 z2|;l4WB3(x6F2cA)TCNPq`u?J^Lze0jlWDxZC5L*=46Gea3Q4E@ArF?$HkII4+z+^ zcYr||0kWj5x_BLdye44+K*ah)vET z9l|h{oYYrxX#m?!1hIsm_#?FK|D{3jt&Vw(H2za}5RB{R5rH)l(-Y>BM8BA3MY_R= z!zrs%+A4^jLwA~#)3`|^U>NBz6)f3~>xb!cc|h5=UJYaJgf6L?1u^lFeBaZpvZ)$n zSuN$u8pf8YYGp;UEW_;NWO+?4<%Y0H-IIWXd@q*%J`H>Cv)Rq9cI3E6gaZ kWu`Op!q`mr=I-%Lc)r}N0ptGq>~McUZM&b_zE7MJZ`k zK`w3}W`$KnZb5EpNur&Cf`W~GML}Y6c4~=2YF>)1Qu$^BW-&(X1_lO(|Ns9pDfINO lJbjm8ZsWzkf(^UOGmcbVxmN0#X}5UGrui(#ivk!JtO2(WE^hz; diff --git a/nanos_app_pirl.gif b/nanos_app_pirl.gif index 6cb1f5b71b246f08986aa216e34cf189e66239d8..852d4d5e7353e772ea52a67e3a29cd6b533e16ef 100644 GIT binary patch literal 1131 zcmZ?wbhEHb6krfwXkY+=|Ns9h{^ySH4N!1NEJ*~?Hue<-iOJciB??KY>6v-9O7C~? zS5nAKu~iB;^)>JRtPXT0NVp4u-iLDaQ zr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UOYH)E#WkITb zP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)yucqiS6q^qmz?V9Vygr+M=vuo#mdCV$koWg!ral^$;r^r)xyHk$;{H#)!D_! z)YRD2(Fms3B|o_|H#M&WrZ)wl*8-w_D6`>eUB2MjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx z&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYl zOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_?b zGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)tum7T!_3zsz-hdQ-oo*%X%JMnMb=)&LKs Bj`IKj delta 9 QcmaFO;WTP)ntCNh)R|PFLo{z^KZ> z&0<6c=B6QYm0X30AAp0{n$7oAu_Y>{sue^)6yT`m~2&V28_*Ka#;`_URad%4dA=HlQsOIU@} zIAUPn`^+k(HnPi-)v?SGgDJ|g%z0#mY;eTDu8J|rMkt6J^;fuIJb(27em=Ma2Z!5S zQC5O8u3&|%a>Tg(=xaE7(}8<`e#aSQH4LQ66~hn4DAm4cuPm8|oH2s&`G-Hi;==0C zI756&d;$NUANhqm|AqR)IEDE(*mPH{3Vo?Z!SQLUF z7KI>)MM($*FGA%)EQ&@De+903Ar_@SX0Cp7x~8%nGE+DX7v8%9PhR{E|NQ$j)HdiUeocprWYKPT3LS6mZb zTM$4;E@D;4;=;us!?{}O*)AQVZwat{LxxVCh^ z;IBiPlt6S>3I`0|zz1mnvCxIW1fyr*gVcdwsG=~!=oyd(Q9)sb(GMaIKx~?V!VshB zA3_=2T)Y8B|Xqc8V;C+vvz2!4S4k*ZPa6d#Bg#*XN&LSKv@ zgT+B$QI*0FV<_j&z)BHE`dzLl3^8_%ID={&3KNXbTstBADJZtX6@?MT&R}(5L_O;S z&qZ>9!C8hrO4!?k;}9aw`-(iiTOJR39c&~K>!LbB*L{)CI+0(nWpk%JwxTdbR!E>y za2L{^7_D!MWaLY`Px8Dh97~!um+BZW!AVAAL4;`AqUgbpxf~f|yR3ok3;RBM#`^SQ zMs?Cpp6aQj@*A(qX`7AlQ`_}vFs23x%)Tm|7LQph`Y=bMW>Z?atdK6umCOHSYv2X$ z1J=S;;HiKNz~IVrCC3%9sRE%DBmh%_{}0-&=3woDGbiklw*5c9>IkhMAvmsV6$5|} z02j$v1$CVWsep{=+Dft^Qc<=tp`^EE!{lSqTROU;N#j2O1^|Qi`Y|QSX50V(002ov JPDHLkV1l=!!_NQ! literal 0 HcmV?d00001